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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5477|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)長(zhǎng)短按鍵控制程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:237797 發(fā)表于 2021-9-11 11:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
實(shí)際應(yīng)用中很多地方用到按鍵長(zhǎng)短按鍵。下面是我寫(xiě)的代碼,一是作為我自己筆記在這里,二看有沒(méi)有朋友有更好的寫(xiě)法。代碼如下:
#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; //按鍵時(shí)間
u16 sysTim; //系統(tǒng)時(shí)間

u8 keyshort; //短按鍵標(biāo)志
u8 keylong;  //長(zhǎng)按鍵標(biāo)志
u8 LEDON;    //開(kāi)燈狀態(tài)
u8 flag1ms;  //1ms標(biāo)志

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時(shí)間標(biāo)志
    {
        flag1ms = 0;
        if(KEY)
        {
            if((keyTim>10)&&(keyTim<500))  //按鍵時(shí)間大于10ms小于50ms,是短按鍵
            {
                keyshort = 1;   //短按鍵標(biāo)志
            }
            keyTim = 0;        //按鍵時(shí)間清零
        }
        else
        {
            if(keyTim<10001)    //按鍵時(shí)間小于10S
            keyTim++;           //按鍵時(shí)間加
            if(keyTim==1000)    //按鍵時(shí)間為1S
            {
                keylong = 1;    //長(zhǎng)按鍵標(biāo)志
            }
        }      
    }
}

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

    if((LEDON==0)&&(keylong==1))  //關(guān)燈狀態(tài)同時(shí)長(zhǎng)按鍵按下就開(kāi)燈
    {   
        keylong = 0;  //長(zhǎng)按鍵松開(kāi)
        LEDON = 1;    //關(guān)燈時(shí)就開(kāi)燈
        LEDR = 1;     //RGB燈亮白光
        LEDG = 1;
        LEDB = 1;
    }        
    if((LEDON==1)&&(keylong==1)) //開(kāi)燈狀態(tài)同時(shí)長(zhǎng)按鍵按下就關(guān)燈
    {   
        keylong = 0;  //長(zhǎng)按鍵松開(kāi)
        LEDON = 0;    //開(kāi)燈時(shí)就關(guān)燈
        LEDR = 0;     //RGB燈滅
        LEDG = 0;
        LEDB = 0;
    }

    if((LEDON==1)&&(keyshort==1))  //開(kāi)燈狀態(tài)同時(shí)短按鍵按下,亮燈模式切換
    {   
        keyshort = 0;  //短按鍵松開(kāi)
        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; //藍(lán)
            case 5:LEDR = 1;LEDG = 0;LEDB = 1;break; //紫
            case 6:LEDR = 1;LEDG = 1;LEDB = 1;break; //白                  
        }
        i++;
        i = i%7;  //7次循環(huán)切換
    }
}

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

void interruptTimer0() interrupt 1
{
    TH0 = 0XFC;
    TL0 = 0X66;
    flag1ms = 1; //1ms標(biāo)志
    sysTim++;  //系統(tǒng)時(shí)間
}

評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
ax6808 + 5 閥值 const_key_time_short1 或者 const_ke.
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏17 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:607312 發(fā)表于 2021-9-12 10:04 | 只看該作者
驗(yàn)證了好像代碼不行,。正在調(diào)試一下看看行不行
回復(fù)

使用道具 舉報(bào)

板凳
ID:237797 發(fā)表于 2021-9-13 08:28 | 只看該作者
cdiyy 發(fā)表于 2021-9-12 10:04
驗(yàn)證了好像代碼不行,。正在調(diào)試一下看看行不行

我用的STC的單片機(jī),可以的。
回復(fù)

使用道具 舉報(bào)

地板
ID:975054 發(fā)表于 2022-11-29 19:15 | 只看該作者
    寫(xiě)的很好,很清晰,很難得!必須暫1個(gè)!

    長(zhǎng)短按時(shí)長(zhǎng)閥值:可根據(jù)實(shí)際調(diào)整; 看過(guò)吳堅(jiān)鴻老師的教程.
    期間由于受外界干擾或者按鍵抖動(dòng),而使 IO 口突然瞬間觸發(fā)成高電平,這個(gè)時(shí)候馬上把延時(shí)計(jì)數(shù)器清零了,這個(gè)過(guò)程非常巧妙,可非常有效地去除瞬間的雜波干擾。這是他實(shí)戰(zhàn)中摸索出來(lái)的。 以后凡是用到開(kāi)關(guān)感應(yīng)器的時(shí)候,都可以用類(lèi)似這樣的方法去干擾。
    如果按鍵按下的時(shí)間超過(guò)了短按閥值,則馬上把短按標(biāo)=1;
    如果還沒(méi)有松手,一旦發(fā)現(xiàn)按下的時(shí)間超過(guò)長(zhǎng)按閥值時(shí)(個(gè)人覺(jué)得1-2秒合適了),先把短按標(biāo)志清零,然后觸發(fā)長(zhǎng)按。在這段程序里,把自鎖標(biāo)志置位,是為了防止按住按鍵不松手后一直觸發(fā)。
回復(fù)

使用道具 舉報(bào)

5#
ID:975054 發(fā)表于 2022-12-1 15:06 | 只看該作者
這里 sysTim=keyTim  可能另有他用吧!
回復(fù)

使用道具 舉報(bào)

6#
ID:1092741 發(fā)表于 2023-9-6 07:56 | 只看該作者
剛試過(guò)可以運(yùn)行,實(shí)測(cè)長(zhǎng)短按鍵很難區(qū)分開(kāi),所以無(wú)實(shí)用性
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 三级理论片 | 国产免费久久 | 一级片黄色片 | 欧美精品一区二区三区四区 | 色综合久久综合 | h视频免费在线观看 | 在线播放av网站 | www.色综合| 国产精品91在线 | 亚洲成人av在线 | 色婷婷导航| www.色偷偷 | 欧美专区第一页 | 欧美日皮视频 | 欧洲一区二区 | 手机看片福利视频 | 天天操综合 | 日韩中文字幕精品 | 毛片在线观看网站 | 中文字幕日韩欧美 | 少妇精品| 一级毛片a | 亚洲综合网站 | 国产激情网 | 一区二区精品视频 | 艳妇乳肉亭妇荡乳av | 国内久久精品 | 欧美在线中文字幕 | 国精产品99永久一区一区 | 日日干日日干 | 一区二区免费在线观看 | 国产理论在线观看 | 91成人精品一区在线播放 | 91视频免费观看 | 九色网址| 免费看大片a| 精品一区二区三区免费看 | www四虎影院 | 国产浮力第一页 | 国产寡妇亲子伦一区二区三区四区 | 秋霞午夜鲁丝一区二区老狼 |