用的51单片机,附电路图。
按键KEY与数码管COM端是复用的。
现在可以知道,把数码管的数据输出端设置为高阻输入。
按键即(COM)端,设置为标准IO口,可以检测到按键输入。
数码管显示时,
数码管的数据输出端设置为推挽输出。
按键即(COM)端,同时要设置为推挽才可以显示正常,
数码管显示用的是定时器中断显示。(6ms)。
按键在主循环,扫描输入(100ms)扫描1次。
用了按键程序,LED显示不正常。
用了LED显示程序,按键程序不正常。
不知道为什么?有没有人指一下点?
KEY_COM.jpg (320.99 KB, 下载次数: 1)
下载附件
按键数码管复用电路
2013-5-15 08:40 上传
6MS*4=24MS了,也算可以吧
按键100MS就太长了,要是10次消抖动的话,岂不是1秒钟才能反应过来?
说一下我的设计习惯,把按键的COM接到一个IO上,每个按键串联二极管(防止两个同时按下时影响显示),在扫描显示输出的时候,读一下这个IO就行了,这样不用来回倒腾什么推挽啥的了,简单方便。我用的定时中断是2MS的,消抖动是计数10次有效,否则视为无效。
{
P2IO &=0xe1; //*1110 0001*//
delay(100);
key_buf=0; //清按键值
P1&=0x02; //关显示
key_com=0; //开启按键公共端
delay(100);
if(key_2==0){key_buf|=0x01;} //读按键1
if(key_3==0){key_buf|=0x02;} //读按键2
if(key_4==0){key_buf|=0x04;} //读按键3
if(key_5==0){key_buf|=0x08;} //读按键4
P2IO |=0x1e; //*0001 1110*//
key_com=1; //释放按键公共端
if(key_buf==0) //无键
{
keyup_bit=0; //按键释放标志
flash_not_bit=0;
key_cnt_short=0; //清去抖计数
key_cnt_long=0; //清长按计数
}
else //有键处理
{
if(keyup_bit) //按键按下标志
{
if(++key_cnt_long>=200) //长按 40->200
{
key_cnt_long-=50; //4Hz 15->50
flash_not_bit=1; //快速调节不闪烁
key_pro(); //按键处理
}
else
{
return;
}
}
else //
{
if(++key_cnt_short>=20) //去抖 5->20
{
key_cnt_short=0;
keyup_bit=1; //短按
short_buz(1,short_buz_time);
key_pro();
}
}
}
}
因为共阴极没有用三极管驱动,要点亮数码管,必须要设定公共端为推挽输出,数码管数据端也必须设定为推挽输出才能点亮。
其它方式都不行。
要按键检测也必须设定数码管数据端为高阻输入,数码管公共端,即按键检测端为标准IO,才可以检测到按键。
其它方式都不行。
所以上述程序为什么要先设定端口模式的原因。
{
WDT_action();//喂狗
if ( g_time_5MS_Fg )//5ms数码管显示
{
g_time_5MS_Fg = 0;
Display_Led();//LED显示程序不能跟下面Get_Key按键检测同时,用了数码管会闪,没有按键也会按下输出。
g_key_scan_count++;
if ( g_key_scan_count >= 20 )//100ms
{
g_key_scan_count = 0;
//key = Get_Key ( );
}
}
我刚刚整了个140多个数码管,30多个按键,数据IO口复用的,显示跟按键扫描都很正常。
一周热门 更多>