📄 time_show.c
字号:
/****************************************************************************
名称:time_show.c
****************************************************************************/
#include "config.h"
#define T 3; //定义切换显示内容时间间隔,单位为S
int i = 0;
int time[6] = {0,0,0,0,0,0}; //定义存放时间的数组
int ReadRtc(void);
/****************************************************************************
名称:Convert() 功能:显示方式
****************************************************************************/
unsigned char Convert(int n)
{
int h;
switch(n)
{
case 0:
h=0x3f; break;
case 1:
h=0x06; break;
case 2:
h=0x5b; break;
case 3:
h=0x4f; break;
case 4:
h=0x66; break;
case 5:
h=0x6d; break;
case 6:
h=0x7D; break;
case 7:
h=0x07; break;
case 8:
h=0x7f; break;
case 9:
h=0x6f; break;
default:
h=0x3f; break;
}
return (h);
}
/****************************************************************************
* 名称:Delay() * 功能:延时
****************************************************************************/
void Delay(uint8 dly)
{ uint16 i;
for(; dly>0; dly--)
for(i=0; i<10000; i++);
}
/****************************************************************************
名称:Display1() 功能:显示年月日
****************************************************************************/
void Disp1()
{
int yearh,yearl,monthh,monthl,dayh,dayl;
PINSEL0 = 0x00000000;
PINSEL1 = 0x00000000;
IODIR = 0x0000FFFF;
ReadRtc(); //读时间
yearl = time[5]%10;
yearh = (time[5]/10)%10;
monthl = time[4]%10;
monthh = (time[4]/10)%10;
dayl = time[3]%10;
dayh = (time[3]/10)%10;
IOSET = Convert(yearh);
IOCLR = 0x00000100;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(yearl);
IOCLR = 0x00000200;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(monthh);
IOCLR = 0x00000800;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(monthl);
IOCLR = 0x00001000;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(dayh);
IOCLR = 0x00004000;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(dayl);
IOCLR = 0x00008000;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
if(time[0]%2!=0) //控制“-”1秒闪烁
{
IOCLR = 0x00002400;
IOSET = 0x00000040;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
}
else
{
}
}
/****************************************************************************
名称:Display2() 功能:显示时分秒
****************************************************************************/
void Disp2()
{
int hourh,hourl,minuteh,minutel,secondh,secondl;
PINSEL0 = 0x00000000;
PINSEL1 = 0x00000000;
IODIR = 0x0000FFFF;
ReadRtc(); //读时间
hourl = time[2]%10;
hourh = (time[2]/10)%10;
minutel = time[1]%10;
minuteh = (time[1]/10)%10;
secondl = time[0]%10;
secondh = (time[0]/10)%10;
IOSET = Convert(hourh);
IOCLR = 0x00000100;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(hourl);
IOCLR = 0x00000200;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(minuteh);
IOCLR = 0x00000800;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(minutel);
IOCLR = 0x00001000;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(secondh);
IOCLR = 0x00004000;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
IOSET = Convert(secondl);
IOCLR = 0x00008000;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
if(time[0]%2!=0) //控制“-”1秒闪烁
{
IOCLR = 0x00002400;
IOSET = 0x00000040;
Delay(1);
IOSET = 0x0000FF00;
IOCLR = 0x000000FF;
}
else
{
}
}
/****************************************************************************
名称:IRQ_Timer0() 功能:中断服务程序 控制显示
****************************************************************************/
void __irq IRQ_Timer0(void)
{
i++;
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
/****************************************************************************
名称:ReadRtc() 功能:读取RTC的时间值
****************************************************************************/
int ReadRtc(void)
{
time[5] = YEAR;
time[4] = MONTH;
time[3] = DOM;
time[2] = HOUR;
time[1] = MIN;
time[0] = SEC;
return(0);
}
/****************************************************************************
名称:TargetInit() 功能:初始化定时器0, 实现5S定时
****************************************************************************/
void Timer0Init(void)
{
T0PR = 99; // 设置定时器分频为100分频,得110592Hz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 110592*T; // 比较值
T0TCR = 0x02; // 复位定时器0
T0TCR = 0x01; // 启动定时器0
}
/****************************************************************************
名称:RTCIni() 功能:初始化RTC
****************************************************************************/
void RTCInit(void)
{ PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
YEAR = 2009; // 初始化年
MONTH = 5; // 初始化月
DOM = 24; // 初始化日
HOUR = 16; // 初始化小时
MIN = 56; // 初始化分
SEC = 11; // 初始化秒
CCR = 0x01; // 启动RTC
}
/****************************************************************************
名称:main() 功能:初始化系统,初始化定时器,初始化RTC,初始化中断
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00000000;
PINSEL1 = 0x00000001;
IODIR = 0x0000FFFF;
Timer0Init(); //初始化定时器0
RTCInit(); //初始化RTC
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x24; // 定时器0通道分配到IRQ slot 0
VICVectAddr0 = (int)IRQ_Timer0; // 设置Timer0向量地址
VICIntEnable = 0x00000010; // 使能Timer0中断
while(1)
{
if(i%2==0)
Disp1();
else
Disp2();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -