单片机小组
直播中

abdkjshd

8年用户 1168经验值
擅长:可编程逻辑
私信 关注
[问答]

如何通过按键扫描来进行点灯?怎样去编写代码教程?

PMS132B-S14是什么?
什么是按键扫描?按键扫描有哪些功能?
如何通过按键扫描来进行点灯?怎样去编写代码教程?

回帖(1)

陈韵瑄

2021-7-1 10:38:14
  本例程所用的芯片是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;//清除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;} 定时器不懂得可以看我上一个博客,有介绍,若还是不懂可以留言。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分