按键显示数字,按下到弹起期间数码管变暗是什么原因
使用线反转法扫描
代码如下:
- uchar num = 0x10; // 0x10 indicate character H
- void keyscan()
- {
- uchar key = 0xff; // no key pressed
- uchar i;
- P1 = 0x0f;
- if(P1 != 0x0f)
- {
- delay(10);
- if(P1 != 0x0f)
- {
- key = P1;
- P1 = 0xf0;
- key += P1;
- }
- }
- for(i=0;i<16;i++) // if set i<17;then after release the key,LED will only show H
- {
- if(key_code[i] == key)
- {
- num = i;
- }
- }
- }
- void display()
- {
- P0 = led_code[num];
- delay(10);
- P0 = 0x00;
- }
- void main()
- {
- while(1)
- {
- keyscan();
- display();
- }
- }
按键没有按下时 数码管也是有轻微亮度变化的 人眼视觉暂留大概是50~200毫秒 有的人长点有的人短点 这多少会影响点视觉敏锐度
程序用的是数码管的静态显示 受视觉暂留影响应该小点
按下按键的时候
if(P1 != 0x0f)
{
delay(10);<-------------------------这里确实是为按下时消抖了,10ms也差不多(下降沿已经检查 ,按键按下后是否也要检查稳定了一段时间 上升沿是否也要检查 ,如果不检查,会不会造成这样一种情况,感觉上按了一下,实际上以单片机的速度处理了N下,由于时间太快 数码管供电持续时间不够还没到完全亮又切换状态了 导致看上去亮度发生了变化),
if(P1 != 0x0f)
...
接下来这段,效率不是很高,
for(i=0;i<16;i++)
{
if(key_code == key)
{
num=i;
break;<---------------------这里给num付完值后就可以跳出了,或者在这里直接点数码管,但display()和keyscan()分开写使代码清晰的做法是对的
。
这是拍的GIF,有点不清晰
变暗的时候就是在按键按下以及释放过程中的效果
会不会是延时时间过长而导致视觉上的闪烁
你按按键的时候比不按按键多执行了
if(P1 != 0x0f)
{
delay(10);
if(P1 != 0x0f)
{
key = P1;
P1 = 0xf0;
key += P1;
}
}
这期间造成了数码管的闪烁
感谢大家的热心帮助和详细解答! ? 我会回去再作修改,多作尝试的
延时调调看看,可能是延时和人眼视觉暂留性引起
