完善资料让更多小伙伴认识你,还能领取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
感谢分享,学习中,谢谢楼主
|
|
|
|
|
|
感谢分享,学习中,谢谢楼主
|
|
|
|
|
|
感谢分享,学习中,谢谢楼主
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
2701 浏览 0 评论
381浏览 1评论
685浏览 0评论
410浏览 0评论
622浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-4-10 15:56 , Processed in 2.518570 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 www.ringvoyeur.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191