找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2646|回复: 10
收起左侧

51单片机实现按键长短按和 调光功能,求指导 补充实现一下啊?

  [复制链接]
ID:389488 发表于 2020-8-10 16:17 | 显示全部楼层 |阅读模式
按键1次:led1亮 (长按 亮度调节)
按键2次:led2亮 (长按 亮度调节)
按键3次:led1+2亮 (长按 亮度调节)
按键4次:关
重复

key=1;
if(key==0)
{
delay(10);
if(key==0)
{
cnt++;
if(cnt>3)
cnt=0;
}
if(cnt==1)
{
led1=0;
led2=1;
}
else if(cnt==2)
{
led2=0;led1=1;
}
else if(cnt==3)
{
led1=0;led2=0;
}
else
{
led1=1;led2=1;
}
回复

使用道具 举报

ID:584814 发表于 2020-8-10 22:56 | 显示全部楼层
这个是想当然地写的玩的罢,在坛子里找现成的参考一下如何
回复

使用道具 举报

ID:389488 发表于 2020-8-11 11:20 | 显示全部楼层
man1234567 发表于 2020-8-10 22:56
这个是想当然地写的玩的罢,在坛子里找现成的参考一下如何

谢谢 浴室镜灯
回复

使用道具 举报

ID:190577 发表于 2020-8-11 21:11 | 显示全部楼层
/ 按键
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define key_no 0
#define key_click 1
#define key_double 2
#define key_long 3
sbit KEY = P0^4;
sbit key1=P5^0;// 红光
sbit key2=P3^0;//绿光开关
sbit key3=P0^2;        //蓝
sbit key4=P4^0;        //白
sbit key5=P0^3; //加湿度
sbit key6=P5^2;//自动

static unsigned char key_read(void)
{
        static unsigned char key_state_buffer1 = key_state_0;
        static unsigned char key_timer_cnt1 = 0;
                static         unsigned char temp=0;
        unsigned char key_return = key_no;
       // unsigned char key;

        //key = KEY;  //read the I/O states

        switch(key_state_buffer1)
        {
                case key_state_0:
                        if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0))
                         {  key_state_buffer1 = key_state_1; temp=0;
                                                         return 0;
                                                 }
                                //按键被按下,状态转换到按键消抖和确认状态//
                        break;
                case key_state_1:
                        if(KEY== 0)
                        {
                                temp=1;
                                                            key_timer_cnt1 = 0;
                                key_state_buffer1 = key_state_2;
                                //按键仍然处于按下状态
                                //消抖完成,key_timer开始准备计时
                                //状态切换到按下时间计时状态
                        }
                                                else if(key1==0)
                                                {
                                                           temp=2;
                                                           // key_timer_cnt1 = 0;
                                key_state_buffer1 = key_state_2;
                                                }
                                                else if(key2==0)
                                                {
                                                            temp=4;
                                                           // key_timer_cnt1 = 0;
                                key_state_buffer1 = key_state_2;
                                                }
                                                else if(key3==0)
                                                {
                                                            temp=5;
                                                           // key_timer_cnt1 = 0;
                                key_state_buffer1 = key_state_2;
                                                }
                                                else if(key4==0)
                                                {
                                                            temp=6;
                                                           // key_timer_cnt1 = 0;
                                key_state_buffer1 = key_state_2;
                                                }
                                                else if(key5==0)
                                                {
                                                            temp=7;
                                                           // key_timer_cnt1 = 0;
                                key_state_buffer1 = key_state_2;
                                                }
                                                else if(key6==0)
                                                {
                                                            temp=8;
                                                           // key_timer_cnt1 = 0;
                                key_state_buffer1 = key_state_2;
                                                }
                        else
                                                {
                                key_state_buffer1 = key_state_0; temp=0;
                                                }
                                //按键已经抬起,回到按键初始状态
                        break;  //完成软件消抖
                case key_state_2:
                                                 if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0))
                                                {
                                                         key_state_buffer1 = key_state_2;
                                                         if(temp==1)
                                                         {
                                                                 if(++key_timer_cnt1 >= 100)  //按键继续按下,计时超过1000ms
                                                                 {
                                                                    
                                        key_return = key_long;  //送回长按事件
                                        key_state_buffer1 = key_state_3;  //转换到等待按键释放状态
                                                                 }
                                                          }
                                                }
                                                else
                                                {
                                                         key_return = temp;  //按键抬起,产生一次click操作
                             key_state_buffer1 = key_state_0;  //转换到按键初始状态
                                                }
                       /* if(KEY == 1)
                        {
                                key_return = key_click;  //按键抬起,产生一次click操作
                                key_state_buffer1 = key_state_0;  //转换到按键初始状态
                        }
                        else if(++key_timer_cnt1 >= 100)  //按键继续按下,计时超过1000ms
                        {
                                key_return = key_long;  //送回长按事件
                                key_state_buffer1 = key_state_3;  //转换到等待按键释放状态
                        } */
                        break;
                case key_state_3:  //等待按键释放
                        if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0)) //按键释放
                                key_state_buffer1 = key_state_3;  //切回按键初始状态
                                                 else //按键释放
                                key_state_buffer1 = key_state_0;  //切回按键初始状态
                        break;
        }
        return key_return;
}
回复

使用道具 举报

ID:89515 发表于 2020-8-12 08:47 来自手机 | 显示全部楼层
逻辑错误
回复

使用道具 举报

ID:213173 发表于 2020-8-12 13:13 | 显示全部楼层
按键1次:led1亮 (长按 亮度调节)
按键2次:led2亮 (长按 亮度调节)
按键3次:led1+2亮 (长按 亮度调节)
按键4次:关
重复
初始亮度50%,长按增亮,5秒到100%。
  1. #include<reg52.h>
  2. #define key_S 50                                        //宏定义短按/消抖(约15ms)
  3. #define key_L key_S*35                        //宏定义长按(约500ms)
  4. #define key_I key_S*27                        //宏定义长按连续+/-间隔(约120ms)
  5. #define uint unsigned int
  6. #define uchar unsigned char

  7. sbit key  = P3^5;
  8. sbit LED1 = P3^6;
  9. sbit LED2 = P3^7;

  10. uchar num=0,num1=50,num2=50,num3=50;
  11. uchar KeySec=0;
  12. bit   flag=0;

  13. void delay(uint t)
  14. {
  15.         while(t--);
  16. }

  17. void keyscan()
  18. {
  19.         static unsigned int time=0;//计数变量
  20.         if(!key)
  21.         {
  22.                 time++;
  23.                 if(time>key_L)//长按有效
  24.                         time=key_I;//连续+/-间隔

  25.                 if(time==key_S||time==key_L)//短按消抖或长按连+
  26.                 {
  27.                         if(!flag)
  28.                         {
  29.                                 flag=1;
  30.                                 KeySec++;
  31.                         }
  32.                         switch(KeySec)
  33.                         {
  34.                                 case 1: if(num1<100)num1++;break;
  35.                                 case 2: if(num2<100)num2++;num1=50;break;
  36.                                 case 3: if(num3<100)num3++;num2=50;break;
  37.                                 case 4: KeySec=0;num3=50;break;
  38.                         }
  39.                 }
  40.         }
  41.         else
  42.         {
  43.                 time=0;
  44.                 flag=0;
  45.         }
  46. }

  47. void Timer0Init()                //100微秒@12.000MHz
  48. {
  49.         TMOD= 0x02;                //设置定时器模式
  50.         TL0 = 0x9C;                //设置定时初值
  51.         TH0 = 0x9C;                //设置定时重载值
  52.         TF0 = 0;                //清除TF0标志
  53.         TR0 = 1;                //定时器0开始计时
  54.         EA  = 1;                //开总中断
  55.         ET0 = 1;                //开T0中断
  56. }

  57. void main()
  58. {
  59.         Timer0Init();
  60.         while(1)
  61.         {
  62.                 keyscan();
  63.                 delay(8);
  64.         }
  65. }

  66. void timer0() interrupt 1
  67. {
  68.         num++;
  69.         if(num>100)
  70.                 num=0;
  71.         if(KeySec==0)
  72.         {
  73.                 LED1=1;
  74.                 LED2=1;
  75.         }
  76.         if(KeySec==1)
  77.         {
  78.                 if(num1>=num)
  79.                         LED1=0;
  80.                 else LED1=1;
  81.                 LED2=1;
  82.         }
  83.         if(KeySec==2)
  84.         {
  85.                 if(num2>=num)
  86.                         LED2=0;
  87.                 else LED2=1;
  88.                 LED1=1;
  89.         }
  90.         if(KeySec==3)
  91.         {
  92.                 if(num3>=num)
  93.                 {
  94.                         LED1=0;
  95.                         LED2=0;
  96.                 }
  97.                 else
  98.                 {
  99.                         LED1=1;
  100.                         LED2=1;
  101.                 }
  102.         }
  103. }
复制代码
回复

使用道具 举报

ID:389488 发表于 2020-8-14 16:27 | 显示全部楼层
bbxyliyang 发表于 2020-8-11 21:11
/ 按键
#define key_state_0 0
#define key_state_1 1

谢谢坛友!
回复

使用道具 举报

ID:389488 发表于 2020-8-14 16:28 | 显示全部楼层
wulin 发表于 2020-8-12 13:13
按键1次:led1亮 (长按 亮度调节)
按键2次:led2亮 (长按 亮度调节)
按键3次:led1+2亮 (长按 亮度 ...

谢谢坛友的帮助!
回复

使用道具 举报

ID:389488 发表于 2020-8-15 10:54 | 显示全部楼层

都有产品已经实现了
回复

使用道具 举报

ID:845778 发表于 2021-9-9 14:23 | 显示全部楼层
wulin 发表于 2020-8-12 13:13
按键1次:led1亮 (长按 亮度调节)
按键2次:led2亮 (长按 亮度调节)
按键3次:led1+2亮 (长按 亮度 ...

请问这个代码可以在keil5里面跑吗
回复

使用道具 举报

ID:624769 发表于 2021-9-9 23:14 | 显示全部楼层
zzh2118 发表于 2020-8-14 16:28
谢谢坛友的帮助!

我总觉得, 你那么多的  else   if
为什么不换成 switch 看起来整齐一点呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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