找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1899|回复: 0
收起左侧

单片机4x4矩阵键数值读取和显示程序Proteus仿真

[复制链接]
ID:921535 发表于 2021-5-30 10:14 | 显示全部楼层 |阅读模式
4x4矩阵键数值的读取和显示;
按键被按下后只有被松开才会有效果;
多个按键被按下只有按键都被松开最先被按下的按键起效果;
采用共阳极数码管显示;
附件包含完整仿真设计和C程序。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真效果

仿真效果


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. /**************物理连线
  5. P1对应数码管;
  6. P2前四位对应矩阵行
  7. P2后四位对应矩阵列
  8. *****************/
  9. #define saomiao P2
  10. #define DB P1
  11. void display(uchar dat);                                                                                                                                                        //显示键盘值函数
  12. uchar key_scan( );                                                                                                                                                                   //键盘扫描函数
  13. uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e };  //0~15数码管代码,共阳极
  14. uchar key;                                                                                                                                                                                   //键盘值



  15. /********************************************************************
  16.                             延时函数
  17. *********************************************************************/
  18. void delay10ms(void) //延时程序
  19. {
  20.         unsigned char i,j;
  21.         for(i=20;i>0;i--)
  22.         for(j=248;j>0;j--);
  23. }



  24. //*****************键盘扫描函数*****************
  25. uchar key_scan()
  26. {
  27. uchar temp;
  28. saomiao=0xfe;                      //扫描第1行键
  29. temp=saomiao;
  30. temp=temp&0xf0;
  31. if(temp!=0xf0)
  32. delay10ms();                         //延时10ms
  33. temp=saomiao;
  34. temp=temp&0xf0;                                 //确认按键被按下
  35. if(temp!=0xf0)
  36. {
  37. temp=saomiao;
  38. switch(temp)
  39. {
  40. case 0xee:                                           //第1行第1列被按下
  41.             key=0;
  42.                         break;                           
  43. case 0xde:                                      // 第1行第2列被按下
  44.             key=1;
  45.                         break;
  46. case 0xbe:                                                  // 第1行第3列被按下
  47.             key=2;
  48.                         break;
  49. case 0x7e:                                                   // 第1行第4列被按下
  50.             key=3;
  51.                         break;
  52. default:     
  53.            break;

  54. }
  55. K1:
  56. temp=saomiao;
  57. temp=temp&0xf0;
  58. while(temp!=0xf0)                           //等待按键被松开才可以有效果
  59. goto K1;
  60. }


  61. saomiao=0xfd;                      //扫描第2行键
  62. temp=saomiao;
  63. temp=temp&0xf0;
  64. if(temp!=0xf0)
  65. delay10ms();
  66. temp=saomiao;
  67. temp=temp&0xf0;
  68. if(temp!=0xf0)
  69. {
  70. temp=saomiao;
  71. switch(temp)
  72. {
  73. case 0xed:
  74.             key=4;
  75.                         break;
  76. case 0xdd:  
  77.             key=5;
  78.                         break;
  79. case 0xbd:
  80.             key=6;
  81.                         break;
  82. case 0x7d:
  83.             key=7;
  84.                         break;
  85. default:     
  86.            break;

  87. }
  88. K2: temp=saomiao;
  89. temp=temp&0xf0;
  90. while(temp!=0xf0)                           //等待按键被松开
  91. goto K2;
  92. }



  93.   saomiao=0xfb;                      //扫描第3行键
  94. temp=saomiao;
  95. temp=temp&0xf0;
  96. if(temp!=0xf0)
  97. delay10ms();
  98. temp=saomiao;
  99. temp=temp&0xf0;
  100. if(temp!=0xf0)
  101. {
  102. temp=saomiao;
  103. switch(temp)
  104. {
  105. case 0xeb:
  106.             key=8;
  107.                         break;
  108. case 0xdb:  
  109.             key=9;
  110.                         break;
  111. case 0xbb:
  112.             key=10;
  113.                         break;
  114. case 0x7b:
  115.             key=11;
  116.                         break;
  117. default :   
  118.            break;

  119. }
  120. K3:
  121. temp=saomiao;
  122. temp=temp&0xf0;
  123. while(temp!=0xf0)                           //等待按键被松开
  124. goto K3;
  125. }




  126. saomiao=0xf7;                      //扫描第4行键
  127. temp=saomiao;
  128. temp=temp&0xf0;
  129. if(temp!=0xf0)
  130. delay10ms();
  131. temp=saomiao;
  132. temp=temp&0xf0;
  133. if(temp!=0xf0)
  134. {
  135. temp=saomiao;
  136. switch(temp)
  137. {
  138. case 0xe7:
  139.             key=12;
  140.                         break;
  141. case 0xd7:  
  142.             key=13;
  143.                         break;
  144. case 0xb7:
  145.             key=14;
  146.                         break;
  147. case 0x77:
  148.             key=15;
  149.                         break;
  150. default:     
  151.            break;

  152. }
  153. K4: temp=saomiao;
  154. temp=temp&0xf0;
  155. while(temp!=0xf0)                           //等待按键被松开
  156. goto K4;
  157. }
  158. return key;
  159. }



  160. void display(uchar dat)
  161. {
  162. DB=table[dat];
  163. }




  164. main()
  165. {
  166. key=0;
  167. while(1)
  168. {
  169. key=key_scan();           //读取按键值
  170. display(key);                   //显示按键值
  171. }
  172. }

  173.                                                                                                                                                                                                 
复制代码

所有资料51hei提供下载:
4x4矩阵键.zip (54.63 KB, 下载次数: 13)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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