找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2338|回复: 5
收起左侧

单片机按键循环闪灯程序,按键不灵敏求大神改进!

[复制链接]
ID:214276 发表于 2020-3-28 23:02 | 显示全部楼层 |阅读模式
5黑币
// 按键循环闪灯程序,可以实现每按一次按键变换不同的闪光频率,只是按键反应是不那么响应快。特别是三连闪的时候有时按键没反应,要长按住按键才会灭灯。
//不管是用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();                 
   }                                               
}

回复

使用道具 举报

ID:89217 发表于 2020-3-29 05:03 | 显示全部楼层
  switch(knum)的前三步没问题   第四部就会不灵敏了  因为你的LED程序里面的延时函数延时过长导致的,你这种情况最后用中断 或者定时器来处理
回复

使用道具 举报

ID:352458 发表于 2020-3-29 11:39 | 显示全部楼层
case 2: led=0;        delay(500); led=1;        delay(500); break;
按键延时有些长,闪灯延时又有些短。
回复

使用道具 举报

ID:275826 发表于 2020-3-29 14:20 | 显示全部楼层
楼主难道不知道单片机有定时器这个东西吗?用定时器都会解决的
回复

使用道具 举报

ID:718123 发表于 2020-3-29 14:51 | 显示全部楼层
你可以试着改一下延时程序,就是定义的void delay那个函数中j数值再改小一点
回复

使用道具 举报

ID:214276 发表于 2020-3-29 15:43 | 显示全部楼层
昨天用了,定时中断来控制按键,效果要好很多,可是睡眠模式的时候唤醒操作很迟顿,现在用低功耗模式待机也有4mA的电量消耗。还是达不到uA级别。PCON=0X02这个睡眠模式唤醒有没有大神出手指点一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表