2个IO检测6个按键的方法
单片机IO口如果识别更多的按键,简单的方法就是通过控制按键按下,识别电流的流向。这说可能不是很理解,下面就来介绍下,如下图按键识别电路:
按键S1按下,电流是从R1流向GND的,S2按下是从R2流向GND,S3按下是从R1和R2共同流向GND。
S4按下是从IO1流向IO2,也可以从IO2流向IO1,S5按下是从IO1流向IO2,S6按下是从IO2流向IO1。按键按下和电流流向关系如下:
那么这6个按键单片机要怎么识别呢,下面就说下识别思路流程:
1. 先配置IO1和IO2都为1,然后读IO1和IO2,若读到IO1为0,那么S1按下,若读到IO2为0,那么S2按下,若读到IO1和IO2都为0,那么S3按下,若IO1和IO2都没读到0,那么进行下一步;
2. 配置IO1为0,IO2为1,读IO2,若读IO2为1,进入下一步,若IO2读为0,那么可以判断是S4或S6按下,然后再配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S4按下,若IO1读为1就是S6按下了。
3. 配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S5按下了。
将上面的电路图再精简下就是下面的图形了,是不是很有美感,下图还比上图省2个二极管哦。
欢迎评论交流,也欢迎大家关注我:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!
单片机可以实现用2个I/O口实现4个按键的检测,电路见附图。详细的描述请进入我的空间查看,给出了程序流程图。
http://hi.baidu.com/superwolfsc/blog/item/a3fd57f0bcfbcfc70b46e051.html
/*************************************
P0和P1口全是灯,P2.0到P2.3是按键(用不是自动恢复的按键)控制
***************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit change_led;
/*
void delay(uint ms)//延时子程序
{
uint i,
for(;ms>0;ms--)
{for(i=500;i>0;i--){;}}
}
*/
void delay(unsigned ms)
{
uint a;
for(;ms>0;ms--)
{
for(a=500;a>0;a--)
{;}
}
}
void key(void)//按键扫描程序
{
uchar j;
j=P2&0x0f;
delay(100);
if((P2&0x0f)!=j)
{
change_led=1;
}
else
{
change_led=0;
}
}
main(void)
{
uchar led=1;
change_led=0;
while(1)
{
key();
if(change_led==1)
{
if((P2&0x0f)>7)
{
led=0x01<<((P2&0x0f)%8);
P0=0;
P1=led;
}
else
{
led=0x01<<(P2&0x0f);
P1=0;
P0=led;
}
}
}
}