独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
独立键盘理想的波形是按下去时保持低电平,实际上在上升沿和下降沿的过程中(即按键和离键时的一段微小时间)会出现抖动。消抖的方法有两种,一种是通过硬件:在电路上连个电容;另一种是软件消抖,根据经验增加10ms的延时。
sbit key = P1 ^ 1;
while(!key); //有按键抬起
delay_ms(10);
while(!key); //确实有按键抬起
这样即能起到消抖的作用。
独立键盘有扫描法和中断法。
下面主要介绍中断法:
1.打开总中断
2.设置外部中断的触发方式 (TCON寄存器)
IT0:INT0: 1 负边缘触发(下降) 0 低电平触发
IE0:中断请求标志位
IT1:INT1: 1 负边缘触发(下降) 0 低电平触发
3.打开外部中断
EX0 = 0;
4.外部中断服务函数
void isr_exito() interrupt 0
{
EX0 = 0;
/* 你所实现的功能程序*/
EX0 = 1;
}
下面是一个例子:
void int_init(void) //中断函数
{
EA = 1;
IT0 = 1;
EX0 = 1;
}
void init_isr(void) interrupt 0 //中断服务函数,实现的功能是在数码管上显示数字,按键按一下+1,范围0~99
{
static unsigned char disdata = 0;
EX0 = 0;
delay_ms(10);
if(0 == key1)
{
while(!key1);
delay_ms(10);
while(!key1);
disdata++;
if(100 == disdata)
{
disdata = 0;
}
tempdata[0] = segdata[disdata / 10];
tempdata[1] = segdata[disdata % 10];
}
EX0 = 1;
}