2019-07-15 23:25发布
mlongze1206 发表于 2013-7-30 10:50 楼上为什么不选择定时呢?
嵌入式linux工程 发表于 2013-7-30 08:50 想问一下你的按键检测程序是不是这种模式:if(key == 0) { delay_ms(20);
德国蟑螂 发表于 2013-7-31 09:48 按键是弹性按键,按下后弹起,不分长按还是短按,楼下有我想到的一些程序,也是靠延时,能实现效果,但是 ...
嵌入式linux工程 发表于 2013-7-31 15:44 你可以参考一下我写的程序,也可以对比一下吧。在你的程序中执行一次按键检测程序总时间有20ms左右吧,20 ...
最多设置5个标签!
利用定时器怎么说?如果说利用外部中断,让按键成为脉冲触发,这个确实应该是可以的,但是我现在问题是线路固定好了,只能用单片机的P0口来完成,没想到好的触发,我现在想到的一个程序是
void main()
{ P2=0xfe;
num=P2;
while(1)
{
while(P0==0xff);
btn=P0;
if(btn==0xfe)
{
num=_crol_(num,1);
delay(300);
P2=num;
}
if(btn==0xfd)
{
num=_cror_(num,1);
delay(300);
P2=num;
}
}
}
这段程序能实现效果,靠的延时,但是总感觉不好一样
按键是弹性按键,按下后弹起,不分长按还是短按,楼下有我想到的一些程序,也是靠延时,能实现效果,但是感觉不咋好,这里有个更好的给你看看,我看的不清楚#include <reg51.h>#include <intrins.h>
unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit K1 = P0^0; //对应按钮K1
sbit K2 = P0^1; //对应按钮K2
main()
{
unsigned char key_s,key_v;
key_v = 0x03;
P2 = 0xfe;
while(1)
{
key_s = scan_key();
if(key_s != key_v)
{
delayms(10);
key_s = scan_key();
if(key_s != key_v)
{
key_v = key_s;
proc_key(key_v);
}
}
}
}
unsigned char scan_key()
{
unsigned char key_s;
key_s = 0x00;
key_s |= K2;
key_s <<= 1;
key_s |= K1;
return key_s;
}
void proc_key(unsigned char key_v)
{
if((key_v & 0x01) == 0)
{
P2 = _cror_(P2,1);
}
else if((key_v & 0x02) == 0)
{
P2 = _crol_(P2, 1);
}
}
void delayms(unsigned char ms) // 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
你可以参考一下我写的程序,也可以对比一下吧。在你的程序中执行一次按键检测程序总时间有20ms左右吧,20ms中有90%的时间是空出来什么都没做的,这个时间我指的是执行这些语句所需要的时间。再看看我的程序吧,执行定时器中断中所有程序算200us左右吧,在主函数中也算200us左右吧,执行一次按键程序所需语句时间为400us左右吧,其他时间CPU自由扩展,按键一直按下对其他程序没什么影响,因为中断程序时间太短了
首先非常感谢你这么认真为我回答问题,你写的很不错,但是我感觉有点繁琐点了,我主要就是用一个按键直接控制一个灯的亮灭,按键连到P0^0,LED接在P2^0,如果说用到外部中断,那就非常简答,现在不能用这个,你说的我的程序可读性不高,那应该是8楼的吧,但是9楼的程序可读性应该是很好的,你不妨看下九楼的程序。非常感谢你的回答
e ,不好意思,我可能看错了点,是控制流水灯的实现,用两个开关
一周热门 更多>