完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本例程所用的芯片是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; } |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
328浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:18 , Processed in 1.108689 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号