LCD12864显示实时时钟例程可运行

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;

}

/**********************12864写指令*****************************/ void write_com(uchar com)

{

check_busy();

RS=0;

RW=0;

EN=1;

相关文档
最新文档