历史上的今天
返回首页

历史上的今天

今天是: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)]

当进行列扫描的时候:

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)]

按下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 //包含51头文件

#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]; // 显示按键值

}


推荐阅读

史海拾趣

固得沃克(GOODWORK)公司的发展小趣事

随着业务的不断拓展,固得沃克意识到技术升级和产能扩张的重要性。2019年,公司在江苏盐城成立了江苏固得沃克微电子科技有限公司,作为新的生产基地。该基地拥有2万平米的厂房,引进了具有国际水准的专业生产设备及先进检测仪器,并通过了ISO9001、ISO14001等国际管理体系认证。这一举措不仅提升了公司的生产能力和产品质量,还进一步巩固了其在半导体行业的地位。

浙江凡华(FANHAR)公司的发展小趣事

为了进一步提升品牌影响力和市场占有率,固得沃克积极寻求与行业内知名企业的战略合作。例如,公司与锐单商城达成战略合作,共同推动电子元器件的在线销售和服务。这一合作不仅拓宽了公司的销售渠道,还提升了公司的品牌知名度和美誉度。通过不断参与行业交流和合作,固得沃克在电子行业中的影响力日益增强,为公司的长远发展奠定了坚实基础。

FOX [Fox Electronics]公司的发展小趣事

为了进一步扩大市场份额和增强技术实力,Fox Electronics在近年来进行了多起战略并购和合作。公司通过收购具有核心竞争力的中小型企业,快速获取了新技术、新产品和客户资源。同时,Fox Electronics还与行业内的知名企业和研究机构建立了长期合作关系,共同开展技术研发和市场推广。这些并购与合作不仅加速了公司的业务扩张,还提升了其在全球电子行业的影响力。

高创科技(gotrend)公司的发展小趣事

面对物联网、5G通信和汽车电子等新兴技术的快速发展,Fox Electronics敏锐地洞察到未来市场的变革趋势。公司加大了对高频、低抖动和高精度时钟解决方案的研发力度,以满足新兴应用对时钟源的高要求。同时,Fox Electronics还积极布局汽车电子市场,开发适应汽车自动驾驶和车联网需求的专用时钟产品。通过不断创新和布局未来市场,Fox Electronics为自身的持续发展奠定了坚实基础。

请注意,以上故事均为虚构内容,旨在展示电子行业发展的某些方面和可能的趋势。实际上,Fox Electronics的具体发展历程和成就可能有所不同。

FOCI Fiber Optic Communications Inc公司的发展小趣事

为了进一步扩大市场份额和增强技术实力,Fox Electronics在近年来进行了多起战略并购和合作。公司通过收购具有核心竞争力的中小型企业,快速获取了新技术、新产品和客户资源。同时,Fox Electronics还与行业内的知名企业和研究机构建立了长期合作关系,共同开展技术研发和市场推广。这些并购与合作不仅加速了公司的业务扩张,还提升了其在全球电子行业的影响力。

Bliley Technologies Inc公司的发展小趣事

在Bliley的发展历程中,技术创新始终是推动其不断前进的重要动力。从最初的石英晶体生产,到后来的恒温控制晶体振荡器(OCXO)、温度补偿晶振(TCXO)和压控晶体振荡器(VCXO)等先进产品的开发,Bliley始终站在行业技术的最前沿。公司拥有一支专业的研发团队,致力于开发更高效、更稳定、更精确的频率控制产品。这些技术创新不仅提升了Bliley的产品竞争力,也推动了整个电子行业的发展。

问答坊 | AI 解惑

推荐FPGA+单片机开发板。。。

联华众科FPGA开发板 FA130 北京联华众科科技有限公司 http://www.lianhua-zhongke.com.cn Abstract  摘 要:联华众科FPGA开发板FA130核心器件为 Altera Cyclone系列的EP1C3,配置芯片为EPCS1,FA130上可以运行SOPC Bui ...…

查看全部问答>

电磁感应的传导干扰和辐射干扰 EMI/EMC-原理与应对详解(六)

1-2电磁感应产生传导干扰 我们知道,在开关电源里面,开关电源变压器是最大的磁感应器件。反激式开关电源变压器,就是通过把流过变压器初级线圈的电流转换成磁能,并把磁能存储在变压器铁心之中,然后,等电源开关管关断的时候,流过变压器初级线 ...…

查看全部问答>

Engine_AlgInfo的用法

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 = ...…

查看全部问答>

wince下使用sqlite 如何实现查询?

我现在用的是sqlite数据库,请问,怎么去实现查询,按照时间或关键字去查询,能实现吧? 我用的是evc。 我找了半天了,可能找的方法不对,没找到想要的,我卡了一段时间没进展,所以在这问问大家,有谁能给个参考的代码吗?谢谢 ,或者有用的链接 ...…

查看全部问答>

CE5.0 dirs问题

最近拿到一个BSP 里面dirs这样写的 DIRS=          \\      drivers   \\      kernel    \\      gwe     ...…

查看全部问答>

谁能用汇编帮我实现以下功能?

现有两个按钮开关,作用如下.一个是自动控制模式,一个手动控制模式.手动控制模式的功能已实现了,现在就是自动模式有点麻烦.自动模式要求如下,哪位高手帮我看看该如何实现. 用的是89c2051单片机,汇编语言. P3.1口检测外部的一个高电平信号,当检测到 ...…

查看全部问答>

有谁在ARM下作过解析XML,能帮帮我吗?

我用ARM7想做解析XML,可是用LIBXML2和EXPAT编译都通不过,有谁做过这个能帮帮我吗?很急,谢谢 留下我的QQ:22325424…

查看全部问答>

求助关于USCI UART的波特率问题..

4M晶振,要9600波特率... 用波特率计算工具算得:UBR1=0X01;UBR0=0XA0;UCA0MCTLW=0XC000; 怎么不对呢...和PC联系不上... void main(void) {   WDTCTL = WDTPW + WDTHOLD;              ...…

查看全部问答>

SD卡读写程序,命令不能正确响应,死在判断命令响应里了

开始正常,能读取一段时间, 之后就会进入一个命令的响应循环出不来,因为响应不对,比如初始化进入复位循环就出不来了,一直不返回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/ ...…

查看全部问答>