1、矩阵键盘的工作原理:
1)接口电路:在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式,例如本例中的16个按键,被排列成了如下图所示的4X4矩阵方式。即由4根行线和4根列线组成,每个行线和列线的交叉点既是一个按键。这样共需8个IO口。
2)工作原理
使用矩阵键盘的关键是如何判断那个按键被按下。根据下面的电路图,如果已知P1.0端口被置为低电平“0”,那么当按键K0被按下时,可以肯定P1.4端口的电平也变为了低电平“0”。基于这个原理,总结矩阵键盘识别按键的步骤如下:
a)首先判断是否有按键被按下。将全部行线置为低电平“0”,全部列线置为高电平“1”。然后检测列线的状态。只要有一根列线的电平为低,则表示有按键被按下。否则没有按键按下。
b)按键消抖。当判断到有按键被按下后,还要进行消抖处理,以确认真正有按键被按下。
c)按键识别:当确认有键被按下后,采用逐行扫描的方法来确定是哪一个按键被按下。先扫描第一行,即将第一行输出低电平“0”,然后读取列值,那一列出现低电平“0”,则说明该列与第一行交叉处的按键被按下。如果读入的列值全部为"1",说明与第一行连接的按键均没有被按下。那么接下来开始扫描第二行,以此类推。直到完成全部行线的扫描。
本例中矩阵键盘中P1端口低4位连接的是列线,高4位连接的是行线。
2、在keil c51中新建工程ex70,编写如下程序代码,编译并生成ex70.hex文件
//数码管显示4X4矩阵键盘键值
#include <reg51.h>
//数码管段码表,共阳极段码表,实际电路用的共阴极数码管
unsigned char code disp_buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
//上次按键和当前按键序号,该矩阵中序号范围0-15,16表示无按键
unsigned char pre_keyno = 16,keyno = 16;
//延时函数
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
//按键扫描函数,首先判断按键发生在那一列,然后根据所发生的行附加不同的值,从而得到键盘按键序号
void key_scan(void)
{
unsigned char i;
//高4位置1,放入4行
P1 = 0x0f;
delayms(1);
//有键按下后,其中一列将变为低电平
i = P1^0x0f;
//判断按键发生在哪一列
switch(i)
{
case 1: keyno = 0;break;
case 2: keyno = 1;break;
case 4: keyno = 2;break;
case 8: keyno = 3;break;
default: keyno = 16; //无键按下
}
//低四位置1,放入4列
P1 = 0xf0;
delayms(1);
//
i = P1 >> 4 ^ 0x0f;
//对0-3行分别附件起始值
switch(i)
{
case 1: keyno += 0;break;
case 2: keyno += 4;break;
case 4: keyno += 8;break;
case 8: keyno += 12;break;
}
}
// 主函数
void main(void)
{
P0 = 0x00;
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0) //扫描键盘获得按键序号
{
key_scan();
}
if(pre_keyno != keyno)
{
P0 = ~disp_buff[keyno]; //显示,共阳极段码取反作为共阴极段码
pre_keyno = keyno;
}
delayms(100);
}
}
3、在proteus中新建仿真文件ex70.dsn,电路原理图如下所示
4、将ex70.hex文件载入at89c51中,注意将晶振频率改为11.0592MHz,启动仿真,按动按键,观察运行结果。下图是某一时刻程序运行结果
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。