桂林电子科技大学课程设计(论文)报告用纸 第13页 共 32 页
C语言程序:
#include
#define uint unsigned int #define uchar unsigned char
sbit DS1302_CLK = P1^0; //实时时钟时钟线引脚 sbit DS1302_IO = P1^1; //实时时钟数据线引脚 sbit DS1302_RST = P1^2; //实时时钟复位线引脚
sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;
uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; 闪的计数
sbit Set = P3^4; //模式切换键 对应实验板K5 sbit Up = P3^5; //加法按钮 对应实验板K6
sbit Down= P3^6; //减法按钮 对应实验板K7
sbit out = P3^7; //立刻跳出调整模式按钮 对应实验板K8 //sbit p35=P3^5; //定时时间转换
sbit BEEP=P3^2; sbit guang=P3^3;
uchar done,count,temp,up_flag,down_flag; uchar h;
bit a,b; //闪烁标志位 uchar week_value[3];
void show_time(); //液晶显示程序
//**************************************** //12864液晶显示部分子程序模块
//**************************************** sbit rs = P2^0; sbit rw = P2^1; sbit e = P2^2; #define lcddata P0
sbit busy=P0^7; //lcd busy bit void wr_d_lcd(uchar content); void wr_i_lcd(uchar content); void clrram_lcd (void); void init_lcd(void); void busy_lcd(void);
void rev_row_lcd(uchar row);
void rev_co_lcd(uchar row,uchar col,uchar mode);
void clr_lcd(void);
void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2); void wr_row_lcd(uchar row,char *p);
unsigned char idata i,tl0_temp=0,th0_temp=0;
//秒,分,时到日,月,年位 桂林电子科技大学课程设计(论文)报告用纸 第14页 共 32 页
//********************************** //液晶初始化
//********************************** void init_lcd(void) {
wr_i_lcd(0x06); /*光标的移动方向*/ wr_i_lcd(0x0c); /*开显示,关游标*/
}
//*********************************** //填充液晶DDRAM全为空格
//********************************** void clrram_lcd (void) { }
wr_i_lcd(0x30); wr_i_lcd(0x01);
//*********************************** //对液晶写数据
//content为要写入的数据
//*********************************** void wr_d_lcd(uchar content) { busy_lcd(); rs=1; rw=0;
lcddata=content;
e=1; e=0; }
//******************************** //对液晶写指令
//content为要写入的指令代码 //***************************** void wr_i_lcd(uchar content) {
busy_lcd(); rs=0;
rw=0; lcddata=content; }
e=1; e=0;
桂林电子科技大学课程设计(论文)报告用纸 第15页 共 32 页
//******************************** //液晶检测忙状态 //在写入之前必须执行
//******************************** void busy_lcd(void) {
lcddata=0xff; rs=0; rw=1;
e =1;
while(busy==1); e =0;
}
//******************************** //指定要显示字符的坐标
//******************************* void gotoxy(unsigned char y, unsigned char x) {
if(y==1)
wr_i_lcd(0x80|x); if(y==2)
wr_i_lcd(0x90|x); if(y==3) wr_i_lcd((0x80|x)+8); if(y==4)
wr_i_lcd((0x90|x)+8); }
//********************************** //液晶显示字符串程序
//********************************** void print(uchar *str) { }
while(*str!='\\0') { }
wr_d_lcd(*str); str++;
桂林电子科技大学课程设计(论文)报告用纸 第16页 共 32 页
//*********************************** //DS1302时钟部分子程序模块
//*********************************** typedef struct __SYSTEMTIME__ { uchar Second;
uchar Minute; uchar Hour; uchar Week; uchar Day; uchar Month; uchar Year;
uchar DateString[11]; uchar TimeString[9];
}SYSTEMTIME; //定义的时间类型 SYSTEMTIME CurrentTime;
#define AM(X) X #define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK #define DS1302_DAY #define DS1302_MONTH #define DS1302_YEAR
0x8A 0x86 0x88 0x8C
//********************************** //实时时钟写入一字节(内部函数) //********************************** void DS1302InputByte(uchar d) {
uchar i; ACC = d;
for(i=8; i>0; i--) {
DS1302_IO = ACC0; DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; }
}
//************************************* //实时时钟读取一字节(内部函数)
//相当于汇编中的 RRC
桂林电子科技大学课程设计(论文)报告用纸 第17页 共 32 页
//************************************* uchar DS1302OutputByte(void) {
uchar i;
for(i=8; i>0; i--) {
ACC = ACC >>1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; }
return(ACC);
}
//************************************** //ucAddr: DS1302地址, ucData: 要写的数据 //************************************** void Write1302(uchar ucAddr, uchar ucDa) {
DS1302_RST = 0;
DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据
//相当于汇编中的 RRC
DS1302_CLK = 1; DS1302_RST = 0; }
//************************************** //读取DS1302某地址的数据
//************************************** uchar Read1302(uchar ucAddr) {
uchar ucData; DS1302_RST = 0; DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); }
//****************************************** //获取时钟芯片的时钟数据到自定义的结构型数组