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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3737|回復: 3
打印 上一主題 下一主題
收起左側

狀態機寫的一個單片機按鍵掃描程序新鮮出爐的

[復制鏈接]
跳轉到指定樓層
#
ID:130230 發表于 2018-10-9 01:04 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
2018年10月9日 01:04:29新鮮出爐
/*----------------------------------------
文件描述:處理一些簡單邏輯或配置并封裝成函數
功能:1,設置IO口模式
      2,上電開機
                        3,處理2個按鍵的復用 比如單擊雙擊長按等
------------------------------------------*/
#include "STC15Fxxxx.h"
#include "uart.h"
#include "delay.h"
#include "Getserialnumber.h"
#include "other.h"

unsigned char ptt_key_val=PTT_KEY_IDLE ;//初始化定義聲明一個全局變量 空閑狀態


///*----------------------------------------
//功能:1,設置IO口模式
//入口參數:選擇某一組IO口 選擇某一個引腳  選擇某一種模式(0,準雙向口 1,推挽 2,高阻  3,開漏 )
//2018年9月28日 15:44:11
//特殊說明:本函數尚未完善,暫時只支持P1口的推挽設置
//------------------------------------------*/
//void GPIO_MOD(unsigned char Px, unsigned char pinx,unsigned char mod)
//{
//  

//}

void PIN14_PP()
{
        P1M1=P1M1&(~(0x01<<4));
        P1M0=P1M0|(0X01<<4);//設置P1.4推挽
}
/*-----------------------------------------------------
void TURN_ON(void)
系統開機函數
增加的延時是為了防止重復檢測到P_KEY_DOWN信號造成誤操作
------------------------------------------------------*/
void TURN_ON(void)
{
        PIN14_PP();//設置P1.4推挽
        POWER_ON;
        while(P_KEY_DOWN);        
        delay_ms(50);
        while(P_KEY_DOWN);        
        delay_ms(50);
        while(P_KEY_DOWN);        
        delay_ms(50);
        while(P_KEY_DOWN);        
        delay_ms(50);
        while(P_KEY_DOWN);        
        delay_ms(50);
        while(P_KEY_DOWN);        
}//------------void TURN_ON(void)在此結束--------------------

/*-----------------------------------------------------------
void PTT_KEY_CHECK(void)
對講按鍵復用函數
采用狀態機的方式
檢測按鍵的 單擊 雙擊 及 長按
不返回函數值  采用全局變量ptt_key_val進行鍵值的傳遞
------------------------------------------------------*/
void PTT_KEY_CHECK(void)
{
        static unsigned char ptt_key_sta=0;//初始狀態 定于一個局部靜態變量記錄當前函數掃面的狀態機狀態
        static unsigned char count=0;//延時計數緩存 char 型小于256
        switch (ptt_key_sta)
                {
      case 0:
                                {
                                        if(PTT_KEY_DOWN)
                                                {
                                                        ptt_key_sta=1;//有按鍵按下進入到下一狀態
                                                        count=0;//開始新一輪計數
                                                }
                                        ptt_key_val=PTT_KEY_IDLE;//返回空閑鍵值 0
                                }
                        break ;//case 0結束
                                
                        case 1:
                                {
                                                delay_ms(10);
                                          count++;
                                          if(count>80)
                                                        {
                                                                ptt_key_val=PTT_KEY_LONG;//返回長按鍵值 3
                                                                UART1_SendString("current key status : PTT_KEY_LONG ");//調試用
                                                                ptt_key_sta=0;//返回初始狀態
                                                                while(PTT_KEY_DOWN);
                                                                delay_ms(10);
                                                                while(PTT_KEY_DOWN);
                                                                delay_ms(10);
                                                                while(PTT_KEY_DOWN);
                                                                delay_ms(10);
                                                        }
                                                else if(PTT_KEY_UP)
                                                        {
                                                                ptt_key_sta=2;//進入狀態2  將在狀態2中區分是雙擊還是單擊
                                                        }
                                }
                        break ;//case 1結束
                                
                        case 2:
                                {
                                          if(PTT_KEY_UP)
                                                        {
                                                                delay_ms(10);
                                              count++;
                                                        }                                          
                                          if(count>40)
                                                        {
                                                                ptt_key_val=PTT_KEY_SINGLE;//返回單擊鍵值 2
                                                                UART1_SendString("current key status : PTT_KEY_SINGLE ");//調試用
                                                                ptt_key_sta=0;//返回初始狀態
                                                        }
                                                 if(PTT_KEY_DOWN&&count>41)
                                                        {
                                                                ptt_key_val=PTT_KEY_DOUBLE;//返回單擊鍵值 2
                                                                UART1_SendString("current key status : PTT_KEY_DOUBLE ");//調試用
                                                                ptt_key_sta=0;//返回初始狀態
                                                                while(PTT_KEY_DOWN);
                                                        }
                                }
                        break ;//case 2結束
                        
                        default :
                        break;
                }//switch (ptt_key_sta) 語句結束
}//PTT_KEY_CHECK(void)函數構造結束


#ifndef        __other_H
#define        __other_H


#dfine author={"承接單片機項目 微信mcu6666  QQ184164353 備注51hei"};


sbit P_ONorOFF=P1^4;
sbit Power_check=P3^2;
sbit PTT_KEY=P3^3;


#define P_KEY_DOWN         Power_check==0
#define P_KEY_UP                 Power_check==1//此宏定義定義按鍵1(電源按鍵) 按下及釋放



#define PTT_KEY_DOWN          PTT_KEY==0
#define PTT_KEY_UP                  PTT_KEY==1  //此宏定義定義按鍵2(對講按鍵) 按下及釋放
#define PTT_KEY_IDLE                 0
#define PTT_KEY_SINGLE         1
#define PTT_KEY_DOUBLE         2
#define PTT_KEY_LONG                 3//按鍵鍵值宏定義 空閑  單擊 雙擊  長按
void PTT_KEY_CHECK(void);




#define POWER_ON   P_ONorOFF=0
#define POWER_OFF  P_ONorOFF=1//總開關機宏定義

void PIN14_PP();
void TURN_ON();

#endif


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

板凳
ID:370231 發表于 2019-9-25 09:50 | 只看該作者

好資料,51黑有你更精彩!!!
回復

使用道具 舉報

沙發
ID:130230 發表于 2018-10-10 11:59 | 只看該作者
勘誤:當天晚上寫完蒙圈了寫錯了一行代碼,沒仔細檢查。if(PTT_KEY_DOWN&&count>41)修改為if(PTT_KEY_DOWN&&count<41),本程序已實際調試完畢可用。
回復

使用道具 舉報

樓主
ID:1 發表于 2018-10-10 01:47 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一二三区在线观看 | 欧美色性 | 午夜一级黄色片 | 日韩在线播放视频 | 成人超碰| 成人久久视频 | 成人av网页 | 精品国产91亚洲一区二区三区www | 国产999精品久久久 日本视频一区二区三区 | 亚洲一区二区三区四区五区中文 | 久久一区二区三区免费 | 国产成人麻豆免费观看 | 黄色成人免费看 | 日日干日日 | 日韩一级精品视频在线观看 | 免费在线观看一区二区三区 | 91精品观看 | 日韩成人在线视频 | 欧美专区在线 | 亚洲男人网 | 国产精品久久久久久238 | 精品久久香蕉国产线看观看亚洲 | 国产91丝袜在线播放 | 亚洲精品中文字幕在线观看 | 999精品视频 | 久久精品成人 | 色又黄又爽网站www久久 | 999久久久 | 羞羞视频网站免费看 | 国产精品区一区二 | 美美女高清毛片视频免费观看 | 中文字幕1区 | 99久久精品国产一区二区三区 | 色综合久久天天综合网 | 日韩欧美中文 | 黄色在线播放视频 | 久久网一区二区三区 | 欧美激情精品久久久久 | 成年人黄色一级片 | 99精品久久 | 中文字幕av一区 |