应广单片机-按键长短按功能

行善积德行

行善积德行

2020-10-18

本例程所用的芯片是PMS132B-S14
这个demo主要介绍通过按键来点灯,按键扫描跟其他的开发环境的大同小异,主要有长按短按功能,比较简单,直接看代码吧,不懂得可以留言。基本上是用标准c的格式来写的,mini-c里面的一些指令用的很少。

//主控:PMS132B  (根据具体IC以及封装修改)//           ____________//          -|VDD   GND |-            //          -|PA7   PA0 |-        //          -|PA6   PA4 |-        //          -|PA5   PA3 |-            //          -|PB7   PB3 |-        //          -|PB4   PB1 |- LED        //          -|PB5   PB0 |- KEY                //           ------------                      //  程序功能:长按按键开关机,短按控制LED灯亮,开机LED默认亮                                  #include"extern.h"// .outfile %S_%TyymmddHHMMSS_%x.PDK  //输出的烧录文件带校验码、芯片型号、时间日期typedef byte u8; typedef word u16;typedef EWORD u24;typedef DWORD u32;#define     SetPortA()      PAPH = 0X00; PAC = 0X00; PA = 0X00#define     SetPortB()      PBPH = 0X03; PBC = 0X02; PB = 0X00#define     KEY                     PB.0#define     LED_ON()                PB.1 = 1#define     LED_OFF()               PB.1 = 0#define     CONST_LONG_TIME         95  //95*10ms#define     CONST_KEY_TIME          4  //4*10msu16 T16val;  //定时器重装载值变量u8 gCnt_1ms;u8 gKeyCnt;  //按键消抖变量u8 gKeyLock; //按键锁存变量,防止重复触发u8 gKeyTouchCnt;u8 flag0;bit     is_short_touch:         flag0.0;bit     is_poweron:             flag0.1;bit     is_led_ctrl:            flag0.2;   bit     f_10ms:                 flag0.3; void sys_init(void){    T16val = 0;    gCnt_1ms = 0;    gKeyCnt = 0;    gKeyLock = 0;    gKeyTouchCnt = 0;    flag0 = 0;}//10ms扫描一次void key_scan(void) {    if (KEY) { //按键按下为低        gKeyCnt = 0;        gKeyLock = 0;        if ((is_short_touch == 1) && (is_poweron == 1)) {            is_short_touch = 0;            //短按功能实现区            if (is_led_ctrl == 1) {                is_led_ctrl = 0;            } else {                is_led_ctrl = 1;            }        }    }    else if (gKeyLock == 0) {        gKeyCnt++;        if (gKeyCnt >= CONST_KEY_TIME) { //40*10ms            is_short_touch = 1;        }        if (gKeyCnt >= CONST_LONG_TIME) { //长按            is_short_touch = 0; //短按标志位清零            gKeyCnt = 0;            gKeyLock = 1; //按键锁存变量置一,防止重复触发            //长按功能实现区            if (is_poweron == 1) { //关机                is_poweron = 0;            } else { //开机                is_poweron = 1;            }        }    }}void led_ctrl(void){    if (is_led_ctrl == 1) {        LED_OFF();    } else { //开机之后直接亮        LED_ON();    }}/************************************************************************************//*  16位计数定时器T16     *//************************************************************************************/#define USER_TIMER_CONFIG()$ T16M IHRC, /16, BIT10#define ENABLE_TIMER()SET1 INTEN.2 //$ INTEN T16 //开定时器中断#define DISENABLE_TIMER()SET0 INTEN.2 //关定时器中断#define INIT_TIMER_VALUE(n)STT16 n//装载定时器计数值#define EA_INT()ENGINT//开总中断#define DIS_INT()DISGINT//关总中断#define CONST_TIME_VALUE        0//  (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us  /************************************************************************************/void Set_User_T16(void){USER_TIMER_CONFIG();T16val = CONST_TIME_VALUE;INIT_TIMER_VALUE(T16val);INTRQ = 0;//清除INTRQEA_INT();ENABLE_TIMER();}voidFPPA0 (void){.ADJUST_ICSYSCLK=IHRC/4,IHRC=16MHZ//系统时钟4M//Insert Initial Code    /*上电先设置端口,清零ROM,配置定时器*/    SetPortA();    SetPortB();    sys_init();    Set_User_T16();while (1){//...//wdreset;        if (f_10ms == 1) { //10ms扫描一次按键            f_10ms = 0;            key_scan();        }        if (is_poweron == 1) { //开机短按控制LED亮            led_ctrl();        } else { //没开机LED灭            LED_OFF();        }}}voidInterrupt (void){pushaf;if (Intrq.T16){//T16 Trig//User can add codeIntrq.T16=0;T16val = CONST_TIME_VALUE;        INIT_TIMER_VALUE(T16val);        gCnt_1ms++;        if (gCnt_1ms >= 10) {            gCnt_1ms = 0;            f_10ms = 1;        }}popaf;}

定时器不懂得可以看我上一个博客,有介绍,若还是不懂可以留言。

精彩推荐

粤ICP备16095388号-1