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

本例程所用的芯片是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*10ms

u16 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;//清除INTRQ
	EA_INT();
	ENABLE_TIMER();
}

void	FPPA0 (void)
{
	.ADJUST_IC	SYSCLK=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();
        }

	}
}


void	Interrupt (void)
{
	pushaf;

	if (Intrq.T16)
	{	//	T16 Trig
		//	User can add code
		Intrq.T16	=	0;
		T16val = CONST_TIME_VALUE;
        INIT_TIMER_VALUE(T16val);\
        gCnt_1ms++;
        if (gCnt_1ms >= 10) {
            gCnt_1ms = 0;
            f_10ms = 1;
        }
	}

	popaf;
}

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

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页