📄 init.c
字号:
/*========================================*/
/*系统名称:DDSF-CECG-JiangSu */
/*函数名称:初始化 */
/*程序编写:步爱军 */
/*开始日期:2005-01-01 */
/*完成日期: */
/*修改记录: */
/*软件版本:DDSF-CECG-002 */
/*版本说明:用户数据保存在外部 */
/*外部器件:LM75、AT24C02、HT1621、LPC932 */
/* R8025、ADE7755 */
/*========================================*/
#include <REG932.H>
#include <define.h>
#include <Stdio.h>
#include <Intrins.h>
//-----***-CPU寄存器以及外围接口初始化-***-----//
void InitSeries(void)
{
PCON=PCON | 0x30; //SMOD1=0;SMOD0=0;通讯速率不加倍,SCON.7作为UART的SM0位
SCON=SCON | 0xd0; //串口工作在模式3,禁止串口接收
SSTAT=0x60; //串口工作在普通模式
BRGCON=BRGCON | 0x02; //选择波特率发生器用于产生UART的波特率,禁止使能
//晶振12M通讯速率1200
BRGR1=0x27; //装载高字节
BRGR0=0x00; //装载低字节
//晶振11.0592通讯速率1200
//BRGR1=0x23; //装载高字节
//BRGR0=0xF0; //装载低字节
BRGCON=BRGCON | 0x01; //使能拨特率发生器
DIR=1;
ESR=1; //使能串口中断
}
void InitCpuIo(void)
{
P0M1=0x00;
P0M2=0x38; //设置P0.3、P0.4、P0.5为仅为输入
P1M1=0x2c;
P1M2=0x0c;
P2M1=0x40; //设置P26为开漏
P2M2=0x40;
}
void InitTime0(void)
{
TMOD=TMOD | 0X01; //
TAMOD=TAMOD | 0X00; //定时器工作于模式1
TH0=0X02;
TL0=0X40;
AUXR1=AUXR1 | 0X10; //定时器0中断反转IO口
TR0=0;
ET0=0; //使能中断
}
void InitTime1(void)
{
TMOD=TMOD | 0X10; //
TAMOD=TAMOD | 0X00; //定时器工作于模式1
TH1=0X00;
TL1=0X00;
TR1=1;
ET1=1; //使能中断
}
void InitWDT(void)
{
ACC=WDCON; //看门狗启动,并选择看门狗定时器作为定时
ACC=ACC|0x84;
WDL=0x4E;
WDCON=ACC;
WFEED1=0xA5; //喂狗
WFEED2=0x5A;
}
void InitINT0(void)
{
TCON=TCON | 0X00; //外部中断0采用低电平触发中断
EX0=1; //开启中断
}
void InitINT1(void)
{
TCON=TCON | 0X00; //外部中断1采用低电平触发中断
EX1=1; //使能外部中断
}
void Initkey(void) //初始化键盘中断
{
//KBPATN=0xff; //
KBCON=0x00;
KBMASK=0x38; //设置P0.1->P0.0为中断源
EKBI=0;
}
void InitCclk(void)
{
DIVM=0x00; //CCLK=11059200/2;
}
void InitEEPROM(void)
{
DEECON=0x30;
EIEE=0;
}
void InitPWM() //使用外部12M振荡器时:CCU频率=((12000000/2)/6)*16=16000000MHz
{
TOR2H=0x03; //定时器重装值=CCU频率/红外线载频=16000000/38000=421=0x1a5
TOR2L=0x4a;
OCRAH=0x01; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
OCRAL=0xa4;
TCR21=0x85; //PLL预分频为5+1
CCCRA=1; //非反相的PWM比较匹配时置位,在CCU定时器向下溢出时清0
PLLEN=1; //启动PLL
PWM=1;
while(PLLEN==0);
TCR20=0x82; // 设置输出模式,非反相PWM
}
void InitCMP(void)
{
PT0AD=0x06; //禁止CIN2A上的数字输入功能
CMP2=0x28; //0010 1000,CMP1使能,内部Ref,CIN1A
Delay(10); //延迟10us,以等待比较器稳定
CMP2&=0xFE; //清除比较器中断标志位
EC=1; //比较器中断输出使能
}
void InitCpu(void)
{
InitWDT();
InitSeries();
InitCpuIo();
InitTime0();
InitTime1();
InitINT0();
InitINT1();
InitCclk();
Initkey();
InitEEPROM();
InitPWM();
InitCMP();
}
//-----***-液晶显示驱动器初始化-***-----//
void InitLcd(void)
{
LcdSendCommand(0x01);
LcdSendCommand(0x29);
LcdSendCommand(0x18);
LcdSendCommand(0x03);
}
//-----***-时钟发生器运行初始化-***-----//
void InitRTC(void)
{
IicByteWrite(0x64,0xe0,0x23);
IicByteWrite(0x64,0xf0,0xa0);
}
//-----***-命令以及重要参数检验、初始化-***-----//
void InitCmd(void)
{
unsigned char data ii;
if((PowerStA==0x55)|(PowerStB==0xAA))
{
PowerStA=0x55;
PowerStB=0xaa;
}
else
{
DIR=1;
ClerBuf();
DataPickup();
SeriesBufDptr=0;
SendOverFg=1;
LcdDelay=20;
InfraredBufDptr=0;
TimeSendFg=0;
DataProtectFg=0;
InfraredBufDptr=0;
SeriesBufDptr=0;
LcdRunData=1;
LcdTimeFg=1;
ReverseFgToLcd=0;
ReverseFgToData=0;
PulseParseFg=0;
PowerStA=0x55;
PowerStB=0xaa;
ii=IicByteRead(0xa0,0x00);
if(ii==0xff)
{
ii=IicByteRead(0xa0,0x80);
if(ii==0xbb)
{
ii=IicByteRead(0xa0,0xf0);
if(ii==0xff)
{
IicByteWrite(0xa0,0x00,0xbb);
ii=IicByteRead(0xa0,0x00);
if(ii==0xaa)
{
IicByteWrite(0xa0,0x80,0xaa);
ii=IicByteRead(0xa0,0x80);
if(ii==0xaa)
{
IicByteWrite(0xa0,0xf0,0xaa);
ii=IicByteRead(0xa0,0xf0);
if(ii==0xaa)
{
ClerData();
}
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -