标题:
单片机按键循环闪灯程序,按键不灵敏求大神改进!
[打印本页]
作者:
chinarenxx
时间:
2020-3-28 23:02
标题:
单片机按键循环闪灯程序,按键不灵敏求大神改进!
// 按键循环闪灯程序,可以实现每按一次按键变换不同的闪光频率,只是按键反应是不那么响应快。特别是三连闪的时候有时按键没反应,要长按住按键才会灭灯。
//不管是用if语句,还是switch语句都差不多效果,放在main()里面按键效果也是差不多,求大神改进。点按按键就能实现换灯功能,最好是可以在灭灯的时候可以休眠待机,再按一下又能恢复亮灯。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led = P1^1;
sbit key1 =P3^2; //STC15W408AS此脚为外部中断0,按一次led改变一次状态。
uint knum; //key1按键按下次数计数变量
void keyscan();
void delay(uint xms);
void leds();
void delay(uint xms) //@12.000MHz 大约定时1ms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=460;j>0;j--);
}
void leds()
{
led=0;
delay(300);
led=1;
delay(200);
led=0;
delay(300);
led=1;
delay(200);
led=0;
delay(300);
led=1;
delay(1200);
}
void keyscan()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
knum++;
if(knum==4)
knum=0;
}
}
switch(knum)
{
case 0: led=1; break; //灭灯
case 1: led=0; break; //亮灯
case 2: led=0; delay(500); led=1; delay(500); break; //一闪一灭
case 3: leds(); break; //三闪一灭
}
}
void main()
{
while(1)
{
keyscan();
}
}
作者:
罗程峰8200
时间:
2020-3-29 05:03
switch(knum)的前三步没问题 第四部就会不灵敏了 因为你的LED程序里面的延时函数延时过长导致的,你这种情况最后用中断 或者定时器来处理
作者:
liu5678
时间:
2020-3-29 11:39
case 2: led=0; delay(500); led=1; delay(500); break;
按键延时有些长,闪灯延时又有些短。
作者:
tyrl800
时间:
2020-3-29 14:20
楼主难道不知道单片机有定时器这个东西吗?用定时器都会解决的
作者:
起风了~
时间:
2020-3-29 14:51
你可以试着改一下延时程序,就是定义的void delay那个函数中j数值再改小一点
作者:
chinarenxx
时间:
2020-3-29 15:43
昨天用了,定时中断来控制按键,效果要好很多,可是睡眠模式的时候唤醒操作很迟顿,现在用低功耗模式待机也有4mA的电量消耗。还是达不到uA级别。PCON=0X02这个睡眠模式唤醒有没有大神出手指点一下。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1