標(biāo)題: 矩陣鍵盤控制流水燈(stc89c52rc單片機(jī)) [打印本頁]

作者: hjr999    時(shí)間: 2018-8-28 20:46
標(biāo)題: 矩陣鍵盤控制流水燈(stc89c52rc單片機(jī))
鍵盤控制流水燈.rar (25.65 KB, 下載次數(shù): 38)


剛開始學(xué)單片機(jī),寫了個(gè)小程序。用p0操作流水燈,用p2讀取鍵盤還不太熟悉,如有謬誤麻煩指正,跟我一樣的新手可以參考一下
  1. #include <reg52.h>

  2. /*
  3.         R1C1\C2\C3\C4==>LED1\2\3\4
  4.         R2C1\C2\C3\C4==>LED5\6\7\8
  5.         P2==>鍵盤
  6.         P0==>流水燈
  7. */

  8. //functions
  9. void delayms(unsigned int);
  10. int keyScan();


  11. //VARIABLES        
  12. int a,keyNum;
  13. unsigned char num=0;
  14. unsigned char led;
  15. unsigned char lightUp[]={
  16.         0xfe,0xfd,0xfb,0xf7,
  17.         0xef,0xdf,0xbf,0x7f};

  18. void main()
  19. {
  20.                
  21.         
  22.         led=0xff;        
  23.         while(1) {
  24.                 //light up led
  25.                 P0=led;
  26.                 P2=0xfe;   //row1
  27.                 keyNum=keyScan();
  28.                 if(keyNum==0){
  29.                         P2=0xfd;   //row2
  30.                         keyNum=keyScan();
  31.                         if(keyNum==0){
  32.                                 P2=0xfb;   //row3
  33.                                 keyNum=keyScan();
  34.                                 if(keyNum==0){
  35.                                         P2=0xf7;   //row4
  36.                                         keyNum=keyScan();
  37.                                 }
  38.                         }
  39.                 }
  40.                
  41.                 if((keyNum<=7)&&(keyNum>0)){
  42.                         led=lightUp[keyNum-1];        
  43.                         //delayms(100);
  44.                 }
  45.                
  46.         }
  47.                
  48.         
  49. }
  50. void delayms(unsigned int xms)
  51. {
  52.         unsigned int i,j;
  53.         for(i=0;i<xms;i++)
  54.         {
  55.                 for(j=0;j<110;j++);
  56.         }
  57. }


  58. int keyScan(){
  59.         int key=0;
  60.         unsigned char temp;
  61.         temp=P2&0xf0;
  62.         if(temp!=0xf0){
  63.                 delayms(10);
  64.                 temp=P2&0xf0;
  65.                 if(temp!=0xf0){
  66.                         temp=P2;
  67.                         //LED=0;   //LIT LED
  68.                         switch(temp){
  69.                                 case 0xee:          //search low level column in row1
  70.                                         key=1;
  71.                                         break;
  72.                                 case 0xde:
  73.                                         key=2;
  74.                                         break;
  75.                                 case 0xbe:
  76.                                         key=3;
  77.                                         break;
  78.                                 case 0x7e:
  79.                                         key=4;
  80.                                         break;
  81.                                 case 0xed:          //row2
  82.                                         key=5;
  83.                                         break;
  84.                                 case 0xdd:
  85.                                         key=6;
  86.                                         break;
  87.                                 case 0xbd:
  88.                                         key=7;
  89.                                         break;
  90.                                 case 0x7d:
  91.                                         key=8;
  92.                                         break;
  93.                                 case 0xeb:          //row3
  94.                                         key=9;
  95.                                         break;
  96.                                 case 0xdb:
  97.                                         key=10;
  98.                                         break;
  99.                                 case 0xbb:
  100.                                         key=11;
  101.                                         break;
  102.                                 case 0x7b:
  103.                                         key=12;
  104.                                         break;
  105.                                 case 0xe7:          //row4
  106.                                         key=13;
  107.                                         break;
  108.                                 case 0xd7:
  109.                                         key=14;
  110.                                         break;
  111.                                 case 0xb7:
  112.                                         key=15;
  113.                                         break;
  114.                                 case 0x77:
  115.                                         key=16;
  116.                                         break;
  117.                         }
  118.                 }
  119.                 while(temp!=0xf0){          //wait till release
  120.                         temp=P2;
  121.                         temp=temp&0xf0;
  122.                 }
  123.         }
  124.         return key;
  125. }
復(fù)制代碼





作者: LiiK    時(shí)間: 2021-2-16 11:24
你好,keyNum的判斷是根據(jù)什么的





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1