12864液晶显示实时时钟.docx
《12864液晶显示实时时钟.docx》由会员分享,可在线阅读,更多相关《12864液晶显示实时时钟.docx(8页珍藏版)》请在冰豆网上搜索。
![12864液晶显示实时时钟.docx](https://file1.bdocx.com/fileroot1/2023-5/26/57288387-079e-42e7-8ee8-ba2ddc700f0c/57288387-079e-42e7-8ee8-ba2ddc700f0c1.gif)
12864液晶显示实时时钟
12864液晶显示实时时钟
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
下面是一段12864液晶显示实时时钟的程序:
/***************************************************************************************
时间:
2012.11.30
晶振:
11.0592MHz
芯片:
STC89C52RC
功能描述:
在12864上显示年、月、日、星期、时、分和秒等时间信息
***************************************************************************************/
#include;
#defineucharunsignedchar
sbitCLK=P1^4;//DS1302引脚定义
sbitIO=P1^5;
sbitCE=P1^6;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitRS=P2^4;//12864引脚定义数据口为P0
sbitRW=P2^5;
sbitEN=P2^6;
sbitPSB=P2^1;
sbitRET=P2^3;
voidInput_1byte(ucharTD)//DS1302输入一字节数据
{
uchari;
ACC=TD;
for(i=8;i>;0;i--)
{
IO=ACC0;
CLK=1;
CLK=0;
ACC=ACC>;>;1;
}
}
ucharOutput_1byte(void)//DS1302输出一字节数据
{
uchari;
for(i=8;i>;0;i--)
{
ACC=ACC>;>;1;
ACC7=IO;
CLK=1;
CLK=0;
}
return(ACC);
}
voidWrite_DS1302(ucharadd,uchardat)//向DS1302写
{
CE=0;
CLK=0;
CE=1;
Input_1byte(add);
Input_1byte(dat);
CE=0;
}
ucharRead_DS1302(ucharadd)//从DS1302读
{
ucharinf;//信息临时存储变量
CE=0;
CLK=0;
CE=1;
Input_1byte(add);
inf=Output_1byte();
CE=0;
return(inf);
}
/**********************DS1302初始化*****************************/
voidinit_1302()
{
if(Read_DS1302(0xd1)==0x55)//判断内存单元的内容,是否进行初始化
{
return;
}
else
{
Write_DS1302(0x8e,0x00);//关闭写保护
Write_DS1302(0x90,0x00);//电池充电设置
Write_DS1302(0x80,0x00);//秒
Write_DS1302(0x82,0x54);//分
Write_DS1302(0x84,0x20);//时
Write_DS1302(0x86,0x30);//日
Write_DS1302(0x88,0x11);//月
Write_DS1302(0x8a,0x05);//星期
Write_DS1302(0x8c,0x12);//年
Write_DS1302(0xd0,0x55);//写RAM
Write_DS1302(0x8e,0x80);//打开写保护
}
}
/**********************延时函数*****************************/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/**********************12864判忙*****************************/
voidcheck_busy()
{
RS=0;
RW=1;
EN=1;
while((P0&0x80)==0x80);
EN=0;
}
/**********************12864写指令*****************************/
voidwrite_com(ucharcom)
{
check_busy();
RS=0;
RW=0;
EN=1;
P0=com;
DelayUs2x(250);
EN=0;
DelayUs2x(250);
}
/**********************12864写数据*****************************/
voidwrite_data(uchardat)
{
check_busy();
RS=1;
RW=0;
EN=1;
P0=dat;
DelayUs2x(250);
EN=0;
DelayUs2x(250);
}
/**********************12864初始化函数*****************************/
voidinit()
{
DelayMs(40);//大于40MS的延时程序
PSB=1;//设置为8BIT并口工作模式
DelayMs
(1);//延时
RET=0;//复位
DelayMs
(1);//延时
RET=1;//复位置高
DelayMs(200);
write_com(0x30);//选择基本指令集
DelayUs2x(250);//延时大于100us
write_com(0x30);//选择8bit数据流
DelayUs2x(200);//延时大于37us
write_com(0x0c);//开显示(无游标、不反白)
DelayUs2x(250);//延时大于100us
write_com(0x01);//清除显示,并且设定地址指针为00H
DelayMs(200);//延时大于10ms
write_com(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
DelayUs2x(250);//延时大于100us
}
/**********************清屏*****************************/
voidclrscreen()
{
write_com(0x01);
DelayMs(15);
}
/*********************************************************
主函数
********************************************************/
voidmain()
{
ucharsec,sec1,sec2;
ucharmin,min1,min2;
ucharhour,hour1,hour2;
uchardate,date1,date2;
ucharmon,mon1,mon2;
ucharday;
ucharyear,year1,year2;
uchartable1[]="年月日时分秒星期温度摄氏";//长度24
uchartable2[]={0XD2,0XBB,0XB6,0XFE,0XC8,0XFD,0XCB,0XC4,0XCE,0XE5,
0XCE,0XF9,0XC8,0XD5};//长度14
uchartable3[]="0123456789";//长度10
init();//液晶初始化
clrscreen();
DelayMs(200);
init_1302();//1302初始化只初始化一下就可以需要下载两次
DelayMs(50);
write_com(0x80);//显示20
write_data('2');
write_data('0');
write_com(0x82);//显示年
write_data(table1[0]);
write_data(table1[1]);
write_com(0x84);//显示月
write_data(table1[2]);
write_data(table1[3]);
write_com(0x86);//显示日
write_data(table1[4]);
write_data(table1[5]);
write_com(0x91);//显示时
write_data(table1[6]);
write_data(table1[7]);
write_com(0x93);//显示分
write_data(table1[8]);
write_data(table1[9]);
write_com(0x95);//显示秒
write_data(table1[10]);
write_data(table1[11]);
write_com(0x88);//显示星期
write_data(table1[12]);
write_data(table1[13]);
write_data(table1[14]);
write_data(table1[15]);
while
(1)
{
sec=Read_DS1302(0x81);////读秒
sec1=sec&0x0f;//个位
sec2=sec>;>;4;//十位
min=Read_DS1302(0x83);////读分
min1=min&0x0f;//个位
min2=min>;>;4;//十位
hour=Read_DS1302(0x85);////读时
hour1=hour&0x0f;//个位
hour2=hour>;>;4;//十位
date=Read_DS1302(0x87);////读日
date1=date&0x0f;//个位
date2=date>;>;4;//十位
mon=Read_DS1302(0x89);////读月
mon1=mon&0x0f;//个位
mon2=mon>;>;4;//十位
year=Read_DS1302(0x8d);////读年
year1=year&0x0f;//个位
year2=year>;>;4;//十位
day=Read_DS1302(0x8b);////读星期
write_com(0x94);//送显示内容
write_data(table3[sec2]);//秒
write_data(table3[sec1]);
write_com(0x92);
write_data(table3[min2]);//分
write_data(table3[min1]);
write_com(0x90);
write_data(table3[hour2]);//时
write_data(table3[hour1]);
write_com(0x85);
write_data(table3[date2]);//日
write_data(table3[date1]);
write_com(0x83);
write_data(table3[mon2]);//月
write_data(table3[mon1]);
write_com(0x81);
write_data(table3[year2]);//年
write_data(table3[year1]);
write_com(0x8a);
write_data(table2[2*day-2]);//星期
write_data(table2[2*day-1]);
}
}