两个IO 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按下了。
按键扫描程序:
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键
}
流程图: