#include <sc.h>
#include "Define.h"
/*********************************************************
函数名称:DelayXms
函数功能:死循环延时
入口参数:X
出口参数:
备 注:
*********************************************************/
void DelayXms(u8 x)
{
u8 i,j;
for(i=x;i>0;i--)
{
asm("clrwdt");
for(j=153;j>0;j--);
}
}
/*********************************************************
函数名称:DelayXms
函数功能:死循环延时
入口参数:X
出口参数:
备 注:
*********************************************************/
void DelayXus(u8 x)
{
u8 y;
for(y=x;y>0;y--)
{
asm("clrwdt");
}
}
/*********************************************************
函数名: void InitUser(void)
描 述: 初始化定义用户数据
输入值: 无
输出值: 无
返回值: 无
**********************************************************/
void InitUser(void)
{
u8 t = 0;
FlagLedFirst = 1; // LED上电自检标志
OldBattary = 0;
while(FlagLedFirst)
{
asm("clrwdt");
if(FlagSysClk125ms)
{
FlagSysClk125ms = 0;
GetBatVol(); // 开局测出电量等级
t++;
switch(t)
{
case 2:
OpenLed_R();
break;
case 6:
CloseLed_R(); // 全清
t = 0;
FlagLedFirst = 0;
break;
default:
break;
}
}
}
CntUp = 0;
CntDown = 0;
FlagSysClk1ms = 0;
FlagSysClk5ms = 0;
FlagSysClk125ms = 0;
CntSysClk5ms = 0;
CntSysClk125ms = 0;
}
/*********************************************************
函数名: void System_init(void)
描 述: 初始化系统寄存器
输入值: 无
输出值: 无
返回值: 无
**********************************************************/
void System_init(void)
{
/* Fosc */
OSCCON = 0x70; //1分频 8M(分频,0xxx0000: 111--1 110--2 101--4(默认) ... 001--64 000--32khz)
SWDTEN = 1;
/* PortA */
ANSEL = 0x00; // (PortA模拟寄存器) PortA配置1 模拟输入
TRISA = 0x00; // (PortA方向寄存器) PortA配置0 数字输出
PORTA = 0x00; // (PortA数据寄存器) PortA配置0 低电平
WPUA = 0x00; // (PortA上拉输入寄存器) PortA配置0 禁用输入上拉
WPDA = 0x00; // (PortA下拉输入寄存器) PortB配置0 禁用输入下拉
/* PortB */
ANSELH = 0x00; // (PortB模拟寄存器) PortB配置1 模拟输入
TRISB = 0x0D; // (PortB方向寄存器) PortB配置1 数字输入
PORTB = 0x00; // (PortB数据寄存器) PortB配置1 高电平
WPUB = 0x0C; // (PortB上拉输入寄存器) PortB配置1 启用输入上拉
WPDB = 0x00; // (PortB下拉输入寄存器) PortB配置0 禁用输入上拉
/* Time0 */
// OPTION_REG &= ~(1 << 5 | 1 << 3); // (选项寄存器) Timer0使用内部时钟(Fsys/4) 预分频器分配给Timer0
// OPTION_REG &= ~(1 << 2 | 1 << 1 | 1 << 0); // (选项寄存器) 设置Timer0预分频比
// OPTION_REG |= (0 << 2 | 0 << 1 | 0 << 0); // (选项寄存器) 设置Timer0预分频比1:2 00000xxx 000--1:2 001--1:4 010--1:8 ... 111--1:256
// TMR0 = 0xFF - TIMER0_RELOAD; // (Timer0计数器) 设置Timer0初值 定时时间 = (Fsys/4 / 2) * TIMER0_RELOAD = (8M/4 / 2) * 50 = 50uS
/* Time2 */
T2CON = 0x38; // (Timer2控制寄存器) 内部Fsys/4作为Timer2时钟源; Timer2后分频1:8 预分频1
PR2 = 249; // (Timer2周期寄存器) Timer2中断周期 = PR2 * (1 / Fsys / 4) * 预分频 * 后分频 = 250 * (1 / 8M / 4) * 1 * 8 = 1ms
TMR2ON = 1; // 使能Timer2定时器
/* pwm */
PWMCON = 0x00; //pwm时钟(分频,xxx00000: 000--Fosc/1 001--Fosc/2 010--Fosc/4 ... 111--Fosc/128)
PWMTL = 0x00; //pwm周期低8位寄存器 xxxxxxxx pwm周期 = [PMWT+1] * Tosc * PWM分频值
PWMTH = 0x00; //pwm周期高2位寄存器 000000xx pwm0 pwm1共用周期寄存器,PWM频率 = PWM时钟 / PWM周期 = 8M / 63+1 = 125KHZ
PWMD0L = 0x00; //pwm0占空比低8位寄存器 xxxxxxxx
PWMD1L = 0x00; //pwm1占空比低8位寄存器 xxxxxxxx pwm脉宽 = [PWMD+1] * Tosc * PWM分频值
PWMD01H = 0x00; //pwm0 pwm1共用占空比高2位寄存器 0000xxyy xx: pwm1 yy: pwm0
/* interrupt */
// T0IF = 0; //清中断标志
TMR2IF = 0; //清中断标志
RBIF = 0; //清中断标志
PORTB; //读取PORTB并锁存
// T0IE = 1; //使能TMR0溢出中断
TMR2IE = 1; //使能TMR2匹配中断
IOCB0 = 1; //PB0使能电平变化中断
IOCB2 = 1; //PB2使能电平变化中断
// RBIE = 1; //使能PB口电平变化中断
PEIE = 1; //使能外设中断
GIE = 1; //使能全局中断
DelayXms(200);
}
评论5