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

[复制链接]
查看4 | 回复0 | 2021-6-9 17:27:32 | 显示全部楼层 |阅读模式
4x4矩阵键数值的读取和显示;
按键被按下后只有被松开才会有效果;
多个按键被按下只有按键都被松开最先被按下的按键起效果;
采用共阳极数码管显示;
附件包含完整仿真设计和C程序。

仿真原理图如下(proteus仿真工程文件和完整单片机c代码可到本帖附件中下载)
1.png
部分代码:
  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. ------完整代码请下载本文尾部的附件----
复制代码
完整程序代码和proteus仿真工程: 4x4矩阵键.zip (54.63 KB, 售价: 3 工控币)

回复

使用道具 举报

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

本版积分规则