历史上的今天
今天是:2025年10月19日(星期日)
2022年10月19日 | STC89C52单片机 矩阵键盘
2022-10-19 来源:csdn
矩阵键盘识别方法
矩阵键盘一共有4行和4列一共16个按键组成。
确定矩阵键盘上哪一个按键被按下可以采用列扫描和行扫描。列扫描时先把接在列上面的所有IO口拉高,接在行上的所有IO置低。当其中有一列内任何一个按键按下那么整条列线都会被拉低。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0YE4FYzq-1608612455192)(img/matrix_keyboard.png?imageView2/2/w/550)]](https://8.eewimg.cn/news/uploadfile/2022/1019/20221019044550644.png?imageView2/2/w/550)
当进行列扫描的时候:
P30/TXD:IO口为 0
P31/RXD:IO口为 0
P32/INT0:IO口为 0
P33/INT1:IO口为 0
P34/LCDEN:IO口为 1
P35/RS:IO口为 1
P36/WE:IO口为 1
P37/RD:IO口为 1
当进行行扫描的时候
P30/TXD:IO口为 1
P31/RXD:IO口为 1
P32/INT0:IO口为 1
P33/INT1:IO口为 1
P34/LCDEN:IO口为 0
P35/RS:IO口为 0
P36/WE:IO口为 0
P37/RD:IO口为 0
最后列扫描转化为十六进制和行扫描转化为十六进制的结果相加在一起就是按键按下的位置。
例如:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1LErMZ2d-1608612455195)(img/matrix_keyboard_Demo1.png?imageView2/2/w/550)]](https://8.eewimg.cn/news/uploadfile/2022/1019/20221019044550322.png?imageView2/2/w/550)
按下S6按键
先进行列扫描,P37/RD为最高位,P30/TXD 为最低位
P34/LCDEN 会被 P30/TXD 拉低,P34/LCDEN:IO口被赋值为 0
P30/TXD:IO口为 0
P31/RXD:IO口为 0
P32/INT0:IO口为 0
P33/INT1:IO口为 0
P34/LCDEN:IO口为 0
P35/RS:IO口为 1
P36/WE:IO口为 1
P37/RD:IO口为 1
此时得到
二进制为 1110 0000
转化为十六进制为 0xE0
进行行扫描,P37/RD为最高位,P30/TXD 为最低位
P34/LCDEN:IO口为 0 ,所以 P30/TXD:IO口会被拉低
P30/TXD:IO口为 0
P31/RXD:IO口为 1
P32/INT0:IO口为 1
P33/INT1:IO口为 1
P34/LCDEN:IO口为 0
P35/RS:IO口为 0
P36/WE:IO口为 0
P37/RD:IO口为 0
此时得到
二进制为 0000 1110
转化为十六进制为 0x0E
将列扫描得到的十六进制结果和行扫描得到的十六进制结果相加
0xE0 + 0x0E = 0xEE
得到的最终的结果是s6按键按下的位置。
例如:
按下s21按键
先进行列扫描,P37/RD为最高位,P30/TXD 为最低位
P37/RD 会被 P33/INT1 拉低,P37/RD:IO口被赋值为 0
P30/TXD:IO口为 0
P31/RXD:IO口为 0
P32/INT0:IO口为 0
P33/INT1:IO口为 0
P34/LCDEN:IO口为 1
P35/RS:IO口为 1
P36/WE:IO口为 1
P37/RD:IO口为 0
此时得到
二进制为 0111 0000
转化为十六进制为 0x70
进行行扫描,P37/RD为最高位,P30/TXD 为最低位
P37/RD IO口为 0 ,所以 P33/INT1 IO口会被拉低
P30/TXD:IO口为 1
P31/RXD:IO口为 1
P32/INT0:IO口为 1
P33/INT1:IO口为 0
P34/LCDEN:IO口为 0
P35/RS:IO口为 0
P36/WE:IO口为 0
P37/RD:IO口为 0
此时得到
二进制为 0000 0111
转化为十六进制为 0x07
将列扫描得到的十六进制结果和行扫描得到的十六进制结果相加
0x70 + 0x07 = 0x77
得到的最终的结果是s21按键按下的位置。
4*4矩阵键盘与4位独立键盘识别
按下矩阵键盘和独立键盘任意键,数码管显示相应数值,初始显示“-”横
#include #include #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管段选 uchar num;//数码管显示的值 uchar KeyValue = 20;//按键值 显示- //共阴数码管段选表 uchar code tabel[]= { //0 1 2 3 4 5 6 7 8 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, //9 A B C D E F H L 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x76, 0x38, //n u - 熄灭 0x37, 0x3E, 0x40, 0x00 }; /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(uint z){ uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } /*==================================== 函数 :KeyScan() 参数 :无 返回值 :无 描述 :4*4矩阵键盘与独立键盘扫描 按键按下KeyValue全局变量值发生相应变化 ====================================*/ void KeyScan(){ //4*4矩阵键盘扫描 P3 = 0XF0;//列扫描 if(P3 != 0XF0){ //判断按键是否被按下 delay(10);//软件消抖10ms if(P3 != 0XF0){ // 判断按键是否被按下 switch(P3){ // 判断那一列被按下 case 0xe0: KeyValue = 0; break;//第一列被按下 case 0xd0: KeyValue = 1; break;//第二列被按下 case 0xb0: KeyValue = 2; break;//第三列被按下 case 0x70: KeyValue = 3; break;//第四列被按下 } P3 = 0X0F; // 行扫描 switch(P3){ // 判断那一行被按下 case 0x0e: KeyValue = KeyValue; break; // 第一行被按下 case 0x0d: KeyValue = KeyValue + 4; break; // 第二行被按下 case 0x0b: KeyValue = KeyValue + 8; break; // 第三行被按下 case 0x07: KeyValue = KeyValue + 12; break; // 第四行被按下 } while(P3 != 0X0F); // 松手检测 } } P3 = 0XFF; // 独立按键扫描 if(P3 != 0XFF){ delay(10); // 软件消抖10ms if(P3 != 0XFF){ switch(P3){ // 判断那一行被按下 case 0xfe: KeyValue = 16; break; // S2被按下 case 0xfd: KeyValue = 17; break; // S3被按下 case 0xfb: KeyValue = 18; break; // S4被按下 case 0xf7: KeyValue = 19; break; // S5被按下 } while(P3 != 0XFF); // 松手检测 } } } void main(){ // main函数自身会循环 WE = 1; // 打开位选锁存器 P0 = 0XFE; //1111 1110 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 while(1){ KeyScan(); // 20个按键键盘扫描 P0 = tabel[KeyValue]; // 显示按键值 } }
史海拾趣
|
联华众科FPGA开发板 FA130 北京联华众科科技有限公司 http://www.lianhua-zhongke.com.cn Abstract 摘 要:联华众科FPGA开发板FA130核心器件为 Altera Cyclone系列的EP1C3,配置芯片为EPCS1,FA130上可以运行SOPC Bui ...… 查看全部问答> |
|
电磁感应的传导干扰和辐射干扰 EMI/EMC-原理与应对详解(六) 1-2电磁感应产生传导干扰 我们知道,在开关电源里面,开关电源变压器是最大的磁感应器件。反激式开关电源变压器,就是通过把流过变压器初级线圈的电流转换成磁能,并把磁能存储在变压器铁心之中,然后,等电源开关管关断的时候,流过变压器初级线 ...… 查看全部问答> |
|
IInt numAlgs, i; Engine_AlgInfo algInfo; Engine_Error err; err = Engine_getNumAlgs(\"audio_copy\", &numAlgs); for (i = 0; i < numAlgs; i++) { err = Engine_getAlgInfo(name, &algInfo, i); printf(\"alg[%d]: name = %s typeTab = ...… 查看全部问答> |
|
我现在用的是sqlite数据库,请问,怎么去实现查询,按照时间或关键字去查询,能实现吧? 我用的是evc。 我找了半天了,可能找的方法不对,没找到想要的,我卡了一段时间没进展,所以在这问问大家,有谁能给个参考的代码吗?谢谢 ,或者有用的链接 ...… 查看全部问答> |
|
现有两个按钮开关,作用如下.一个是自动控制模式,一个手动控制模式.手动控制模式的功能已实现了,现在就是自动模式有点麻烦.自动模式要求如下,哪位高手帮我看看该如何实现. 用的是89c2051单片机,汇编语言. P3.1口检测外部的一个高电平信号,当检测到 ...… 查看全部问答> |
|
我用ARM7想做解析XML,可是用LIBXML2和EXPAT编译都通不过,有谁做过这个能帮帮我吗?很急,谢谢 留下我的QQ:22325424… 查看全部问答> |
|
4M晶振,要9600波特率... 用波特率计算工具算得:UBR1=0X01;UBR0=0XA0;UCA0MCTLW=0XC000; 怎么不对呢...和PC联系不上... void main(void) { WDTCTL = WDTPW + WDTHOLD; ...… 查看全部问答> |
|
开始正常,能读取一段时间, 之后就会进入一个命令的响应循环出不来,因为响应不对,比如初始化进入复位循环就出不来了,一直不返回0x01...这是怎么回事啊,求指导!!!万分感谢啊… 查看全部问答> |
|
【晒样片】+THS4541高速差动 I/O 放大器等样片申请更新 本帖最后由 neufeifatonju 于 2015-1-28 10:10 编辑 1月22日发布的帖子https://bbs.eeworld.com.cn/thread-454962-1-1.html,今天更新一下: 打开电脑,发现新的活动--免费申请TI 样片, 新春好礼相赠!链接https://www.eeworld.com.cn/huodong/ ...… 查看全部问答> |




