/********************************************************
功能:独立按键测试
时间:2010—7—17
**********************************************************/
#include<reg52.h>
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
P2=0x09;
while(1)
{
if(!key1)
P0=0x06;
if(!key2)
P0=0x5B;
if(!key3)
P0=0x4F;
if(!key4)
P0=0x66;
}
}
/*
定义寄存器P3的4个端子为可寻址位,分别接四个独立按键,按键另一端全部接地,
当按键按下的时候,端口检测到变为低电平,开始为P0赋值。在按键没有被按下的时候,4个
寄存器的32个端口都是高电平,被选中的位8段全亮。
修改了P2=0x09,因为P2出来串接74HC138,本来P2最多等于0x07=0000 0111,经译
码出来的是HHHH HHHL,接共阴数码管的第8位数码管被选中。在P2=0x09=0000 1001,取后
低三位是ABC=001,注意这里A时最高位,也就是点亮第二位数码管,这里可以取 P2=x%8。
---------------------------------------------------------------------------------------------------------------
A B C | Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
----------------------------------------------------------------------------------------------------------------
0 0 0 | L H H H H H H H
0 0 1 | H L H H H H H H
0 1 0 | H H L H H H H H
0 1 1 | H H H L H H H H
1 0 0 | H H H H L H H H
1 0 1 | H H H H H L H H
1 1 0 | H H H H H H L H
1 1 1 | H H H H H H H L
----------------------------------------------------------------------------------------------------------------
显然如果使用共阳数码管,则很难实现选位点亮,可能是选位熄灭。使用万用表
测量按键另一端接地按键按下后确实检测到被按下按键对应的端口为低电平。
独立按键另外一个问题就是抖动,可以用硬件电路或者软件来消除。硬件电路可以
使用SR锁存器(与非门)来构成(参见康华光数字电路)。但最好还是使用软件,延时
程序可以很方便的解决。根据按键的不同机械抖动固有时间,一般情况下为4~15ms。
通过延时躲避抖动,按下和释放都存在抖动,实际使用程序需要两次去抖动。设定时间
为20ms就能满足一般要求。
if(!KEY)
{
DelayMs(10); //按下去抖动
while(!KEY);
if(KEY)
{
DelayMs(10); //释放驱抖动
if(KEY)
{
//启动按键按下后需要执行的程序
}
}
}
本程序存在瑕疵,延时10ms,如果抖动已经结束,此时KEY=1,不必执行while(!KEY),紧
接着执行释放去抖动;但是如果抖动的时间比较长(超过20ms)的话就不好说了。不过本程序的可
取之处时,如果一直按着按键很长时间,相当于按了一次,因为while(!KEY)将按下去的时间消除。
按键控制是单片机和外界通信,接受外界控制的重要机制,在独立按键特别是本程序中,
用不上去抖动,因为抖动对程序不造成任何影响。
*/