独立式按键的工作原理

独立式按键的工作原理,第1张

独立按键式直接用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再次检测按键是否处于按下状态。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12028749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存