找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1683|回复: 3
打印 上一主题 下一主题
收起左侧

单片机矩阵键盘扫描程序(仿真+程序)注释很详细

[复制链接]
跳转到指定楼层
楼主
摁键扫描是很基础的知识点,摁键扫描通俗的来说就是在串口输出高低电平,然后当有摁键摁下时便会引起电平的变化,我们只需将变化的电平进行记录和组合便可以知晓具体是那一格摁键摁下。

仿真原理图如下(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, 下载次数: 43)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:74649 发表于 2024-4-3 14:36 | 只看该作者
谢谢分享,学习学习
回复

使用道具 举报

板凳
ID:166646 发表于 2024-4-28 10:03 | 只看该作者

谢谢分享,学习学习
谢谢分享,学习学习
谢谢分享,学习学习
回复

使用道具 举报

地板
ID:166646 发表于 2024-4-28 10:03 | 只看该作者

谢谢分享,学习学习
谢谢分享,学习学习
谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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