单片机小白学习之路(九)---矩阵按键在数码管上显示数字

目标:矩阵按键在数码管上显示数字


矩阵按键模块:

13367077-ba9b2719b6362408.png
矩阵按键模块

P0~3是一组,P4~7是一组

矩阵按键识别方法

(1)逐行扫描

是种常见的方法,先把高四位全部置低电平,低四位置高电平,如果有按键按下那么低四位就会出现不全为1的情况,因为按键变不导通状态,之前是导通,这样就知道有按键按下了。

知道按键按下后就要判断具体是哪个按键按下的,于是把高四位和低四位变高电平,然后逐行逐列检测发现有行有个低电平,又发现个列有低电平,两个一交叉就知道是哪个按键按下的了

(2)行列扫描

通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位变不全为高电平,说明有按键按下,然后通过接收的数据值,判断是哪一有按键按下。

然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一有按键按下,这样就能够确定是哪一个按键按下了。

矩阵按键可以变成独立按键吗?

独立按键以前说过,就是一端接地的区别,所以把列接地,就变成的独立按键,可以拿排针把高位接出来

代码:

13367077-6bfa31ebdc86dd72.png
代码

LSA, LSB, LSC是数码管位选,定义了两个全局变量

第一个if是让低四位置高电平,判断列,通过P1口数值的不同知道是那个列按下,给keyvlaue赋相应值,然后再判断行,行与行之间相差4,所以这里第四行与第一行差12,其它自行对比

那个while((a<50)&&(Butt!=0x0f))是判断按键是否松开,还能防止一直按着使cpu一直工作


  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于51单片机数码矩阵按键显示0-15的代码: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int // 数码显示数字编码 uchar code numCode[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4; sbit keyIn1 = P3^2; sbit keyIn2 = P3^3; sbit keyIn3 = P3^4; sbit keyIn4 = P3^5; sbit keyOut1 = P3^6; sbit keyOut2 = P3^7; // 数码管位选函数 void selectPos(uchar pos) { switch(pos) { case 0: LSA = 0; LSB = 0; LSC = 0; break; case 1: LSA = 1; LSB = 0; LSC = 0; break; case 2: LSA = 0; LSB = 1; LSC = 0; break; case 3: LSA = 1; LSB = 1; LSC = 0; break; case 4: LSA = 0; LSB = 0; LSC = 1; break; case 5: LSA = 1; LSB = 0; LSC = 1; break; case 6: LSA = 0; LSB = 1; LSC = 1; break; case 7: LSA = 1; LSB = 1; LSC = 1; break; } } // 读取键值函数 uchar getKey() { uchar val = 0xff; keyOut1 = 0; if (keyIn1 == 0) { val = 0; } if (keyIn2 == 0) { val = 1; } if (keyIn3 == 0) { val = 2; } if (keyIn4 == 0) { val = 3; } keyOut1 = 1; keyOut2 = 0; if (keyIn1 == 0) { val = 4; } if (keyIn2 == 0) { val = 5; } if (keyIn3 == 0) { val = 6; } if (keyIn4 == 0) { val = 7; } keyOut2 = 1; return val; } void main() { uchar i, j, val; while(1) { for (i = 0; i < 8; i++) { selectPos(i); P0 = numCode[i]; for (j = 0; j < 50; j++); // 延时 P0 = 0x00; } val = getKey(); // 读取按键值 if (val != 0xff) { P0 = numCode[val]; while(getKey() != 0xff); // 等待按键松开 } } } ``` 这个程序使用了一个8位数码矩阵和4个按键,每次循环遍历数码管的每一位,并在每一位上显示相应的数字。同时,程序会不断地读取按键值,如果有按键按下,则在数码管上显示相应的数字。需要注意的是,这个程序只能显示0-7这8个数字,如果想要显示更多数字,还需要对`numCode`数组进行扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值