久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3857|回復: 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;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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;
}
回復

使用道具 舉報

5#
ID:89515 發表于 2020-8-12 08:47 來自手機 | 只看該作者
邏輯錯誤
回復

使用道具 舉報

6#
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. }
復制代碼
回復

使用道具 舉報

7#
ID:389488 發表于 2020-8-14 16:27 | 只看該作者
bbxyliyang 發表于 2020-8-11 21:11
/ 按鍵
#define key_state_0 0
#define key_state_1 1

謝謝壇友!
回復

使用道具 舉報

8#
ID:389488 發表于 2020-8-14 16:28 | 只看該作者
wulin 發表于 2020-8-12 13:13
按鍵1次:led1亮 (長按 亮度調節)
按鍵2次:led2亮 (長按 亮度調節)
按鍵3次:led1+2亮 (長按 亮度 ...

謝謝壇友的幫助!
回復

使用道具 舉報

9#
ID:389488 發表于 2020-8-15 10:54 | 只看該作者

都有產品已經實現了
回復

使用道具 舉報

10#
ID:845778 發表于 2021-9-9 14:23 | 只看該作者
wulin 發表于 2020-8-12 13:13
按鍵1次:led1亮 (長按 亮度調節)
按鍵2次:led2亮 (長按 亮度調節)
按鍵3次:led1+2亮 (長按 亮度 ...

請問這個代碼可以在keil5里面跑嗎
回復

使用道具 舉報

11#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线一区视频 | 久久最新网址 | 超碰免费观看 | 亚洲精品视频在线观看免费 | 日本一二三区电影 | 欧洲亚洲一区 | 亚洲精品av在线 | 久久久久久国产精品 | 中文字幕在线精品 | 五月天激情电影 | 久久高清精品 | 成人av在线播放 | 黄色av免费网站 | 精品九九久久 | 在线观看视频亚洲 | 亚洲导航深夜福利涩涩屋 | 国产精品视频久久 | 国产欧美日韩精品在线观看 | 成人精品在线观看 | 亚洲欧洲在线视频 | 欧美日韩国产综合在线 | 999久久久 | 亚洲视频欧美视频 | 97精品久久 | 欧美日韩在线免费观看 | 免费国产一区 | 成人欧美一区二区三区在线观看 | 国产精品高潮呻吟久久 | 一区二区三区在线免费观看 | 91精品欧美久久久久久久 | 日韩在线精品 | 国产成人精品一区二区三区在线 | 亚洲精品一区二区三区蜜桃久 | 亚洲精品一区二区三区 | 久久久成人免费视频 | 国产精品一区在线观看你懂的 | 成人妇女免费播放久久久 | 精品一区二区久久久久久久网站 | 日本黄色高清视频 | 欧美亚洲国产一区二区三区 | 青青草中文字幕 |