<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 矩陣鍵盤加電子時(shí)鐘(c51)

          矩陣鍵盤加電子時(shí)鐘(c51)

          作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/201611/315829.htm

          //矩陣鍵盤掃描和可調(diào)的電子時(shí)鐘

          //采用翻轉(zhuǎn)識(shí)別法(相對(duì)代碼少一些)處理矩陣鍵盤,

          //在按下15號(hào)鍵的時(shí)候處理電子時(shí)鐘,然后可以啟動(dòng)12號(hào)鍵

          //用來調(diào)節(jié)時(shí)間

          #include

          #define uchar unsigned char //類型重定義

          #define uint unsigned int

          uchar key=0;

          uchar count=0;

          int second=40,minute=59,hour=23;

          int second_shi=0,second_ge=0,minute_shi=0,minute_ge=0,hour_shi=0,hour_ge=0;

          uchar flag=0;//定義標(biāo)志位(判斷15號(hào)鍵是不是按下)

          uchar movePlace;//調(diào)節(jié)時(shí)鐘時(shí)的定位位置計(jì)數(shù)

          //以下是定義6個(gè)數(shù)碼管是否加上小數(shù)點(diǎn)

          uchar point0=0;

          uchar point1=0;

          uchar point2=0x80;

          uchar point3=0;

          uchar point4=0x80;

          uchar point5=0;

          //共陰數(shù)碼管編碼如下(0-15)

          uchar code table[]={

          0x3f,0x06,0x5b,0x4f,

          0x66,0x6d,0x7d,0x07,

          0x7f,0x6f,0x77,0x7c,

          0x39,0x5e,0x79,0x71};

          //位選編碼(選中第0-7位數(shù)碼管)

          uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

          //函數(shù)聲明

          void display(uchar Duan_value);//顯示按鍵值函數(shù)

          void delay(uchar t);//延時(shí)1ms函數(shù)

          void key_scan();//按鍵掃描函數(shù)

          void display_time();//顯示電子時(shí)鐘函數(shù)

          void init();//寄存器初始化函數(shù)

          void main()

          {

          init();//寄存器初始化

          while(1)

          {

          key_scan();//按鍵掃描

          if(flag==1)//15號(hào)鍵按下,處理電子時(shí)鐘

          {

          if(movePlace==1)

          {//按鍵定位到秒值位置,對(duì)應(yīng)的秒值小數(shù)點(diǎn)亮

          point0=0x80;

          point1=0x80;

          point2=0;

          point3=0;

          point4=0;

          point5=0;

          }

          else if(movePlace==2)

          {//按鍵定位到秒值位置,對(duì)應(yīng)的分值小數(shù)點(diǎn)亮

          point0=0;

          point1=0;

          point2=0x80;

          point3=0x80;

          point4=0;

          point5=0;

          }

          else if(movePlace==3)

          {//按鍵定位到秒值位置,對(duì)應(yīng)的小時(shí)小數(shù)點(diǎn)亮

          point0=0;

          point1=0;

          point2=0;

          point3=0;

          point4=0x80;

          point5=0x80;

          }

          else if(movePlace==0)

          {//按鍵定位歸零,關(guān)閉時(shí)鐘顯示,回復(fù)默認(rèn)值

          point0=0;//小時(shí)與分中間加小數(shù)點(diǎn),分與秒之間加小數(shù)點(diǎn)

          point1=0;

          point2=0x80;

          point3=0;

          point4=0x80;

          point5=0;

          }

          display_time();//顯示時(shí)鐘值

          }

          else//15號(hào)鍵沒有按下

          {

          display(key);//最后一位顯示按鍵值

          }

          }

          }

          //定時(shí)器初始化函數(shù)

          void init()

          {

          TMOD=0x01;//設(shè)定定時(shí)器0工作在方式1:16位定時(shí)器

          TH0=(65536-50000)/256; //每50ms中斷1次

          TL0=(65536-50000)%256;

          EA=1;//開啟總中斷

          ET0=1;//開啟定時(shí)器中斷

          TR0=1;//開啟定時(shí)器

          }

          //延時(shí)1ms函數(shù)

          void delay(uchar t)

          {

          uchar x,y;

          for(x=t;t>0;t--)

          for(y=111;y>0;y--);

          }

          //按鍵數(shù)碼管顯示函數(shù)

          void display(uchar value)

          {

          P2=table[value];

          P3=table1[5];//只顯示最后一位

          delay(10);

          }

          //按鍵掃描函數(shù)

          void key_scan()

          {

          uchar m0,m1;

          uchar temp;

          P1=0xf0;//這樣設(shè)置是為了能使低四位將高四位拉低,釋放時(shí)自動(dòng)拉高高四位

          temp=P1;

          if(temp!=0xf0)

          {

          delay(10);//延時(shí),去除抖動(dòng)

          if(temp!=0xf0)

          {

          m0=temp;//獲得按鍵的列號(hào)(對(duì)應(yīng)的就是高4位)

          P1=0x0f;

          temp=P1;

          if(temp!=0x0f)

          {

          m1=temp;//獲得按鍵的行號(hào)(對(duì)應(yīng)的就是低4位)

          temp=m0|m1;//組合成最終的按鍵好

          }

          switch(temp)

          {

          case 0xee:key=0;break;//按鍵對(duì)應(yīng)的碼表

          case 0xde:key=1;break;

          case 0xbe:key=2;break;

          case 0x7e:key=3;break;

          case 0xed:key=4;break;

          case 0xdd:key=5;break;

          case 0xbd:key=6;break;

          case 0x7d:key=7;break;

          case 0xeb:key=8;break;

          case 0xdb:key=9;break;

          case 0xbb:key=10;break;

          case 0x7b:key=11;break;

          case 0xe7:key=12;

          if(flag==1)//15號(hào)鍵按下后,12號(hào)鍵按下,開始設(shè)置時(shí)鐘

          {

          TR0=0;//設(shè)置時(shí),關(guān)閉定時(shí)器

          movePlace++;//對(duì)應(yīng)的位置標(biāo)量+1

          if(movePlace==4)//如果按下了4下,表示取消

          {

          TR0=1;//重新開啟定時(shí)器

          movePlace=0;

          flag=0;//關(guān)閉時(shí)鐘顯示,重新打開按鍵顯示

          }

          }

          break;

          case 0xd7:key=13;

          if(flag==1)//若開始設(shè)置時(shí)鐘,13鍵表示向上+1按鍵

          {

          if(movePlace==1) //秒值設(shè)置

          {

          second++;

          if(second==60)

          second=0;

          }

          else if(movePlace==2) //分值設(shè)置

          {

          minute++;

          if(minute==60)

          minute=0;

          }

          else if(movePlace==3)//小時(shí)設(shè)置

          {

          hour++;

          if(hour==24)

          hour=0;

          }

          }

          break;

          case 0xb7:key=14;

          if(flag==1)//若開始設(shè)置時(shí)鐘,14鍵表示向上-1按鍵

          {

          if(movePlace==1)//秒值設(shè)置

          {

          second--;

          if(second==-1)

          second=59;

          }

          else if(movePlace==2)//分值設(shè)置

          {

          minute--;

          if(minute==-1)

          minute=59;

          }

          else if(movePlace==3)//小時(shí)設(shè)置

          {

          hour--;

          if(hour==-1)

          hour=23;

          }

          }

          break;

          case 0x77:key=15;

          flag=1;//當(dāng)15號(hào)鍵按下去之后,把標(biāo)志位置1,表示顯示時(shí)鐘

          break;

          }

          do{

          temp=P1;//消除按起抖動(dòng)

          temp&=0X0f;

          }while(temp!=0x0f);

          }

          }

          }

          //顯示電子時(shí)鐘函數(shù)

          void display_time()

          {

          second_shi=second/10; //分別得到時(shí),分,秒值的個(gè)位,十位

          second_ge=second%10;

          minute_shi=minute/10;

          minute_ge=minute%10;

          hour_shi=hour/10;

          hour_ge=hour%10;

          P3=0xff;//消影處理顯示秒值的個(gè)位

          P2=table[second_ge]|point0; //是否顯示小數(shù)點(diǎn)

          P3=table1[5];

          delay(3);

          P3=0xff;//顯示秒值的十位

          P2=table[second_shi]|point1;

          P3=table1[4];

          delay(3);

          P3=0xff;//顯示分值的個(gè)位

          P2=table[minute_ge]|point2;

          P3=table1[3];

          delay(3);

          P3=0xff;//顯示分值的十位

          P2=table[minute_shi]|point3;

          P3=table1[2];

          delay(3);

          P3=0xff;//顯示小時(shí)的個(gè)位

          P2=table[hour_ge]|point4;

          P3=table1[1];

          delay(3);

          P3=0xff;//顯示小時(shí)的十位

          P2=table[hour_shi]|point5;

          P3=table1[0];

          delay(3);

          }

          //定時(shí)器0中斷函數(shù)

          void time0() interrupt 1using 0

          {

          TH0=(65536-50000)/256;

          TL0=(65536-50000)%256;

          count++;

          if(count==20)

          {

          count=0;

          second++; //定時(shí)1s鐘,秒值加1

          if(second==60)

          {

          second=0;

          minute++;//分鐘加1

          if(minute==60)

          {

          minute=0;

          hour++;//小時(shí)加1

          if(hour==24)

          {

          hour=0;

          }

          }

          }

          }

          }



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();