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

標題: 單片機長短按鍵控制程序 [打印本頁]

作者: lclbf    時間: 2021-9-11 11:07
標題: 單片機長短按鍵控制程序
實際應用中很多地方用到按鍵長短按鍵。下面是我寫的代碼,一是作為我自己筆記在這里,二看有沒有朋友有更好的寫法。代碼如下:
#include"stc15w.h"

#define u8 unsigned char
#define u16 unsigned int

sbit LEDR = P1^0;
sbit LEDG = P1^1;
sbit LEDB = P1^2;
sbit KEY = P0^0;

u16 keyTim; //按鍵時間
u16 sysTim; //系統時間

u8 keyshort; //短按鍵標志
u8 keylong;  //長按鍵標志
u8 LEDON;    //開燈狀態
u8 flag1ms;  //1ms標志

void key_Proc(); //按鍵處理
void led_Proc();  //燈處理
void Timer0Init(); //中斷初始化

void main()
{
    LEDR = 0;    //上電燈全滅(上電燈初始化)
    LEDG = 0;
    LEDB = 0;
    Timer0Init();  //中斷初始化

    while(1)
    {
        key_Proc();   //按鍵處理
        led_Proc();  //燈處理
    }

}

void key_Proc()    //按鍵處理
{
    if(flag1ms)  //1ms時間標志
    {
        flag1ms = 0;
        if(KEY)
        {
            if((keyTim>10)&&(keyTim<500))  //按鍵時間大于10ms小于50ms,是短按鍵
            {
                keyshort = 1;   //短按鍵標志
            }
            keyTim = 0;        //按鍵時間清零
        }
        else
        {
            if(keyTim<10001)    //按鍵時間小于10S
            keyTim++;           //按鍵時間加
            if(keyTim==1000)    //按鍵時間為1S
            {
                keylong = 1;    //長按鍵標志
            }
        }      
    }
}

void led_Proc()   //燈處理
{
    static u8 i;

    if((LEDON==0)&&(keylong==1))  //關燈狀態同時長按鍵按下就開燈
    {   
        keylong = 0;  //長按鍵松開
        LEDON = 1;    //關燈時就開燈
        LEDR = 1;     //RGB燈亮白光
        LEDG = 1;
        LEDB = 1;
    }        
    if((LEDON==1)&&(keylong==1)) //開燈狀態同時長按鍵按下就關燈
    {   
        keylong = 0;  //長按鍵松開
        LEDON = 0;    //開燈時就關燈
        LEDR = 0;     //RGB燈滅
        LEDG = 0;
        LEDB = 0;
    }

    if((LEDON==1)&&(keyshort==1))  //開燈狀態同時短按鍵按下,亮燈模式切換
    {   
        keyshort = 0;  //短按鍵松開
        switch(i)
        {
            case 0:LEDR = 1;LEDG = 0;LEDB = 0;break; //紅
            case 1:LEDR = 1;LEDG = 1;LEDB = 0;break; //黃
            case 2:LEDR = 0;LEDG = 1;LEDB = 0;break; //綠
            case 3:LEDR = 0;LEDG = 1;LEDB = 1;break; //青
            case 4:LEDR = 0;LEDG = 0;LEDB = 1;break; //藍
            case 5:LEDR = 1;LEDG = 0;LEDB = 1;break; //紫
            case 6:LEDR = 1;LEDG = 1;LEDB = 1;break; //白                  
        }
        i++;
        i = i%7;  //7次循環切換
    }
}

void Timer0Init()   //中斷初始化
{
    AUXR &= 0x7F;   //定時器時鐘12T(12分頻)模式
    EA = 1;       //開中斷
    TMOD &= 0XF0; //中斷0模式1
    TMOD |= 0X01;
    TH0 = 0XFC;   //初值1ms
    TL0 = 0X66;
    ET0 = 1;     //允許T0中斷
    TR0 = 1;    //定時器0開始計時
}

void interruptTimer0() interrupt 1
{
    TH0 = 0XFC;
    TL0 = 0X66;
    flag1ms = 1; //1ms標志
    sysTim++;  //系統時間
}


作者: cdiyy    時間: 2021-9-12 10:04
驗證了好像代碼不行,。正在調試一下看看行不行
作者: lclbf    時間: 2021-9-13 08:28
cdiyy 發表于 2021-9-12 10:04
驗證了好像代碼不行,。正在調試一下看看行不行

我用的STC的單片機,可以的。
作者: ax6808    時間: 2022-11-29 19:15
    寫的很好,很清晰,很難得!必須暫1個!

    長短按時長閥值:可根據實際調整; 看過吳堅鴻老師的教程.
    期間由于受外界干擾或者按鍵抖動,而使 IO 口突然瞬間觸發成高電平,這個時候馬上把延時計數器清零了,這個過程非常巧妙,可非常有效地去除瞬間的雜波干擾。這是他實戰中摸索出來的。 以后凡是用到開關感應器的時候,都可以用類似這樣的方法去干擾。
    如果按鍵按下的時間超過了短按閥值,則馬上把短按標=1;
    如果還沒有松手,一旦發現按下的時間超過長按閥值時(個人覺得1-2秒合適了),先把短按標志清零,然后觸發長按。在這段程序里,把自鎖標志置位,是為了防止按住按鍵不松手后一直觸發。
作者: ax6808    時間: 2022-12-1 15:06
這里 sysTim=keyTim  可能另有他用吧!
作者: 1478312152    時間: 2023-9-6 07:56
剛試過可以運行,實測長短按鍵很難區分開,所以無實用性




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91国内精精品久久久久久婷婷 | 亚洲一区不卡在线 | 国产电影一区二区在线观看 | 成人精品一区二区三区中文字幕 | 精品国产青草久久久久96 | 国产高清精品一区二区三区 | 综合婷婷 | 涩涩视频网站在线观看 | 日韩精品一区二区三区中文字幕 | 国产精品性做久久久久久 | 久久九精品 | 亚洲精品视频在线 | 日韩av免费看 | 久久精品欧美一区二区三区不卡 | 欧美美女二区 | 精品一区二区久久久久久久网站 | 欧美精品一区二区免费 | 久久久久久久久久久蜜桃 | 一级做a爰片性色毛片16美国 | 国产精品久久久久久亚洲调教 | 青青草网站在线观看 | 三级国产三级在线 | 超碰成人免费 | 国产精品99久久久久久久久久久久 | 网站黄色在线 | 狠狠骚 | av天天看| 日韩视频在线一区 | 久久久精品视频免费看 | 国产一区视频在线 | 亚洲欧美日本在线 | 久久精品一区 | 日韩国产欧美在线观看 | 一区二区三区回区在观看免费视频 | 国产精品久久久久久久久久免费看 | 日韩一级免费电影 | 丝袜一区二区三区 | 欧美做暖暖视频 | 99久久日韩精品免费热麻豆美女 | 欧美专区在线视频 | 99热首页|