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

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

QQ登錄

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

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

再來(lái)一個(gè)原創(chuàng)單片機(jī)按鍵狀態(tài)機(jī)程序:?jiǎn)螕綦p擊長(zhǎng)按(帶抬起檢測(cè))

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:130230 發(fā)表于 2019-12-27 15:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//頭文件(.h)
#ifndef  __KEY__
#define  __KEY__

#define DEBUG_KEY //key文件的調(diào)試開(kāi)關(guān)

sbit KEY1 = P1^0;
#define KEY_DOWN             0
#define KEY_UP         1

//按鍵值
typedef enum
{
        NONE_CLICK = 0,
        SINGLE_CLICK ,
        DOUBLE_CLICK,
        LONG_PRESS,
        NUM_KEY,
}KEY_VALUE_EN;

typedef enum
{
        KEY_IDLE = 0,
        KEY_FILTER,
        KEY_FIRST,                //第一次按下
        KEY_CHECK_FREE,//抬起檢測(cè)(長(zhǎng)按)
        NUM_KEY_STAUS,
}KEY_STATUS_EN;


//按鍵掃描狀態(tài)
typedef struct
{
        unsigned char Statu;
        unsigned char CntDly;
        unsigned char KeyValue;

}TASK_KEY_STATU_ST;
void Task_Keyscan(void);
void Switch_KeyState(unsigned char state);

#endif

//.C文件
/****************************************
版權(quán):微信:mcu6666
PS:承接單片機(jī)開(kāi)發(fā)項(xiàng)目
*****************************************/
#include "..\Public\CH554.H"                                                         
#include "..\Public\Debug.H"
#include "key.h"
#include "UART1.H"

TASK_KEY_STATU_ST gstKey1 = {0};


/***********************************************
功能:按鍵掃描
作者:jzb2019年12月27日
備注:50ms運(yùn)行一次這個(gè)函數(shù),理論上可以擴(kuò)展到n連擊
        最大響應(yīng)延時(shí)500ms(單擊時(shí))
***********************************************/
void Task_Keyscan(void)
{
        switch (gstKey1.Statu)
                {
                        case KEY_IDLE:
                                {
                                        if(KEY1 == KEY_DOWN)
                                                {
                                                        Switch_KeyState(KEY_FILTER);//按鍵按下了去抖
                                                }
                                }
                        break;
                        case KEY_FILTER:
                                {
                                        if(KEY1 == KEY_DOWN)
                                                {
                                                        gstKey1.CntDly++;
                                                        if(gstKey1.CntDly >= 60)
                                                                {
                                                                        gstKey1.KeyValue = LONG_PRESS;//長(zhǎng)按
                                                                        #ifdef DEBUG_KEY
                                                                        UART1_SendString("LONG_PRESS\n");
                                                                        #endif
                                                                        Switch_KeyState(KEY_CHECK_FREE);//抬起檢測(cè)
                                                                }
                                                }
                                        else
                                                {
                                                        if(gstKey1.CntDly == 0)
                                                                {
                                                                        Switch_KeyState(KEY_IDLE);//如果沒(méi)有計(jì)數(shù)則證明是毛刺濾掉
                                                                }
                                                        else
                                                                {
                                                                        Switch_KeyState(KEY_FIRST);//轉(zhuǎn)到第一次按下?tīng)顟B(tài)
                                                                }
                                                }
                                }
                        break;
                        case KEY_FIRST:
                                {
                                        if(KEY1 == KEY_UP)//釋放了
                                                {        
                                                        gstKey1.CntDly++;
                                                        if(gstKey1.CntDly > 10)//500ms
                                                                {
                                                                        gstKey1.KeyValue = SINGLE_CLICK;
                                                                        #ifdef DEBUG_KEY
                                                                        UART1_SendString("SINGLE\n");
                                                                        #endif
                                                                        Switch_KeyState(KEY_IDLE);//回到空閑
                                                                }
                                                }
                                        else//按下了
                                                {
                                                        if(gstKey1.CntDly == 0)//沒(méi)有計(jì)數(shù)證明是沒(méi)有釋放按鍵的動(dòng)作
                                                                {

                                                                }
                                                        else//這個(gè)分支里面已經(jīng)是第二次按下了
                                                                {
                                                                        gstKey1.KeyValue = DOUBLE_CLICK;
                                                                        #ifdef DEBUG_KEY
                                                                        UART1_SendString("DOUBLE\n");
                                                                        #endif
                                                                        Switch_KeyState(KEY_CHECK_FREE);//抬起檢測(cè)
                                                                }
                                                }
                                }
                        break;
                        case KEY_CHECK_FREE:
                                {
                                        if(KEY1 == KEY_UP)
                                                {        
                                                        Switch_KeyState(KEY_IDLE);
                                                }
                                }
                        break;
                    default :
                                  {
                                        Switch_KeyState(KEY_IDLE);
                                  }
                        break;        
                }
}

/****************************************************************************
功能:執(zhí)行切換狀態(tài)的動(dòng)作,同時(shí)清掉當(dāng)前狀態(tài)內(nèi)的計(jì)數(shù)
入口:要切換的狀態(tài)
作者:jzb 2019年12月27日
備注:暫時(shí)先不考慮通用的問(wèn)題,直接操作全局變量如果擴(kuò)展按鍵再說(shuō)
*****************************************************************************/
void Switch_KeyState(unsigned char state)
{
        gstKey1.CntDly = 0;
        gstKey1.Statu = state;
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:984376 發(fā)表于 2024-4-26 21:34 | 只看該作者
Debug.H沒(méi)放出來(lái)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日韩欧美 | 色综合99| 国产精品18hdxxxⅹ在线 | 欧美在线视频观看 | 亚洲欧美日韩电影 | 国产精品欧美一区二区三区不卡 | 一区二区av在线 | 美女久久久 | 欧美日韩高清在线一区 | 亚洲精品电影在线观看 | 337p日本欧洲亚洲大胆 | 欧美激情精品久久久久久 | 成人国产免费视频 | 日本一区二区三区在线观看 | 在线播放国产一区二区三区 | 中文字幕欧美一区二区 | 日韩精品一区二区三区中文在线 | 欧美在线a | 国产一区二区三区视频免费观看 | 久久午夜精品 | 欧美亚洲网站 | 亚洲成人中文字幕 | 久久男人| 99pao成人国产永久免费视频 | 黄网免费 | 一区在线观看视频 | 国产一区二区影院 | 国产精品久久国产精品99 | 九九热精品视频 | 午夜久久av | 久久久久久久久久久丰满 | 99riav国产一区二区三区 | 我我色综合| 欧美日韩亚洲视频 | 久久精品国产一区二区电影 | 欧美久久久久久 | 欧美综合久久 | 精品国产乱码一区二区三 | 99久久精品免费看国产免费软件 | 欧美视频区 | 亚洲精品在线观看视频 |