📄 main.c
字号:
/****************************************************************************
* File: main.c
* 功能: 运行RTC进行计时,并将所计时间值向LCD输出
****************************************************************************/
#include "config.h"
#define rs (1<<8) // 0000 0001 0000 0000 = 0x0100
#define rw (1<<9) // 0000 0010 0000 0000 = 0x0200
#define en (1<<10) // 0000 0100 0000 0000 = 0x0400
#define busy (1<<7) // 0000 0000 1000 0000 = 0x0080
#define rs_rw_en rs|rw|en // 0000 0111 0000 0000 = 0x0700 P8~P10
#define lcd_pins 0x7FF // 将 P0.0~P0.10 设置为输出 0000 0111 1111 1111
uint32 IO0DIR_bak;
uint32 IO0SET_bak;
uint32 IO0CLR_bak;
uint8 MESSAGE[]="RTC Time is:";
#define LED1CON 1<<23 /*P0.23口为LED2控制端 */
uint8 send_buf[16]; // 数据缓冲区
/****************************************************************************
* 名称:ChkBusy()
* 功能:检查总线是否忙
****************************************************************************/
void ChkBusy()
{
IO0DIR_bak=IO0DIR;
IO0DIR=rs_rw_en; // 0000 0111 0000 0000 P8~P10 即 en, rw, rs 设置为输出, 其他为输入。
while(1)
{
IO0CLR=(IO0CLR & ~rs)|rs; // 置 rs 为 0
IO0SET=(IO0SET & ~rw)|rw; // 置 rw 为 1
IO0SET=(IO0SET & ~en)|en; // 置 en 为 1, 禁用 LED
if(!(IO0PIN & busy))break; // 测试最低位数据,如果为低,总线空闲,跳出循环。
IO0CLR=(IO0CLR & ~en)|en; // 置 en 为 0,使能 LCD
}
IO0DIR=lcd_pins; // 将 P0.0~P0.10 设置为输出 0000 0111 1111 1111
IO0DIR=IO0DIR_bak;
}
/****************************************************************************
* 名称:WrOp()
* 功能:写操作数函数
****************************************************************************/
void WrOp(uint8 dat)
{
ChkBusy();
IO0SET_bak=IO0SET;
IO0CLR_bak=IO0CLR;
IO0CLR=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
IO0SET=IO0SET_bak;
IO0CLR=IO0CLR_bak;
}
/****************************************************************************
* 名称:WrDat()
* 功能:写数据函数
****************************************************************************/
void WrDat(uint8 dat)
{
ChkBusy();
IO0SET_bak=IO0SET;
IO0CLR_bak=IO0CLR;
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
IO0SET=IO0SET_bak;
IO0CLR=IO0CLR_bak;
}
/****************************************************************************
* 名称:lcd_init()
* 功能:lcd初始化函数
****************************************************************************/
void lcd_init(void)
{
WrOp(0x38);
WrOp(0x06); //光标加1
WrOp(0x0c); //开显示
}
/****************************************************************************
* 名称:DisText()
* 功能:显示文本函数
****************************************************************************/
void DisText(uint8 addr,uint8 *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}
/*******************************************************************************
*名称: SendTimeRtc()
*功能: 读取RTC的时间值,并将读出的时分秒值由串口发送到上位机显示
*******************************************************************************/
void SendTimeRtc(void)
{
uint32 times;
uint8 bak;
times=CTIME0; //读取完整时钟寄存器0
bak=(times>>16)&0x1F; //取得时的值
send_buf[0]=bak/10+'0';
send_buf[1]=bak%10+'0';
send_buf[2]=':';
bak=(times>>8)&0x3F; //取得分的值
send_buf[3]=bak/10+'0';
send_buf[4]=bak%10+'0';
send_buf[5]=':';
bak=times&0x3F; //取得秒的值
send_buf[6]=bak/10+'0';
send_buf[7]=bak%10+'0';
send_buf[8]='\n';
DisText(0xC0,send_buf); // 第二行字符地址为:C0~CF。
}
/****************************************************************************
* 名称:RTCIni()
* 功能:初始化实时时钟。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void RTCIni(void)
{ PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
YEAR = 2004; // 初始化年
MONTH = 2; // 初始化月
DOM = 19; // 初始化日
HOUR = 8;
MIN = 30;
SEC = 0;
CIIR = 0x01; // 设置秒值的增量产生一次中断
CCR = 0x01; // 启动RTC
}
/****************************************************************************
* 名称:main()
* 功能: 读取实时时钟的值,并发送到 LCD
****************************************************************************/
int main(void)
{
IO0DIR = LED1CON;
IO0DIR=(IO0DIR & ~lcd_pins) | lcd_pins; // 将 P0.0~P0.10 设置为输出 0000 0111 1111 1111
IO0CLR=(IO0CLR & ~lcd_pins) | lcd_pins; // 将 P0.0~P0.10 设置为低电平
lcd_init();
DisText(0x80,MESSAGE); // 第一行字符地址为:80~8F。
RTCIni(); //初始化RTC
while(1)
{ IO0SET = (IO0SET & ~LED1CON) | LED1CON; //熄灭LED
while(0==(ILR&0x01)); //等待RTC增量中断标志位
ILR=0x01; //清除中断标志位
SendTimeRtc(); //读取时钟值,并向LCD发送
IO0CLR = (IO0CLR & ~LED1CON) | LED1CON; //点亮LED
while(0==(ILR&0x01));
ILR=0x01;
SendTimeRtc();
}
//return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -