标题: 单片机矩阵键盘扫描程序(仿真+程序)注释很详细 [打印本页]

作者: cangyuan    时间: 2021-7-16 15:32
标题: 单片机矩阵键盘扫描程序(仿真+程序)注释很详细
摁键扫描是很基础的知识点,摁键扫描通俗的来说就是在串口输出高低电平,然后当有摁键摁下时便会引起电平的变化,我们只需将变化的电平进行记录和组合便可以知晓具体是那一格摁键摁下。

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


单片机源程序如下:
  1. #include <reg52.H>
  2. #define u8 unsigned char
  3. #define KEY  P3 //定义变量,方便以后键盘接到其他的端口后,修改这里就行了,下面的程序不用再修改  
  4. u8 num1,i,num2;
  5. u8 code keycode[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
  6. void delay(long i){while(i--);}
  7.   
  8. void main(void)
  9. {
  10.   KEY=0x0f;//初始状态,高位列,低电平;低位行,高电平
  11.   while(1)
  12.     {
  13.            if(KEY!=0x0f)//如果有按键按下,则KEY肯定不是原来的0x0f
  14.            {
  15.                    delay(2000);//延时20毫秒,以防按键的弹簧上下振荡,造成按下的假象
  16.                    if(KEY!=0x0f)num1=KEY;//的确是按下了,获取此时状态,高位均为0,低位有1位不是1
  17.                          KEY=0xf0;//KEY输出0xf0
  18.                    delay(2000);//延时20毫秒,以防按键的弹簧上下振荡,造成按下的假象
  19.                    if(KEY!=0xf0)num2=KEY;
  20. //for循环keycode数组检测 break
  21.                          for(i=0;;i++)
  22.                          {
  23.                                  if((num1|num2)==keycode[i]) break;
  24.                          }
  25.                    KEY=0x0f;//KEY输出0x0f,恢复初始状态
  26.              while(KEY!=0x0f);//如果还在按下,等待放手
  27.                          P2=i;//P2口输出给BCD数码管
  28.            }
  29.     }
  30. }
复制代码

仿真代码资料51hei提供下载(用winrar解压):
矩阵键盘程序.rar (66.73 KB, 下载次数: 60)


作者: YwJ    时间: 2024-4-3 14:36
谢谢分享,学习学习
作者: zhengguo_wang    时间: 2024-4-28 10:03
好资料,51黑有你更精彩!!!
作者: leoeric    时间: 2024-5-10 22:34
谢谢分享,学习学习
好资料,51黑有你更精彩!!!
作者: 打杂的    时间: 2024-5-15 10:11
下载试试效果咋样





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1