微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 2个I/O 口检测6个按键

2个I/O 口检测6个按键

时间:11-25 来源:互联网 点击:
今天看到了用2个I/O口来检测6个按键的方法,确实很霸道,特传上来和大家一起分享。
原理图如下:


分析:
首先:IO1,IO2输出高电平
S1按下,IO2为低电平
S2按下,IO1为低电平
S3按下,IO1,IO2为0.7V(1N4148导通电压),还是低电平。
现在开始判别其他几个按键了:
1、IO1输出低电平,读IO2电平
如果IO2为低电平,此时应该是S4或者S6按下(S6按下时,IO2为0.7V,依旧是低电平)。
此时IO1输出高电平,IO2输出低电平,读IO1电平
当S4按下时,IO1为低电平。剩余的就只能是S6了。
2、IO1输出高电平,IO2输出低电平
读IO1,S5按下时,IO1为低电平。若IO1依旧为高电平,则是S6按下了。

按键扫描程序:
unsignedcharscan_key(void)
{
unsignedcharkeyval=0;//无键,有键1~6

KEY_IO1=1;//释放总线
KEY_IO2=1;//释放总线

if(!KEY_IO1&&!KEY_IO2)
keyval=3;//S3
elseif(!KEY_IO1)
keyval=2;//S2
elseif(!KEY_IO2)
keyval=1;//S1
else
{
//开始扫描,也要考虑小毛贼的问题~~~
KEY_IO1=0;//扫描
if(!KEY_IO2)
{
//这时不能立即判定S4/S6
KEY_IO1=1;//释放总线
KEY_IO2=0;//反向扫描
if(!KEY_IO1)
keyval=4;//S4~~~
else
keyval=6;//S6
}
else
{
//只能是S5了
KEY_IO1=1;//释放总线
KEY_IO2=0;//反向扫描

if(!KEY_IO1)
keyval=5;//S5
//elsekeyval=6;//S6//上面已判出了S6,这句是废话
}
KEY_IO1=1;//释放总线//已经释放~~~
KEY_IO2=1;//释放总线
}
returnkeyval;//返回键值0-无键,1~6-S1~S6键
}

程序流程图:

由于演示图片是动态的,此处无法进行演示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top