2个I/O 口检测6个按键_过路老熊_新浪博客

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

今天看到了用2个I/O口来检测6个按键的方法,确实很霸道,特传上来和大家一起分享。

    原理图如下:

2个I/O <wbr><wbr>口检测6个按键

   

分析:

首先:IO1IO2输出高电平

S1按下,IO2为低电平

S2按下,IO1为低电平

S3按下,IO1IO20.7V1N4148导通电压),还是低电平。

现在开始判别其他几个按键了:

1IO1输出低电平,读IO2电平

① 如果IO2为低电平,此时应该是S4或者S6按下(S6按下时,IO20.7V,依旧是低电平)。

② 此时IO1输出高电平,IO2输出低电平,读IO1电平

   当S4按下时,IO1为低电平。剩余的就只能是S6了。

2IO1输出高电平,IO2输出低电平

   读IO1S5按下时,IO1为低电平。若IO1依旧为高电平,则是S6按下了。

 

按键扫描程序:

unsigned char scan_key(void) 

{

unsigned char keyval = 0;//无键,有键1~6

 

KEY_IO1 = 1;//释放总线

KEY_IO2 = 1;//释放总线

 

if (!KEY_IO1 && !KEY_IO2) 

keyval = 3;//S3

else if (!KEY_IO1) 

keyval = 2;//S2

else if (!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

//else keyval = 6;//S6//上面已判出了S6,这句是废话

}

KEY_IO1 = 1;//释放总线//已经释放~~~

KEY_IO2 = 1;//释放总线

}

return keyval;//返回键值0-无键,1~6-S1~S6

}

 

程序流程图:

2个I/O <wbr><wbr>口检测6个按键

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值