完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
应广单片机价格美丽,性价比高,mini-c好用,适用于消费电子开发。但是案例demo太少了,为了方便大家能够快速入门。这 里贴出了一份经典PMS150C的点灯程序代码。不是Hello world!那种,是偏向于实际产品的那种。 涉及到的内容有不少,包括应广单片机PMS150C: 1.端口输入输出配置 2.Tmr16中断配置( systick),倒计时 3.按键检测,包括防抖,可以用于长按键检测 4.低功耗,睡眠配置 5.唤醒 6.系统时钟配置,系统时钟切换 7.看门狗应用 8.状态机应用 其他比如PMS152,PMS132设置也类似,希望大家喜欢! #include "extern.h" #define HIGH 1 #define LOW 0 #define DISABLE 0 #define ENABLE 1 #define EMPTY0 #define FULL 1 #define ON 1 #define OFF 0 #define LED_OPEN 0 #define LED_FLASH1 #define LED_BREATH2 #define LED_CLOSE 3 //#define RUN_TMR 60000 /单位 ms/ #define RUN_TMR 15000 #define LOW_POW_TIMING_TMR 3000 BIT LED_G : PA.3; BIT KEY_HIT : PA.4; #define KEY_DEBOUNCE_CNT 20 #define KEY_LONG_PRESS_TIMER1200 #define GRE_LED_FLASH {if(LED_G){LED_G=0;}else{ LED_G=1;}} /计数值Cinit/ word ucFlashTmrCnt; 1/cinit/ BIT ubMsFlag; /cinit/ BIT ubEnLedFlash; /cinit/ bit ubMod; byte ucSysSt; //byte ucLedPwmDt; /定时时间是否到了cinit/ bit FLAG_NMS; /计数值cinit/ byte count; /定时器初始化cinit/ word T16COUNTER; Eword ueLowPowAltTm; byte ucKeyHitHigtCnt; byte ucKeyHitLowCnt; byte ucKeyHitSt; byte ucKeyHitBak; word usKeyHitLoPreCnt; word usKeyHitLoPreCntSet; bit ucKeyHitPreSt; byte ucLedSt; void UpDateLedSt(void); /***************************************/ void TIME16_Init(void) { /计数值清零/ T16COUNTER =488; /ms标记reset/ FLAG_NMS =0; /使能定时器/ $ INTEN T16; /关中断/ INTRQ = 0; /停止定时器/ T16M.5 =0; STT16 T16COUNTER; /计算方法16M// $ T16M IHRC,/1,BIT11; } void StartLowPowTmr(void) { ueLowPowAltTm=RUN_TMR; } /低功耗/ void LowPow(void) { /退出功能则进入低功耗/ if((!ueLowPowAltTm) ) { 2ubEnLedFlash=0; GRE_LED_OFF; wdreset; /IHRC ->ILRC,关看门狗/ CLKMD=0xf4; /禁用IHRC/ CLKMD.4=0; while(1) { /低功耗/ STOPSYS; /有按键按下,充电和按键唤醒/ if(KEY_HIT==0) { /退出低功耗/ break; } } /*ILRC->IHRC , b7:5@001=IHRC/8, b4@1=IHRC b3@1=模式1 b2@ 1=ILRC启动 b1@ 1=看门狗开启 b0@ 0=Pa5; 模式口1;开看门狗*/ CLKMD=0b001_1_1110; ucLedSt=1; ucSysSt=LED_CLOSE; StartLowPowTmr(); } } void UpdateLedTmr(void) { /使能,闪灯/ if(ubEnLedFlash) { /1ms进行一次计数/ ucFlashTmrCnt++; if(ucFlashTmrCnt>250) { ucFlashTmrCnt=0; /标记/ ubMsFlag=1; } } } /闪灯/ void FlashLed(void) { /定时时间到/ if(ubMsFlag) { /闪灯/ 3GRE_LED_FLASH; ubMsFlag=0; } } /端口检测/ void ResetKeyTmr(void) { if(KEY_HIT) { ucKeyHitHigtCnt=KEY_DEBOUNCE_CNT; } /当前状态为0/ else { ucKeyHitLowCnt=KEY_DEBOUNCE_CNT; } } /1ms任务函数/ void UpDateKeyTmr(void) { /重新设置计数值/ ResetKeyTmr(); /KeyHit高电平计数值/ i***eyHitHigtCnt) { ucKeyHitHigtCnt--; i***eyHitHigtCnt) { /高电平倒计时完成说明当前为低/ ucKeyHitSt=LOW; } } /高电平计数值为0/ else { usKeyHitLoPreCnt++; /做饱和加/ if(usKeyHitLoPreCnt>20000) { usKeyHitLoPreCnt=20000; } if(usKeyHitLoPreCnt==usKeyHitLoPreCntSet) { /10s 钟定信号/ ucKeyHitPreSt=1; } } /KeyHit低电平计数值/ i***eyHitLowCnt) { ucKeyHitLowCnt--; i***eyHitLowCnt) { /低电平倒计时完成,说明当前为高/ ucKeyHitSt=HIGH; usKeyHitLoPreCnt=0; 4ucKeyHitPreSt=0; } } } void MsTask(void) { /按键/ UpDateKeyTmr(); UpdateLedTmr(); FlashLed(); /低功耗定时器/ if(ueLowPowAltTm) { ueLowPowAltTm--; } LowPow(); } void UpDateLedSt(void) { ucSysSt++; if(ucSysSt>1) { ucSysSt=0; } switch(ucSysSt) { /开闪烁/ case 0: ubEnLedFlash=1; break; /关灯/ case 1: ueLowPowAltTm=LOW_POW_TIMING_TMR; ubEnLedFlash=0; /关灯,关闪烁/ GRE_LED_OFF; /关灯/ break; default: break; } } /状态切换/ void GetKeySt(void) { /状态有变化/ i***eyHitSt!=ucKeyHitBak) 5{ /保存当前状态/ ucKeyHitBak=ucKeyHitSt; i***eyHitSt) { /更新倒计时/ StartLowPowTmr(); /状态切换/ UpDateLedSt(); } } } /端口状态初始化/ void KeyAppInit(void) { if(KEY_HIT) { ucKeyHitSt=HIGH; ucKeyHitBak=HIGH; } else { ucKeyHitSt=LOW; ucKeyHitBak=LOW; } ucKeyHitHigtCnt=KEY_DEBOUNCE_CNT; ucKeyHitLowCnt=KEY_DEBOUNCE_CNT; usKeyHitLoPreCnt=0; ucKeyHitPreSt=0; } void FPPA0 (void) { .ADJUST_IC SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.0V; $ CLKMDIHRC/8,En_IHRC,En_ILRC,En_WatchDog; /**/ .delay 40000; $ LED_G OUT,HIGH; $ KEY_HIT IN,PULL; TIME16_Init(); KeyAppInit(); ucLedSt=1; ubMsFlag=0; ubEnLedFlash=0; /长按键时间/ usKeyHitLoPreCntSet=3000; ucSysSt=LED_CLOSE; engint; while(1) { 6wdreset; /1ms定时时间到/ if( FLAG_NMS ) { MsTask(); /清除标记/ FLAG_NMS=0; } /取得按键状态/ GetKeySt(); } } void Interrupt ( void ) { pushaf; if( Intrq.T16 ) { Intrq.T16 = 0; STT16 T16COUNTER; if(count>0 ) { count--; } else { count = 9; /1ms/ FLAG_NMS= 1; } } popaf; } /*end create by zhongvv |
|
相关推荐
|
|
感谢分享,学习中,谢谢楼主
|
|
|
|
|
|
感谢分享,学习中,谢谢楼主
|
|
|
|
|
|
感谢分享,学习中,谢谢楼主
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
2182 浏览 0 评论
1163浏览 3评论
641浏览 2评论
[求助]atmega1280与atmega2560在程序上有什么区别?
2247浏览 1评论
330浏览 1评论
1189浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 16:08 , Processed in 1.045998 second(s), Total 75, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号