找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3456|回复: 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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表