完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
应广单片机价格美丽,性价比高,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 EMPTY 0 #define FULL 1 #define ON 1 #define OFF 0 #define LED_OPEN 0 #define LED_FLASH 1 #define LED_BREATH 2 #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_TIMER 1200 #define GRE_LED_FLASH {if(LED_G){LED_G=0;}else{ LED_G=1;}} /*计数值Cinit*/ word ucFlashTmrCnt; /*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) ) { ubEnLedFlash=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) { /*闪灯*/ GRE_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高电平计数值*/ if(ucKeyHitHigtCnt) { ucKeyHitHigtCnt--; if(!ucKeyHitHigtCnt) { /*高电平倒计时完成说明当前为低*/ ucKeyHitSt=LOW; } } /*高电平计数值为0*/ else { usKeyHitLoPreCnt++; /*做饱和加*/ if(usKeyHitLoPreCnt>20000) { usKeyHitLoPreCnt=20000; } if(usKeyHitLoPreCnt==usKeyHitLoPreCntSet) { /*10s 钟定信号*/ ucKeyHitPreSt=1; } } /*KeyHit低电平计数值*/ if(ucKeyHitLowCnt) { ucKeyHitLowCnt--; if(!ucKeyHitLowCnt) { /*低电平倒计时完成,说明当前为高*/ ucKeyHitSt=HIGH; usKeyHitLoPreCnt=0; ucKeyHitPreSt=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) { /*状态有变化*/ if(ucKeyHitSt!=ucKeyHitBak) { /*保存当前状态*/ ucKeyHitBak=ucKeyHitSt; if(!ucKeyHitSt) { /*更新倒计时*/ 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; $ CLKMD IHRC/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) { wdreset; /*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 QQ326.156566 |
|
|
|
只有小组成员才能发言,加入小组>>
2563 浏览 0 评论
762浏览 1评论
521浏览 0评论
275浏览 0评论
455浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 13:53 , Processed in 1.274287 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号