按键
原理图
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;
}