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

標題: 狀態機實現鍵盤矩陣0~f顯示的單片機源碼 [打印本頁]

作者: 淺夢無痕    時間: 2018-1-23 21:25
標題: 狀態機實現鍵盤矩陣0~f顯示的單片機源碼
基于c語言,狀態機實現鍵盤矩陣0~f
  1. 功能:狀態機實現矩陣鍵盤  (從0~F的顯示)
  2. 說明: P2^0-P2^3接行,P2^4-P2^7接列,10ms中斷掃描
  3. 單片機: AT89S52                                          
  4. ******************************************************/
  5. #include<reg52.h>
  6. #define KEY P2
  7. #define NO_KEY  0xff     //無按鍵按下
  8. #define KEY_STATE0  0   //判斷按鍵按下
  9. #define KEY_STATE1  1  //確定按鍵按下
  10. #define KEY_STATE2  2  //按鍵釋放狀態
  11. #define V_TH0  0Xd8                  
  12. #define V_TL0  0Xf0                  
  13. #define V_TMOD 0X01
  14. #define uint unsigned int
  15. #define uchar unsigned char
  16. sbit DAT=P0^3;
  17. sbit CLK=P0^2;
  18. uint flag=0;  //按鍵掃描標志
  19. uchar code tab[]={
  20.       0xed,0x09,0xbc,0x9d,0x59,0xd5,
  21.       0xf5,0x0d,0xfd,0xdd,0x7d,0xf1,
  22.       0xe4,0xb9,0xf4,0x74,0x00} ; //0-F, 全滅
  23. void sendbyte(uchar byte)     //這個是數碼管的驅動  
  24. {            
  25. uchar num,c;         
  26. num=tab[byte];
  27. for(c=0;c<8;c++)         
  28. {     
  29.   CLK=0;   
  30.   DAT=num&0x01;   
  31.   CLK=1;         
  32.   num>>=1; //右移位賦值                        
  33. }
  34. }

  35. unsigned char KeyScan()
  36. {
  37. static unsigned char key_state=KEY_STATE0;
  38. uchar key_value,key_temp;
  39. uchar key1,key2;

  40. KEY=0xf0;
  41. key1=KEY&0xf0;  //確定哪一行的按鍵按下
  42. KEY=0x0f;
  43. key2=KEY&0x0f;  //確定哪一列的按鍵按下
  44. key_temp=key1|key2;  //確定按鍵位置

  45. switch(key_state)                            //檢測當前狀態
  46. {
  47.   case KEY_STATE0:
  48.    if(key_temp!=NO_KEY)
  49.    {
  50.     key_state=KEY_STATE1;                   //轉換狀態
  51.    }
  52.    break;

  53.   case KEY_STATE1:
  54.    if(key_temp==NO_KEY)
  55.    {
  56.     key_state=KEY_STATE0;
  57.    }
  58.    else
  59.    {
  60.    switch(key_temp)                     //當確定按鍵按下后,列舉所有的按鍵情況
  61.     {
  62.      case 0x7e: key_value=0;break;
  63.      case 0xbe: key_value=1;break;
  64.      case 0xde: key_value=2;;break;
  65.      case 0xee: key_value=3;break;
  66.      case 0x7d: key_value=4;break;
  67.      case 0xbd: key_value=5;break;
  68.      case 0xdd: key_value=6;break;
  69.      case 0xed: key_value=7;break;
  70.      case 0x7b: key_value=8;break;
  71.      case 0xbb: key_value=9;break;
  72.      case 0xdb: key_value=10;break;
  73.      case 0xeb: key_value=11;break;
  74.      case 0x77: key_value=12;break;
  75.      case 0xb7: key_value=13;break;
  76.      case 0xd7: key_value=14;break;
  77.      case 0xe7: key_value=15;break;
  78.     }
  79.     key_state=KEY_STATE2;
  80.    }
  81.    break;

  82.    case KEY_STATE2:
  83.    if(key_temp==NO_KEY)
  84.    {
  85.     key_state=KEY_STATE0;
  86.    }
  87.    break;
  88. }
  89. return key_value;
  90. }


  91. main(void)
  92. {
  93. uchar readkey=NO_KEY;
  94. P2=0xff;
  95. TMOD=V_TMOD;
  96. TH0=V_TH0;  //12MHz  10Ms
  97. TL0=V_TL0;
  98. ET0=1;
  99. EA=1;
  100. TR0=1;

  101. while(1)
  102. {
  103.   if(flag)
  104.   {
  105.    flag=0;
  106.    readkey=KeyScan();
  107.    switch(readkey)   //switch語句里面的case判斷后,接著的語句為相應的需要做的事情,  
  108. {                 //這里只是在數碼管顯示相應的數值。
  109.     case 0: sendbyte(0);break;
  110.     case 1: sendbyte(1);break;
  111.     case 2: sendbyte(2);break;
  112.     case 3: sendbyte(3);break;
  113.     case 4: sendbyte(4);break;
  114.     case 5: sendbyte(5);break;
  115.     case 6: sendbyte(6);break;
  116.     case 7: sendbyte(7);break;
  117.     case 8: sendbyte(8);break;
  118.     case 9: sendbyte(9);break;
  119.     case 10: sendbyte(10);break;
  120.     case 11: sendbyte(11);break;
  121.     case 12: sendbyte(12);break;
  122.     case 13: sendbyte(13);break;
  123.     case 14: sendbyte(14);break;
  124.     case 15: sendbyte(15);break;
  125.    }
  126.   }
  127. }
  128. }
  129. void timer0() interrupt 1                     
  130. {
  131. TH0=V_TH0;  //10Ms
  132. TL0=V_TL0;
  133. flag=1;
  134. }
復制代碼


狀態機實現矩陣鍵盤.doc

36 KB, 下載次數: 12, 下載積分: 黑幣 -5


作者: cccc888    時間: 2018-1-24 11:02
uchar key_value,key_temp;   KEY=0xf0;  key_temp=KEY&0xf0;  //確定哪一行的按鍵按下  KEY=0x0f;  key_temp=key_temp | KEY&0x0f;  //確定哪一列的按鍵按下  //key_temp=key1|key2;  //確定按鍵位置




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 69视频在线播放 | 日本一区二区三区四区 | 精品国产伦一区二区三区观看说明 | 91精品国产综合久久久密闭 | 国产一区二区久久 | 精品一区二区三区av | 国产精品一区二区三区在线 | 国产一区二区精品自拍 | 视频一区在线观看 | 亚洲精品一区中文字幕乱码 | 羞羞视频网 | 日韩有码一区 | av在线电影网| 四虎影院免费在线播放 | 久久久久久高潮国产精品视 | 羞羞免费网站 | 日韩av免费在线观看 | 日韩在线免费播放 | 日韩在线免费看 | 桃花av在线 | 精品国产乱码久久久久久丨区2区 | 日韩欧美手机在线 | 欧美黄在线观看 | 久久久久成人精品亚洲国产 | 99久久精品免费视频 | 亚洲精品短视频 | www.久久| 欧美一区二区在线免费观看 | 青草青草久热精品视频在线观看 | 日本久久精品视频 | 欧美精品1区| 69av网| 欧美极品一区二区 | 国产在线精品一区二区 | 国产精品亚洲精品久久 | 99久久久无码国产精品 | 欧美一级片在线播放 | 一区二区电影网 | 日本久久一区二区三区 | 亚洲日韩中文字幕一区 | 亚洲一区二区中文字幕 |