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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機長按鍵測試程序

          51單片機長按鍵測試程序

          作者: 時間:2016-11-18 來源:網(wǎng)絡 收藏
          #include
          #include
          /*
          程序功能: 本程序用于測試4X4矩陣鍵盤; 且具有長按測能力.
          當按下按鍵后,在LCD1602上顯示出按下的鍵號如:K1 K2.... K16;
          當按下一個按鍵 超過1S時間時,每250MS就返回一個鍵值;實現(xiàn)長按鍵的功能;
          同時把鍵值通過串口發(fā)送到口上顯示;
          程序說明:這是一種傳通的采用延時來進行按鍵掃描按鍵驅動與測試程序;這種方法在
          實際項目編程中是不使用的。 用在教學中 ,學生剛開始學習單片機時。
          注意:在此程序中只顯示了K4長按凳時情況。若要想對其它銨鍵長按處理,只需要增加
          相關的處理即可。
          */
          /*
          矩陣鍵盤引腳定義
          */
          sbit keyin4 = P2^7;
          sbit keyin3 = P2^6;
          sbit keyin2 = P2^5;
          sbit keyin1 = P2^4;
          sbit keyout1 = P2^3;
          sbit keyout2 = P2^2;
          sbit keyout3 = P2^1;
          sbit keyout4 = P2^0;
          //宏定義
          #define TH0_NUM 1000 //便于程序的移植;
          #define TL0_NUM 1000
          bit Flag1s,Flag250Ms,Flag2Ms; //時間到位標志
          //lcd1602顯示數(shù)組
          unsigned char keynum[]="keynum:k ";
          unsigned char keycount[3]="000";
          //鍵值查詢數(shù)組
          //k1,k2,k3,k4,k5,k6,k7,k8,
          unsigned char code keytabel[]={0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b,
          //k9,k10,k11,k12,k13,k14,k15,k16,
          0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e};
          /*
          外部函數(shù)聲明
          */
          extern void InitLcd1602();
          extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
          void ConfigUART(unsigned int baud);
          void DelayMs(unsigned int ms);
          unsigned char keyscan();
          void InitTimer0();
          /*
          主程序
          */
          void main()
          {
          unsigned char i,j,keytemp=0;
          InitTimer0();
          ConfigUART(9600);
          InitLcd1602();
          LcdShowStr(0,0,keynum);
          while(1)
          {
          keytemp=keyscan();
          if(keytemp!=0) //判斷是否有按鍵按下;
          {
          for(i=0;i<16;i++) //當有按鍵按下時,查表獲取鍵值;
          {
          if(keytemp==keytabel[i])
          break;
          }
          keynum[8]=(i+1)/10+0x30;
          keynum[9]=(i+1)%10+0x30;
          TI=1;
          SBUF=keytemp;
          while(TI!=1);
          TI=0;
          LcdShowStr(0,0,keynum);
          if(keytemp==0x77) //用于檢測長按向上鍵K4時,在LCD1602第二行顯示
          { //每250MS加1;
          j++;
          if(j>254)
          j=0;
          keycount[0] = j/100%10+0x30;
          keycount[1] = j/10%10+0x30;
          keycount[2] = j%10+0x30;
          TI=1; //用于串口也每隔250MS打印加1;
          printf("key is long pushing %s n",keycount);
          while(TI!=1);
          TI=0;
          }
          LcdShowStr(0,1,keycount);
          }
          }
          }
          /*
          函數(shù)功能:N毫秒延時
          */
          void DelayMs(unsigned int ms)
          {
          unsigned int i,j;
          for(i=0;i
          for(j=0;j<113;j++);
          }
          /*
          函數(shù)功能:矩陣鍵盤掃描(帶長按鍵檢測功能)
          */
          unsigned char keyscan()
          {
          static unsigned char num1,temp;
          P2 = 0xf0;
          num1=P2;
          if(num1!=0xf0)
          {
          DelayMs(50);
          num1=P2;
          if(num1!=0xf0)
          {
          TR0=1; //打開定時器
          temp=num1;//
          P2 = 0x0f;
          DelayMs(1);
          num1=P2;
          temp =temp|num1;
          do
          {
          P2 = 0xf0;
          num1=P2;
          if(Flag1s == 1) //判斷按下的鍵是否1S沒松手;
          {
          if(Flag250Ms==1) //若1S沒松手,說明長按了某鍵 ;則每250MS返回
          { //一次鍵值;這樣就實現(xiàn)了長按某鍵的功能
          Flag250Ms=0;
          return temp;
          }
          }
          }
          while(num1!=0xf0);
          }
          else
          {
          TR0=0; //若沒有按下,則關閉定時器
          Flag1s=0;
          Flag250Ms=0;
          temp=0;
          }
          }
          else
          {
          TR0=0;
          Flag1s=0;
          Flag250Ms=0;
          temp = 0;
          }
          TR0=0; //松手時,也要關閉定時器,并且清0幾個標志位 ;
          Flag1s=0;
          Flag250Ms=0;
          return temp;
          }
          /*
          函數(shù)功能:定時器0初始化,設定每1MS中斷一次
          */
          void InitTimer0()
          {
          TMOD &=0xf0; //這種操作模式,不會破壞寄存器的其它設置;
          TMOD |=0x01; //方式1,16位定時器
          TH0/=(65536-TH0_NUM)/256;
          TL0=(65536-TL0_NUM)%256;
          EA=1;
          ET0=1;
          TR0=0;
          }
          /*
          函數(shù)功能:定時器0中斷服務程序
          */
          void Timer0_Interrupt() interrupt 1
          {
          static unsigned char i,j,k;
          TH0=(65536-TH0_NUM)/256;
          TL0=(65536-TL0_NUM)%256;
          i++;j++;
          if(i>2)
          {
          i=0;
          Flag2Ms=1;
          }
          if(j==250)
          {
          j=0;
          Flag250Ms=1;
          k++;
          if(k==4)
          {
          k=0;
          Flag1s=1;
          }
          }
          }


          關鍵詞: 51單片機長按

          評論


          技術專區(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); })();