找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2157|回复: 14
收起左侧

按键闪灯提示程序如何做?

[复制链接]
ID:472242 发表于 2021-8-25 08:13 | 显示全部楼层 |阅读模式
100黑币
在执行有按键的功能时,我们为了分辨某一按键是否执行,会在按按键后让相对应的灯闪两下后不闪,请问这种程序怎么做
回复

使用道具 举报

ID:161164 发表于 2021-8-25 08:13 | 显示全部楼层
  1. #include <reg52.h>
  2. #define ufloat unsigned float
  3. #define uchar  unsigned char
  4. #define uint   unsigned int
  5. uchar  LedOnCount, CONT, JJ;
  6. uint Flash_Delay, m, n;//<<<<<<<<<<<<<<<<<<<注意大于255的变数要用uint
  7. sbit SW  = P1^0;
  8. sbit LED = P2^0;        //输出口;

  9. bit  key_In;

  10. static     uchar f_SW=1;                //按键松开标志
  11. static     uchar f_long_SW=0;                        //长按动作标志,为1时,长按已动作,为0时长按未动作

  12. int main (void)
  13. {

  14.     P2 = 0;
  15.     P1 = 0xff;
  16.     SW = 1;
  17. //key_In = 1;//<<<<<<<你还是不了解这按键标置位的用法
  18.     while (1)
  19.     {
  20.         if(SW == 0)
  21.         {
  22.             f_SW=0;                //按键按下标志
  23.                                                 if(++n>100)//<<<<<<<<<<<<<<<一个循环的时间太短,m一下子就加爆了,延时一下
  24.                                                 {
  25.                                                         n=0;
  26.                                                         m++;
  27.                                                 }
  28.         }else{
  29.                                         f_SW=1;                //按键松开标志
  30.                                         n=0;//<<<<<<<<<<<清零
  31.                                 }



  32.         if((f_SW==1)&&(m>10)&&(m<200))        //按键松开,并且m值处于10~200之间,为短按//<<<<<<<<<<<<<长按和短按的时间要有差别
  33.         {
  34.             m=0;
  35.             CONT++;

  36.             if(CONT == 2)CONT = 0 ;
  37.             //if(CONT == 1)
  38.             {

  39.             }
  40.             //if(CONT == 0)  LED = 0;
  41.                                                 key_In = 1;
  42.         }

  43.                                 if(key_In == 1)         //按键标置位bit
  44.                                 {
  45.                                                 if(++Flash_Delay>1000)  //闪灯延时int
  46.                                                 {
  47.                                                                 Flash_Delay = 0;
  48.                                                                 if(LED == 1) //闪灯脚sbit
  49.                                                                 {
  50.                                                                                 LedOnCount++;//闪灯次数char
  51.                                                                                 LED = 0;
  52.                                                                 } else
  53.                                                                 {
  54.                                                                                 LED = 1;
  55.                                                                 }
  56.                                                                 if(LedOnCount == 2)
  57.                                                                 {
  58.                                                                                 key_In = 0;
  59.                                                                                 LedOnCount = 0;
  60.                                                                 }
  61.                                                 }
  62.                                 }
  63.         if(m>=500)&&(f_long_SW==0)
  64.         {
  65.             f_long_SW=1;
  66.             {
  67.                 f_long_SW=0;//<<<<<<<<<<不明白这里想干啥
  68.                 m=0;
  69.             }
  70.         }
  71.     }
  72. }
复制代码


回复

使用道具 举报

ID:332444 发表于 2021-8-25 11:18 | 显示全部楼层
计数延时取反

评分

参与人数 1黑币 +15 收起 理由
shuisheng60 + 15 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:161164 发表于 2021-8-25 11:45 | 显示全部楼层
本帖最后由 lkc8210 于 2021-8-25 11:47 编辑
  1. if(key_In){//按键标置位bit
  2.         if(++Flash_Delay>1000){//闪灯延时int
  3.                 Flash_Delay = 0;
  4.                 if(LED==On){//闪灯脚sbit
  5.                         LedOnCount++;//闪灯次数char
  6.                         LED = Off;
  7.                 }else{
  8.                         LED = On;
  9.                 }
  10.                 if(LedOnCount==2){
  11.                         key_In = 0;
  12.                         LedOnCount = 0;
  13.                 }
  14.         }
  15. }
复制代码

评分

参与人数 1黑币 +15 收起 理由
shuisheng60 + 15 赞一个!

查看全部评分

回复

使用道具 举报

ID:332444 发表于 2021-8-25 11:58 | 显示全部楼层
单独写一个闪烁函数按键按下执行
回复

使用道具 举报

ID:850120 发表于 2021-8-25 13:36 | 显示全部楼层
本帖最后由 电子发烧烧烧友 于 2021-8-25 13:51 编辑

假如你需要分辨的是三个按键(多个也是一样的思路)伪代码如下:
void LED_blink(int LED)
{
     LED=1;//LED亮
     delay();
     LED=0;//LED灭
     delay();
}
void key_set()
{
   if(key1==0)//按键1按下
   key=key1;
   if(key2==0)//按键2按下
   key=key2;

   if(key3==0)//按键3按下
   key=key3;


}
void key_down()
{
key_set();
switch(key)
{
case key1:               //按键1按下
        while(key1!=0); //假设低电平代表按下,直到按键松开才执行
       {
         LED_blink(LED1);
         LED_blink(LED1);//闪烁两次
       }break;
case key2:               //按键1按下
        while(key2!=0); //假设低电平代表按下,直到按键松开才执行
       {
         LED_blink(LED2);
         LED_blink(LED2);//闪烁两次
       }break;

case key3:               //按键1按下
        while(key3!=0); //假设低电平代表按下,直到按键松开才执行
       {
         LED_blink(LED3);
         LED_blink(LED3);//闪烁两次
       }break;

}
}

评分

参与人数 1黑币 +15 收起 理由
shuisheng60 + 15

查看全部评分

回复

使用道具 举报

ID:716656 发表于 2021-8-25 15:11 | 显示全部楼层
检测到按键松手后,变量++或用定时器计数,满足要求后,执行void LEDSHANSHUO()
回复

使用道具 举报

ID:472242 发表于 2021-8-25 18:42 | 显示全部楼层

我的按键已经进入模式一了,不再需要考按键松手与未松手,功能模块都在执行了,闪两只表示进入模式1,闪三下表示进入模式2
回复

使用道具 举报

ID:472242 发表于 2021-8-25 18:44 | 显示全部楼层
电子发烧烧烧友 发表于 2021-8-25 13:36
假如你需要分辨的是三个按键(多个也是一样的思路)伪代码如下:
void LED_blink(int LED)
{

不是区分按键,是用闪灯次数确认模式在那一档位
回复

使用道具 举报

ID:472242 发表于 2021-8-25 18:59 | 显示全部楼层
shuisheng60 发表于 2021-8-25 18:42
我的按键已经进入模式一了,不再需要考按键松手与未松手,功能模块都在执行了,闪两只表示进入模式1,闪 ...

51hei截图20210825185753.jpg
这样试了一下,没有反应

#include <reg52.h>
#define ufloat unsigned float
#define uchar  unsigned char
#define uint   unsigned int
uchar Flash_Delay, LedOnCount;
sbit key_In = P1^0;
sbit LED = P2^0;        //输出口;


void init ()                                //初始化子函数
{
        TMOD = 0x01;                        //定时器0模式;
        TH0  = (65536-10)/256;        //附高8位初值(0.01ms);
        TL0  = (65536-10)%256;        //附底8位初值(0.01ms);
        EA   = 1;                        //开总中断;
        ET0  = 1;                        //开定时器0中断;
        TR0  = 1;                        //开启定时器0;
}
int main (void)
{
        init();
        P2 = 0;          P1 = 0; key_In = 1;
        while (1)
        {
                if(key_In)         //按键标置位bit
                {
                        if(++Flash_Delay>100)  //闪灯延时int
                        {
                Flash_Delay = 0;
                if(LED == 1) //闪灯脚sbit
                                {
                                        LedOnCount++;//闪灯次数char
                                        LED = 0;
                }else
                                {
                                        LED = 1;
                }
                if(LedOnCount==2)
                                {
                                        key_In = 0;
                                        LedOnCount = 0;
                }
                               
                        }
                        //return 0;
                }
               
        }
        }       
               
               
                void timer0() interrupt 1
                {
                        TH0  = (65536-10)/256;
                        TL0  = (65536-10)%256;     
                }

回复

使用道具 举报

ID:161164 发表于 2021-8-25 21:38 来自手机 | 显示全部楼层
shuisheng60 发表于 2021-8-25 18:42
我的按键已经进入模式一了,不再需要考按键松手与未松手,功能模块都在执行了,闪两只表示进入模式1,闪 ...

这与你一开始说的要求不一样啊! 老弟~
你开贴时只说闪灯用来表示按键按下,
从来没有过模式什么的,
下次问问题要把要求都说出来
不要说一半不说一半的
Screenshot_2021-08-25-21-36-16-471_com.android.chrome~01.jpg
回复

使用道具 举报

ID:161164 发表于 2021-8-25 21:45 | 显示全部楼层
shuisheng60 发表于 2021-8-25 18:59
这样试了一下,没有反应

#include

key_In是按键标置位而不是按键啊~老弟~
扫描到有键按下才把key_In置1,
闪完灯会自动把key_In清零
回复

使用道具 举报

ID:472242 发表于 2021-8-26 09:20 | 显示全部楼层
lkc8210 发表于 2021-8-25 21:45
key_In是按键标置位而不是按键啊~老弟~
扫描到有键按下才把key_In置1,
闪完灯会自动把key_In清零

现在按你的意㽖这样整了一下,还是不行

#include <reg52.h>
#define ufloat unsigned float
#define uchar  unsigned char
#define uint   unsigned int
uchar Flash_Delay, LedOnCount, m, CONT, JJ;
sbit SW  = P1^0;
sbit LED = P2^0;        //输出口;

bit  key_In;

static     uchar f_SW=1;                //按键松开标志
static     uchar f_long_SW=0;                        //长按动作标志,为1时,长按已动作,为0时长按未动作

int main (void)
{
       
        P2 = 0;          P1 = 0; SW = 1;key_In = 1;
        while (1)
        {         
                if(SW == 0)
                       
        {
                        f_SW=0;                //按键按下标志
                        m++;
        }
               
        else     f_SW=1;                //按键松开标志
               
               
               
        if((f_SW==1)&&(m>10)&&(m<500))        //按键松开,并且m值处于10~500之间,为短按
                       
        {
                        m=0;
                        CONT++;       
                       
                        if(CONT == 2)CONT = 0 ;
                        if(CONT == 1)  
                        {
                                if(key_In == 1)         //按键标置位bit
                                {       
                                        if(++Flash_Delay>1000)  //闪灯延时int
                                        {
                                                Flash_Delay = 0;
                                                if(LED == 1) //闪灯脚sbit
                                                {
                                                        LedOnCount++;//闪灯次数char
                                                        LED = 0;
                                                }else
                                                {
                                                        LED = 1;
                                                }
                                                if(LedOnCount == 2)
                                                {
                                                        key_In = 0;
                                                        LedOnCount = 0;
                                                }
                                        }
                                }
                               
                        }
                        if(CONT == 0)  LED = 0;
        }
               
        if((m>=500)&&(f_long_SW==0))                              
                       
        {                                                
                        f_long_SW=1;                                                   
                       
                        {
                f_long_SW=0;   
                               
                m=0;      
                        }
                }
        }
}


回复

使用道具 举报

ID:472242 发表于 2021-8-26 12:37 | 显示全部楼层

很感谢!就是这个效果,----------<<<<<<<<<<不明白这里想干啥,是打算做称按键的
回复

使用道具 举报

ID:472242 发表于 2021-8-26 12:42 | 显示全部楼层
如何把悬赏黑币发给解决问题的人? lkc8210解决了问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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