Ct107D开发板按键识别

按键

原理图

按键模块
CT107D开发板上独立按键与矩阵按键通过J5来控制;
当J5排针2,3相接为独立按键功能。当1,2相接为矩阵按键功能。

按键识别原理

独立按键
独立按键相对于矩阵按键简单一些,当单片机检测出按键按下输出相应的值。
矩阵键盘
单片机外部设备中所使用的排布类似于矩阵的键盘组。在键盘中按键数量较多时,
为了减少 I/O 口的占用,通常将按键排列成矩阵形式。在矩阵键盘中,在每条水平线和垂直线交
叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如 P0 口)就可以构成 4×4=16
个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线
就可以构成 20 键的键盘,而直接用端口线则只能多出一键(9 键)。由此可见,在需要的键数比
较多时,采用矩阵键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,
并将行线所接的单片机的 I/O 口作为输出端,而列线所接的 I/O 口则作为输入端。这样,当按键
没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则
输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
矩阵键盘中按键的识别有行扫描和线翻转两种方法,其中行扫描法是一种最常用的按键识别
方法,过程如下:
(1)逐行输出 0,检查列线是否非全高;
(2)如果某行输出 0 时,查到列线非全高,则该行有按键按下;·39·
(3)根据输出 0 的行线和读入 0 的列线,即可判断按下按键的位置。

代码

首先需要一个5-10ms的延时函数,来进行按键的软件的消抖。

/*************************************************
函数功能:10ms延时
*************************************************/
void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

独立按键代码

/*************************************************
函数功能:独立按键
*************************************************/
u8 Key_Init(void)
{
	u8 key_num;
	
	key_num = 0;
	
	S7 = 1;S6 = 1;S5 = 1;S4 = 1;
	
	if(S7 != 1){Delay10ms();if(S7 != 1){key_num = 7;while(S7 != 1);}}
	if(S6 != 1){Delay10ms();if(S6 != 1){key_num = 6;while(S6 != 1);}}
	if(S5 != 1){Delay10ms();if(S5 != 1){key_num = 5;while(S5 != 1);}}
	if(S4 != 1){Delay10ms();if(S4 != 1){key_num = 4;while(S4 != 1);}}
	
	return key_num;
}

矩阵按键代码

//矩阵按键
u8 Key_Init(void)
{
	u8 key_num;
	
	key_num = 0;
	
	ha1 = 1;ha2 = 1;ha3 = 1;ha4 = 1;
	li1 = 0;li2 = 0;li3 = 0;li4 = 0;
	
	if((ha1 != 1)||(ha2 != 1)||(ha3 != 1)||(ha4 != 1))
	{
		Delay10ms();
		if(ha1 != 1)key_num = 7;
		else if(ha2 != 1)key_num = 6;
		else if(ha3 != 1)key_num = 5;
		else if(ha4 != 1)key_num = 4;
		
		ha1 = 0;ha2 = 0;ha3 = 0;ha4 = 0;
		li1 = 1;li2 = 1;li3 = 1;li4 = 1;
		
		if(li1 != 1)key_num += 0;
		else if(li2 != 1)key_num += 4;
		else if(li3 != 1)key_num += 8;
		else if(li4 != 1)key_num += 12;
		
		while((li1 != 1)||(li2 != 1)||(li3 != 1)||(li4 != 1));
	}
	return key_num;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值