独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
独立键盘理想的波形是按下去时保持低电平,实际上在上升沿和下降沿的过程中(即按键和离键时的一段微小时间)会出现抖动。消抖的方法有两种,一种是通过硬件:在电路上连个电容;另一种是软件消抖,根据经验增加10ms的延时。
扩展资料:
按键分类与输入原理:
按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。
在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。
对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键的功能程序,执行完成后再返回主程序。
这个很好处理呀,比如以下举例,独立+矩阵,实现独立按键相当于类似SHIFT作用的效果。#include<reg51.h>
#define uchar unsigned char
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} //0到f
uchar keyval,num
sbit skey=P1^0 //独立键P1.0
void delay(uchar a)
{
uchar i,j
for(i=0i<ai++)
for(j=0j<125j++)
}
uchar kbscan(void)//矩阵键扫描程序
{
unsigned char sccode,recode
P3=0x0f //发0扫描,列线输入
if ((P3 &0x0f) != 0x0f) //有键按下
{
delay(20) //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0
while((P3&0x0f)!=0x0f)//等待键抬起
return((~sccode)+(~recode))
}
else
sccode=(sccode<<1)|0x01
}
}
}
return 0 //无键按下,返回0
}
void getkey(void)
{
unsigned char key
key=kbscan()
if(key==0)
{
return
}
switch(key)
{
case 0x11:keyval=7break
case 0x12:keyval=4break
case 0x14:keyval=1break
case 0x18:keyval=10break
case 0x21:keyval=8break
case 0x22:keyval=5break
case 0x24:keyval=2break
case 0x28:keyval=0break
case 0x41:keyval=9break
case 0x42:keyval=6break
case 0x44:keyval=3break
case 0x48:keyval=11break
case 0x81:keyval=12break
case 0x82:keyval=13break
case 0x84:keyval=14break
case 0x88:keyval=15break
default:keyval=0xffbreak
}
//以下处理独立按键
if(skey==0)
{
if(keyval!=0xff)keyval+=16 //如果独立键按下,键值加16
while(skey==0) //等待独立键释放
}
}
void t0isr() interrupt 1
{
TH0=(65536-10000)/256
TL0=(65536-10000)%256
switch(num)
{
case 0:P2=0x01break
case 1:P2=0x02break
case 2:P2=0x04break
case 3:P2=0x08break
default:break
}
if(keyval<16) P0=~tab[keyval] //独立键未按正常显示
else P0=~(tab[keyval]|0x80) //独立键按下显示+DP
num++
num&=0x03
}
main()
{
TMOD=0x01
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TR0=1
ET0=1
EA=1
while(1)
{
getkey()
}
}
综述独立式按键:直接由I / O线组成的单个按钮电路,其特征在于每个按钮分别占用一条I / O线,适用于八个按键。
我们在使用家用电器时经常需要通过按键给电器输入指令,让电器执行动作。比如电磁炉的开关、电饭煲定时时间设定等等。今天我们来讲一下单片机怎么识别按键 *** 作指令的。
我们知道单片机只能识别高低电平,对于51单片机来说,0V为低电平,5V为高电平。按键就相当于一个开关,按下时导通,按键d开时断开。
在开始写程序之前,我们需要了解一个实际应用的中知识点,按键在按下和释放的时候并不是我们想象的是一个理想的方波脉冲,实际是在电平跳变的时候是有产生抖动的,这些抖动会导致单片机采集按键状态时出现误判的情况。
从实际波形我们可以看到在按键实际波形的中间有一段稳定的波形,我们可以采集这段波形进行判断。也就是说在程序处理中,我们检测到按键按下后延时3~5ms再次检测按键是否处于按下状态。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)