继续进行点灯,今天来点简单的,红蓝双色爆闪灯,上电即可爆闪,红色接pa.3.pa.4,蓝色接pa6.和pa.7,低电平点亮LED灯,想要高电平点亮,或是驱动N管点亮灯,可以稍作修改。端口电平输出0改1,1改0即可。
不多说,上代码!
#include "extern.h"
/*调试输出开关,关闭之后测试端口不输出了*/
//#define DEBUG
/*1m 标记*/
bit msFlag;
/*us计数*/
byte ucUsCnt;
/*ms 计数*/
byte ucMsCnt;
Word Reload_T16;
/*可以用示波器观察对应端口*/
#ifdef DEBUG
bit US100_OUT :pa.7
bit MS_OUT :pa.6
bit MS10_OUT :pa.0
#endif
byte ucLedst;
BIT COM1 : PA.3;
BIT COM2 : PA.4;
BIT COM3 : PA.6;
BIT COM4 : PA.7;
#define SEG_A COM4
#define SEG_B COM3
#define SEG_C COM2
#define SEG_D COM1
/*中断服务程序*/
void Interrupt(void)
{
pushaf;
if(Intrq.T16)
{
STT16 Reload_T16;
Intrq.T16 = 0;
ucUsCnt++;
if(ucUsCnt>9)
{
ucUsCnt=0;
/*100us*10=1ms*/
msFlag=1;
}
/*100u task,紧急任务放这边,但这里的任务尽量少,
心脏部位,尽量减少干扰,需要保证tick精准*/
#ifdef DEBUG
if(US100_OUT)
{
US100_OUT=0;
}
else
{
US100_OUT=1;
}
#endif
}
popaf;
}
/*T16设置*/
Void Timer16_Init(void)
{
/*向上计数 1600就发生中断 1600/16M=0.0001s=100us,理论设计*/
//Reload_T16 = 32768 - 1600;
/*根据测算(示波器校准),除去误差(约为20个sysclk周期),设置1580这个值可能更准确,
SYSCLK越快,误差越小.从进入中断开始,到重新设置计数器,中间大概需要20个sysclk周期*/
Reload_T16 = 32768 - 1580;
/*设置计数器值*/
STT16 Reload_T16;
/*配置T16 控制寄存器*/
$ T16M IHRC,/1,BIT15;
INTRQ.T16 = 0;
INTEN.T16 = 1;
msFlag=0;
ucUsCnt=0;
}
void Flash(void)
{
switch(ucMsCnt)
{
case 0:
COM1=1;
COM2=1;
COM3=0;
COM4=0;
nop;
break;
case 62:
COM1=1;
COM2=1;
COM3=1;
COM4=1;
nop;
break;
case 124:
COM1=0;
COM2=0;
COM3=1;
COM4=1;
nop;
break;
case 186:
COM1=1;
COM2=1;
COM3=1;
COM4=1;
nop;
break;
}
}
void FPPA0 (void)
{
/*注意,修改了sysclk,Reload_T16要做细微调整,可以试着改动sysclk,
会发现Reload_T16误差变大*/
.ADJUST_IC SYSCLK=IHRC/8,IHRC=16MHz,init_ram,VDD=5V;
.delay 20*2000;
// $ SHOW_EN in ;
$ COM1 OUT,low;
$ COM2 OUT,low;
$ COM3 OUT,low;
$ COM4 OUT,low;
/*初始化T16*/
Timer16_Init();
#ifdef DEBUG
$ US100_OUT out,low;
$ MS_OUT out,low;
$ MS10_OUT out,low;
#endif
ucLedst=0;
Engint;
while (1)
{
/*1ms标记*/
if(msFlag)
{
ucMsCnt++;
if(ucMsCnt>249)
{
/*1ms*10=10ms*/
ucMsCnt=0;
}
Flash();
msFlag=0;
}
}
}
/*creat by zhongvv QQ85547259*/