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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1637|回復: 1
打印 上一主題 下一主題
收起左側

狀態機實現鍵盤矩陣0~f顯示的單片機源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:279095 發表于 2018-1-23 21:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于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

評分

參與人數 1黑幣 +5 收起 理由
cccc888 + 5 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:258566 發表于 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;  //確定按鍵位置
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线精品一区二区三区 | 中文字幕在线视频观看 | 91麻豆精品一区二区三区 | 日韩综合一区 | 国产精品1区2区 | 午夜精品一区二区三区在线观看 | 成人超碰在线 | 97人人澡人人爽91综合色 | 国产精品精品久久久 | 波多野结衣精品 | 国产精品大全 | 亚洲精品日韩综合观看成人91 | 久久久久一区二区三区 | av午夜激情 | 免费99视频| 色就干| 欧美激情精品久久久久久变态 | 范冰冰一级做a爰片久久毛片 | 国产亚洲精品久久久久动 | 天天综合网天天综合 | 欧美一级二级在线观看 | 久久成人精品视频 | 国产色爽 | 精品中文字幕一区二区 | av在线成人 | 国产又色又爽又黄又免费 | 99精品欧美一区二区蜜桃免费 | 国产一区二区三区久久久久久久久 | 亚洲精品久久久一区二区三区 | 国产一区二区中文字幕 | 男女下面一进一出网站 | 爱爱免费视频 | 欧美一级片在线 | jizz在线看片| 成年人免费在线视频 | 四虎永久在线精品免费一区二 | 日本精品一区二区三区视频 | 天天插天天操 | 国产精品有限公司 | 久久久久国产一区二区三区 | 一区二区不卡高清 |