文档介绍:单片机按键连接方法
单片机按键连接方法总结〔五种按键扩展方案详细介绍〕
单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更全输出高电平。如果这个时候从P00到P03的任意一个端口检测到低电平,很容易知道是按下了那个键,肯定是s13到s16的其中一个。如果没有检测到信号,就进行下一次的检测,让P01到P03为高电平,P00为低电平,然后检测P01到P03的状态。如果P01为低,那么按下的是s1,;P02为低,那么按下的是s2;P03为低,那么按下的是s3。
然后再让P00,P02,P03为高电平,P01为低电平。同理用上面的方法可以检测出按下的那个按键。〔
局部程序源代码会在后面贴出来,阅读代码可以更好理解电路〕
5〕、接下来这种方案那么更为强大。不过需要用到一个A/D转换器〔有的单片机集成有A/D转换器,那么更为方便〕。如果A/D转化器的分辨率为n位,理论上是可以扩展2^n〔2的n次方〕个按键。
    这是一种接AD转化器的方案,有两种:第一种是并联式;第二种是串联式。在功能上也有些不同。第一种的话各个电阻值各不相同,当按下不同按键时,进入AD的模拟量是不一样的,通过AD转换,就可以得到按下的是哪个按键。方式一还可以同时识别多个按键,即可以设置组合键,只要电阻取得适宜。
方式二各个电阻可以取一样的,方便计算,但是不能有组合按键。因为当按下上面的按键后,下面所有按键都会被短路。〔在实际运用中,还需要接地,这里没有画出〕 。前面说理论上可以扩展2^n个按键,这只是理论,因为这里电阻的精度有限,所以实际是不可能的,两个模拟量之间要有足够大的差值,程序才可能准确的分辨。
 
上面就是我介绍的五种按键扩展方案,后面几种比较另类,不过也有他们的优点。以上电路我都仿真过,可以实现。
附方案4键盘扫描源代码:
sbit line_1=;
sbit line_2=;
sbit line_3=;
sbit line_4=
char key=0;  
void key_scan()
{
    line_1=line_2=line_3=line_4=1;
        if(~(line_1&&line_2&&line_3&&line_4))
     {
        if(line_1==0) {key=13;return;}
        if(line_2==0) {key=14; return;}
        if(line_3==0) {key=15;return;}
        if(line_4==0) {key=16; return;}
     }
      
    line_2=line_3=line_4=1;
    line_1=0;
        if(~(line_2&&line_3&&line_4))
     { 
            delay();
            if(line_2==0) {key=1;return;}
            if(line_3==0) {key=2;return;}
            if(line_4==0) {key=3;return;}
     }
    line_1=line_3=line_4=1;
   
 line_2=0;
        if(~(line_1&&line_3&&line_4))
     { 
            delay();
            if(line_3==0) {key=5;return;}
            if(line_4==0) {key=6;return;}
     }
    line_1=line_2=line_4=1;
    line_3=0;
        if(~(line_2&&line_1&&line_4))
     { 
            delay();
            if(line_4==0) {key=9;return;}
     }
    line_4=0;
    line_1=line_2=line_3=1;
        if(~(line_2&&line_3&&line_1))
     { 
            delay();
            if(line_1==0) {key=10;return;}