×
单片机 > 单片机程序设计 > 详情

12864液晶显示实时时钟

发布时间:2020-06-22 发布时间:
|
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

下面是一段12864液晶显示实时时钟的程序:

/***************************************************************************************
时间:2012.11.30
晶振:11.0592MHz
芯片:STC89C52RC
功能描述:在12864上显示年、月、日、星期、时、分和秒等时间信息
***************************************************************************************/ 
#include
#define uchar unsigned char
sbit CLK=P1^4;        //DS1302引脚定义
sbit IO=P1^5;
sbit CE=P1^6;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
 
sbit RS=P2^4;         //12864引脚定义        数据口为P0
sbit RW=P2^5;
sbit EN=P2^6;
sbit PSB=P2^1;
sbit RET=P2^3;

void Input_1byte(uchar TD)	//DS1302输入一字节数据

{
uchar i;
ACC=TD;
for(i=8;i>0;i--)
{
IO=ACC0;
CLK=1;
CLK=0;
ACC=ACC>>1;
}
}
uchar Output_1byte(void)       //DS1302输出一字节数据
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=IO;
CLK=1;
CLK=0;
}
return(ACC);
}
 
void Write_DS1302(uchar add,uchar dat)//向DS1302写
{
CE=0;
CLK=0;
CE=1;
Input_1byte(add);
Input_1byte(dat);
CE=0;
}
 
uchar Read_DS1302(uchar add)	//从DS1302读
{
uchar inf;	  //信息临时存储变量
CE=0;
CLK=0;
CE=1;
Input_1byte(add);
inf=Output_1byte();
CE=0;
return(inf);
}
 
/**********************DS1302初始化*****************************/
void init_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); //打开写保护  
}
}
 
/**********************延时函数*****************************/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
DelayUs2x(245);
 }
}
 
/**********************12864判忙*****************************/
void check_busy()
{
RS=0;
RW=1;
EN=1;
while((P0&0x80)==0x80);
EN=0;
}[page]
 
/**********************12864写指令*****************************/
void write_com(uchar com)
{
check_busy();
RS=0;
RW=0;
EN=1;
P0=com;
DelayUs2x(250);
EN=0;
DelayUs2x(250);
}
 
/**********************12864写数据*****************************/
void write_data(uchar dat)
{
check_busy();
RS=1;
RW=0;
EN=1;
P0=dat;
DelayUs2x(250);
EN=0;
DelayUs2x(250);
}
 
/**********************12864初始化函数*****************************/
void init()
{  
   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
}
 
/**********************清屏*****************************/
void clrscreen()
{
write_com(0x01);
DelayMs(15);
}

 
/*********************************************************
                            主函数
 ********************************************************/
void main()
{	
uchar sec,sec1,sec2;
uchar min,min1,min2;
uchar hour,hour1,hour2;
uchar date,date1,date2;
uchar mon,mon1,mon2;
uchar day;
uchar year,year1,year2;
uchar table1[]="年月日时分秒星期温度摄氏"; //长度24
uchar table2[]={0XD2,0XBB,  0XB6,0XFE,  0XC8,0XFD,  0XCB,0XC4,  0XCE,0XE5,
                                     0XCE,0XF9,  0XC8,0XD5};  //长度14
uchar table3[]="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]);
}
}
关键字:12864  液晶显示  实时时钟

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式