久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2957|回復: 2
打印 上一主題 下一主題
收起左側

八位數碼管電子時鐘 protues模擬

[復制鏈接]
跳轉到指定樓層
樓主
ID:853394 發表于 2020-12-2 21:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
八位數碼管電子時鐘
代碼
#include <reg51.h>

sbit key1 = P1^0;
bit flag1s = 0;
bit KeySta = 1;
unsigned char hour = 8;
unsigned char minute = 31;
unsigned char second = 59;
unsigned char mode = 0;
void FreshTime();
void TimeInit();
void IntInit();
void InitLedBuff();
void keyscan();

unsigned char code LedChar[] = {  //共陰數碼管顯示字符轉換表
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
unsigned char LedBuff[8] = {  //數碼管顯示緩沖區
    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

void main()
{

    TimeInit();
    IntInit();
    InitLedBuff();
  while(1)//顯示內容處理
  {

   if(flag1s&&!mode) //時間顯示模式
    {
      flag1s = 0;
                  FreshTime();
    }
     else if(mode == 1)  //校準分鐘
    {
      LedBuff[0] = 17;
      LedBuff[1] = 17;
      LedBuff[4] = 17;
      LedBuff[5] = 17;//不顯示
          LedBuff[6] = 17;
      LedBuff[7] = 17;
      LedBuff[2] = minute/10;
      LedBuff[3] = minute%10;
    }
    else if(mode == 2)  //校準小時
    {
      LedBuff[2] = 17;
      LedBuff[3] = 17;
      LedBuff[4] = 17;
      LedBuff[5] = 17;//不顯示
           LedBuff[6] = 17;
      LedBuff[7] = 17;
      LedBuff[0] = hour/10;
      LedBuff[1] = hour%10;
    }
    else if(mode == 3)  //校準完成重新顯示
    {
      InitLedBuff();
      mode = 0;
    }
    keyscan();
  }
}

void InitLedBuff()//初始化時間到顯示緩沖區
{
  LedBuff[0] = hour/10;
  LedBuff[1] = hour%10;
  LedBuff[2] = minute/10;
  LedBuff[3] = minute%10;
  LedBuff[4] = second/10;
  LedBuff[5] = second%10;
}
void FreshTime()//刷新時間到顯示緩沖區
{
  second++;
  if(second == 60)//進位
  {
    second = 0;
    minute++;

    if(minute==60)//進位
    {
      minute=0;
      LedBuff[2] = minute/10;
      LedBuff[3] = minute%10;
      hour++;
      if(hour == 24)
        hour = 0;
      LedBuff[0] = hour/10;
      LedBuff[1] = hour%10;
    }  
  }
  LedBuff[4] = second/10;
  LedBuff[5] = second%10;
}

void TimeInit()//定時器初始化
{
  TMOD = 0X11;    //設置定時器為模式1
  TL0 = 0xB0;
  TH0 = 0x3C;     //定時初值 50ms
  TL1 = 0x18;                //
TH1 = 0xFC;                //定時初值 1ms
  TR0 = 1;    //定時器0開始計時
  TR1 = 1;    //定時器1開始計時
  ET1 = 1;    //使能定時器1
  ET0 = 1;    //使能定時器0
  PT0 = 1;    //提高計時準確性,提高定時器0中斷優先級
  EA = 1;     //打開總中斷
}
void IntInit()//外部中斷初始化
{
  IT0 = 1;     //下降沿觸發
  EX0 = 1;    //使能外部中斷0
}

void keyscan() //按鍵掃描及處理
{
  static bit backup = 1;
  if (KeySta != backup)  //當前值與前次值不相等說明此時按鍵有動作
  {
    if (backup == 0)   //如果前次值為0,則說明當前是彈起動作
    {
      if(mode == 1)   //校準分鐘時,分鐘加一
      {
        minute++;
        if(minute==60)
          minute = 0;
      }
      else if(mode == 2)    //校準小時,小時加一
      {
        hour++;
        if(hour==24)
          hour = 0;
      }
    }
    backup = KeySta;   //更新備份為當前值,以備進行下次比較
  }
}
void Int0() interrupt 0
{
  mode++;
  if(mode == 4)
  {
    mode = 0;
  }
}
void Ledfresh() //數碼管顯示刷新
{
  static unsigned char i = 0;
  switch(i)
  {
    case 0 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[0]];i++;break;
    case 1 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[1]];i++;break;
    case 2 : P2 = ~(0x01<<i);P0 = 0x40;i++;break;//時分間隔線
    case 3 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[2]];i++;break;
    case 4 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[3]];i++;break;
    case 5 : P2 = ~(0x01<<i);P0 = 0x40;i++;break;//分秒間隔線
    case 6 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[4]];i++;break;
    case 7 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[5]];i=0;break;
  }
}
void Time0() interrupt 1 // 50ms
{
  static unsigned char n = 0;
  TL0 = 0xB0;
  TH0 = 0x3C;
  n++;
  if(n==20)
  {
    n=0;
    flag1s = 1;//1s標志位
  }
}

void Time1() interrupt 3  // 1ms
{
  static unsigned char keybuff = 0xff;
  TL1 = 0x18;                //
        TH1 = 0xFC;                //定時初值 1ms
  Ledfresh();
  keybuff = (keybuff<<1)|key1;
  if (keybuff == 0x00)
  {   //連續8次掃描值都為0,即16ms內都只檢測到按下狀態時,可認為按鍵已按下
      KeySta = 0;
  }
  else if (keybuff == 0xFF)
  {   //連續8次掃描值都為1,即16ms內都只檢測到彈起狀態時,可認為按鍵已彈起
      KeySta = 1;
  }
  else
  {}  //其它情況則說明按鍵狀態尚未穩定,則不對KeySta變量值進行更新
}


八位數碼管電子時鐘.zip

18.14 KB, 下載次數: 64, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:118735 發表于 2022-10-8 23:59 | 只看該作者
程序寫的非常不錯的
回復

使用道具 舉報

板凳
ID:894868 發表于 2023-2-10 15:42 | 只看該作者
我是來拿程序看看的··謝謝分享···
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜免费福利电影 | 国产性网| 在线毛片网 | 国产清纯白嫩初高生在线播放视频 | 夜夜骚视频| 一级特黄视频 | 成年人在线视频 | 久久一区精品 | 性色av一区二区三区 | 国产日韩精品久久 | 国产精品久久久久久福利一牛影视 | 欧美精品一二三 | 综合色播 | 日本不卡一区二区 | 操久久 | 国产激情福利 | 国产综合一区二区 | 91精品国模一区二区三区 | 精品久久国产老人久久综合 | 亚州综合一区 | 亚洲成人精品国产 | 天堂久久av | 国产区一区二区三区 | 国产大学生情侣呻吟视频 | 国产日韩欧美 | 国产精品亚洲一区 | 中文字幕第二区 | 色网在线播放 | 国产美女视频黄 | 亚洲高清在线观看 | 在线区| 999免费视频 | 九九九久久国产免费 | 亚洲网站在线观看 | 国产美女在线观看 | 一级毛片视频在线观看 | 一区二区av | 一区二区三区国产精品 | 日韩欧美中文在线 | 91伊人网 | 欧美一区视频 |