找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1440|回复: 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, 下载次数: 11, 下载积分: 黑币 -5

评分

参与人数 1黑币 +5 收起 理由
cccc888 + 5 赞一个!

查看全部评分

回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表