C51:矩阵键盘(三行按键法)

跟独立按键一样,矩阵键盘也可以用三行按键法编程,不仅可以大大减少代码量,还可以提升编程速度。

首先要进行和列扫描,读取键值,原理与上一篇博客的状态机法相同,先给高四位赋值为0,再给低四位赋值为0,来判断按键所在的行和列。

以下为读取键值的函数源码:

unsigned char KBD_KeyIO_ThreeLine()
{
	unsigned char key_io = 0xff;
	P3=0xf0;P4=0xff;	//行扫描
	if(P44==0) key_io=0x70;
	if(P42==0) key_io=0xb0;
	if(P35==0) key_io=0xd0;
	if(P34==0) key_io=0xe0;

	P3=0x0f;P4=0x00;	//列扫描
	if(P33==0) key_io=key_io | 0x07;
	if(P32==0) key_io=key_io | 0x0b;
	if(P31==0)key_io=key_io | 0x0d;
	if(P30==0) key_io=key_io | 0x0e;
	
	return key_io;
}

解释:

例如 :S7按下,那么P30,P44为0,其他的位都是1,所以P44_P42_P35_P34_P33_P32_P31_P30为0111 1110,也可以表示为0x7f,其它的按键同理。那么分别进行行扫描和列扫描,在进行行扫描的时候对key_io赋值,列扫描的时候进行 | 操作,就可以得到最后的字节数据,并返回该值。

三行按键法:

三行按键法原理比较难懂,大家也没有必要硬抠,能记住就好了。矩阵键盘的三行按键法与独立按键的写法极其相似

unsigned char Trg; 
unsigned char Cont; 
void KBD_Read_ThreeLine() 
{ 
    unsigned char ReadData = KBD_KeyIO_ThreeLine() ^ 0xff;  
    Trg  = ReadData & (ReadData ^ Cont); 
    Cont = ReadData; 
} 

在执行操作函数里我们是通过Trg的值来判断按下的是哪一个键。

键值查找表:

    S7   

    0x81

   S11 

   0x41

   S15  

   0x21

   S19 

   0x11

   S6

   0x82

  S10 

   0x42

   S14  

   0x22

   S18  

   0x12

   S5 

   0x84

  S9 

   0x44

   S13

   0x24

   S17  

   0x14i

   S4  

   0x88

  S8  

   0x48

   S12

   0x28

   S16  

   0x18

在函数中判断键值的话,就可以直接使用if语句进行判断,例如:if(Trg==0x81),判断的就是S7是否按下。

最后是一个简单的程序示例:

unsigned char cnt_kbd;
unsigned char kbd_number;
void KBD_Process(void)
{	
	if(cnt_kbd>=10)
	{
		cnt_kbd=0;
		KBD_Read_ThreeLine(); //每10ms执行一次读取键值函数
		if(Trg==0x88)			//S4按下
		{
			kbd_number++;  //这里可以通过对按键的判断执行任何操作,我这里是每当S4按下时让 kbd_number这个变量+1
		}
    }
}

void Timer2_ISR(void)  interrupt 12
{
 cnt_kbd++;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的倒霉蛋

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值