📄 rtcconf.c
字号:
#include "reg24le1.h"
#include "rtcconf.h"
//函数
#define ONESTEP 33333
static char hour=0,minute=0,second=0;
void rtcconfig(void) //rtc config
{
RTC2CON&=0xfe;
RTC2CMP1=0x7f;
RTC2CMP0=0xff;
RTC2CON=0x07;//mode 11外部捕捉关闭,使能RTC,触发捕捉
//IRCON|=0x20;//int flag
IE1|=0x20;
}
void delay(unsigned int dx)
{
int dj;
for(;dx>0;dx--)
for(dj=120;dj>0;dj--)
{
;
}
}
/*用来读取时间*/
void readtime(unsigned char *h,unsigned char *m,unsigned char *s)
{
*h=hour;
*m=minute;
*s=second;
}
/*用来设定时间,type 0,1,2 代表时分秒设置*/
void settime(unsigned char dat,char type)
{
if(type==0)
{hour=dat; }
else if(type==1)
{minute=dat;}
else if(type==2)
{second=dat;}
else puts("type error!");
send('\n');
if((hour>=24||hour<0)||(minute>=60||minute<0)||(second>=60||second<0))
puts("time set wrong,please set again use instructions!");
send('\n');
}
//IO口的初始化
void ioconfig()
{
P1DIR&=0XFE; //初始化为输出
P10=0;//初始化输出为0
//led
}
//定时器演示
void timer0()
{
TMOD=0x01;
TH0=(65536-ONESTEP)/256;
TL0=(65536-ONESTEP)%256;
ET0=1;
TR0=1;
}
/*串口初始化*/
void uart_init()
{
CLKCTRL = 0x28; // Clock sourced by XCOSC16M
CLKLFCTRL = 0x01;
P0DIR &= 0xF7; // P03 (TxD) is output
P0DIR |= 0x10; // P04 (RxD) is input
P0|=0x18;
S0CON = 0x50;
PCON |= 0x80; // SMOD = 1
WDCON |= 0x80; // Select internal baud rate generator
S0RELL = 0xFB;
S0RELL = 0xF3; // BAUD_38K4
ES0=1;
}
//发送一个字节
void send(char ch)
{
S0BUF=ch;
while(!TI0);
TI0=0;
}
//打印一个字符串
void puts(char *str)
{
while(*str!='\0')
{
send(*str++);
}
}
//rtc enable
void RTC_En()
{
TR0=1;//使能定时0
}
//rtc disable
void RTC_Dis()
{
TR0=0;//关闭定时器0
}
/*
指令的格式为$seth**#,$setm**#,$sets**#,用于设置时分秒,设置$stop用于暂停时间,$runc用于走时
*/
/*指令解码*/
void decode()
{
char buf;
static char insf=0;
unsigned char buffer[7];
static char num=0;
static char insh=0;
static char dat=0,count=0;
static char rtcstop=0,rtcgo=0;
static char mf=0,hf=0,sf=0;
static char disf=0;//显示指令的标志
if(RI0)
{
//LED=!LED; //DEBUG
buf=S0BUF;
RI0=0;
if(buf=='$')
{insf=1;
num=0;
}
if(insf)
{
if(buf!='$')
buffer[num++]=buf;
}
if(num==7)
{
insf=0;
num=0;
//识别设置指令
if((buffer[0]=='s'||buffer[0]=='S')&&(buffer[1]=='e'||buffer[1]=='E')&&(buffer[2]=='t'||buffer[2]=='T'))
{insh=1; }
//解析暂停指令
else if((buffer[0]=='s'||buffer[0]=='S')&&(buffer[1]=='t'||buffer[1]=='T')&&(buffer[2]=='o'||buffer[2]=='O')&&(buffer[3]=='p'||buffer[3]=='P'))
{rtcstop=1;
rtcgo=0;
LED=!LED;
}
//解析启动指令
else if((buffer[0]=='r'||buffer[0]=='R')&&(buffer[1]=='u'||buffer[1]=='U')&&(buffer[2]=='n'||buffer[2]=='N')&&(buffer[3]=='c'||buffer[3]=='C'))
{rtcgo=1;
rtcstop=0;
LED=!LED;
}
else if((buffer[0]=='s'||buffer[0]=='S')&&(buffer[1]=='h'||buffer[1]=='H')&&(buffer[2]=='o'||buffer[2]=='O')&&(buffer[3]=='w'||buffer[3]=='W'))
{
disf=1;//显示指令启用
}
//解析时间设置的指令
if(insh)
{
insh=0;
switch(buffer[3])
{
case 'h':
case 'H': hf=1;count=0;puts("hour set!");break;
case 'm':
case 'M': mf=1;count=0;puts("minute set!");break;
case 's':
case 'S': sf=1;count=0;puts("second set!");break;
default:{hf=mf=sf=0;}puts("this instruction is undefined!");break;
}
}
if(rtcstop)
{ RTC_Dis();//暂停RTC模块
puts("rtc stop working...");
send('\n');
rtcgo=0;
}
if(rtcgo)
{RTC_En(); //开启RTC模块
puts("rtc start working...");
send('\n');
rtcstop=0;
}
if(disf)
{
disf=0; //消除显示指令的标志
showtime();//执行显示函数
}
if(hf)
{
dat=(buffer[4]-'0')*10+(buffer[5]-'0');
if(buffer[6]=='#')
{
//写入时间
if(rtcstop)
{
settime(dat,0);
//debug
}
else puts("you don't stop time,please stop it use $stop!\n");
dat=0;
hf=0;
}
}
else if(mf)
{
dat=(buffer[4]-'0')*10+(buffer[5]-'0');
if(buffer[6]=='#')
{
//写入时间
if(rtcstop)
settime(dat,1);
else puts("you don't stop time,please stop it use $stop!\n");
dat=0;
mf=0;
}
}
else if(sf)
{
dat=(buffer[4]-'0')*10+(buffer[5]-'0');
if(buffer[6]=='#')
{
//写入时间
if(rtcstop==1)
settime(dat,2);
else puts("you don't stop time,please stop it use $stop!\n");
dat=0;
sf=0;
}
}
}
}
}
void timecount()
{
second++;
if(second>59)
{second=0;
minute++;
if(minute>59)
{
minute=0;
hour++;
if(hour>23)
hour=0;
}
}
}
void showtime()
{
puts("time==");
send(' ');
send((hour/10)+'0');
send((hour%10)+'0');
send(' ');
send(':');
send(' ');
send((minute/10)+'0');
send((minute%10)+'0');
send(' ');
send(':');
send(' ');
send((second/10)+'0');
send((second%10)+'0');
send('\n');
}
void uart_service() interrupt 4 //串口中断程序
{
if(TI0)
{
TI0=0;
}
else{
//如果接受到数据
decode();
//timecount();
}
LED=!LED;//debug
}
void tick() interrupt INTERRUPT_TF0
{
static char num=0;
TR0=0;
TH0=(65536-ONESTEP)/256;
TL0=(65536-ONESTEP)%256;
if(num==40)
{
num=0;
timecount();
showtime();
LED=!LED;
}
num++;
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -