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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機 獨立鍵盤控制

          51單片機 獨立鍵盤控制

          作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏
          鍵盤部分原理圖:



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

          歷程里面設計到數(shù)碼管,這個參考前面的文章《51單片機 數(shù)碼顯示數(shù)字》。

          代碼如下: 注釋很詳細。

          //按鍵key1顯示數(shù)字加1,按鍵key2顯示數(shù)字減1,按鍵key3清零,按鍵key4數(shù)字每秒加1.
          #include //頭文件
          #define uint unsigned int //宏定義
          #define uchar unsigned char
          //按鍵標示聲明
          sbit key1=P3^4;
          sbit key2=P3^5;
          sbit key3=P3^6;
          sbit key4=P3^7;
          sbit duanxuan=P2^6;
          sbit weixuan=P2^7;

          uint number; //需要顯示的數(shù)字
          uint time_number; //T0計時器方式一計滿次數(shù)

          void delay(uint); //延時函數(shù)聲明
          void init(); //T0定時器中斷初始化函數(shù)聲明
          void display(uint); //顯示函數(shù)聲明
          void keyscan();//按鍵檢測函數(shù)聲明

          uchar code table[]={ //字符斷碼
          0x3f,0x06,0x5b,0x4f,
          0x66,0x6d,0x7d,0x07,
          0x7f,0x6f,0x77,0x7c,
          0x39,0x5e,0x79,0x71}; //C語言編碼定義

          void main() //主函數(shù)入口
          {
          init(); //T0定時器方式一中斷初始化
          while(1)
          {
          display(number); //顯示函數(shù)
          keyscan(); //鍵盤掃描函數(shù)
          }
          }
          //延時函數(shù)主體
          void delay(uint s)
          {
          uint i,j;
          for(i=s;i>0;i--)
          {
          for(j=110;j>0;j--)
          {

          }
          }
          }
          //定時器T0方式一中斷初始化函數(shù)主體
          void init()
          {
          TMOD=0x11; //TMOD賦值,確定T0/T1工作方式
          TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1計算初值
          TL0=(65536-46080)%6;
          EA=1; //總中斷打開
          ET0=1; //開T0/T1中斷
          //TR0=1; //TR0/TR1置位,啟動定時器(本程序當key4按下之后TR=1)
          }
          //顯示函數(shù)主體
          void display(uint number0)
          {
          uint no1,no2,no3,no4,no5;
          no1=number0/10000;
          no2=number0000/1000;
          no3=number000/100;
          no4=number00/10;
          no5=number0;
          //數(shù)碼管1顯示 ①送斷碼;②選擇要顯示數(shù)碼管
          duanxuan=1; //打開段選鎖存器
          P0=table[no1]; //送斷碼
          duanxuan=0; //關閉(鎖住)鎖存器
          P0=0xff; //必不可少的清屏
          weixuan=1; //打開位選鎖存器
          P0=0xfe; //選擇數(shù)碼管
          weixuan=0; //關閉鎖存器
          delay(2); //延時
          //數(shù)碼管2顯示
          duanxuan=1;
          P0=table[no2];
          duanxuan=0;
          P0=0xff;
          weixuan=1;
          P0=0xfd;
          weixuan=0;
          delay(2);
          //數(shù)碼管3顯示
          duanxuan=1;
          P0=table[no3];
          duanxuan=0;
          P0=0xff;
          weixuan=1;
          P0=0xfb;
          weixuan=0;
          delay(2);
          //數(shù)碼管4顯示
          duanxuan=1;
          P0=table[no4];
          duanxuan=0;
          P0=0xff;
          weixuan=1;
          P0=0xf7;
          weixuan=0;
          delay(2);
          //數(shù)碼管5顯示
          duanxuan=1;
          P0=table[no5];
          duanxuan=0;
          P0=0xff;
          weixuan=1;
          P0=0xef;
          weixuan=0;
          delay(2);
          }
          void keyscan() //按鍵檢測函數(shù)主體
          {
          if(key1==0) //檢測key1按下
          {
          delay(10); //延時10us
          if(key1==0)//檢測鍵盤依然是按下的
          {
          number++;//顯示數(shù)字加1
          if(number==10000)//如果記滿10000
          {
          number=0; //清零重新開始
          }
          while(!key1); //等待按鍵放下
          }
          }
          if(key2==0)
          {
          delay(10);
          if(key2==0)
          {
          number--;
          if(number==0)
          {
          number=10000;
          }
          while(!key2);
          }
          }
          if(key3==0)
          {
          delay(10);
          if(key3==0)
          {
          number=0;
          while(!key3);
          }
          }
          if(key4==0)
          {
          delay(10);
          if(key4==0)
          {
          while(!key4);
          TR0=~TR0;
          }
          }
          }
          //T0定時器方式一中斷服務函數(shù)主體
          void R0_Time_no1() interrupt 1
          {
          TH0=(65536-46080)/256;//預裝值
          TL0=(65536-56080)%6;
          time_number++; //記滿次數(shù)
          if(time_number==20) //20次為1s
          {
          time_number=0;
          number++;
          if(number==10000)
          {
          number=0;
          }
          }
          }

          以上,結束。



          評論


          技術專區(qū)

          關閉
          看屁屁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); })();