LCD电子时钟
#include<reg51.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit DS1302_CE=P3^5;
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
u8 datetime[8];
#define LCD_DB P0
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
void DS1302_init(void);
void DS1302_writecommad(u8 cmd);
u8 DS1302_readbyte(u8 addr);
void DS1302_readbytes(u8 addr,u8 num,u8 datas[]);
void DS1302_writebyte(u8 addr,u8 dat);
void DS1302_writebytes(u8 addr,u8 num,u8 datas[]);
void delay(u16 t);
void LCD_init(void);
void LCD_write_command(u8 command);
void LCD_write_data(u8 dat);
void LCD_disp_char(u8 x,u8 y,u8 dat);
void LCD_check_busy(void);
void DS1302_init(void)
{
DS1302_CE=0;
DS1302_SCLK=0;
DS1302_IO=0;
}
void DS1302_writecommad(u8 cmd)
{
u8 i;
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=cmd & 0x01;
cmd >>=1;
DS1302_SCLK=1;
nop();
DS1302_SCLK=0;
}
}
u8 DS1302_readbyte(u8 addr)
{
u8 i,dat;
DS1302_writecommad(addr);
DS1302_IO=1;
dat=0;
for(i=0;i<8;i++)
{
dat >>=1;
if(DS1302_IO)
dat |=0x80;
DS1302_SCLK=1;
nop();
DS1302_SCLK=0;
}
nop();
DS1302_CE=0;
DS1302_IO=0;
return dat;
}
void DS1302_readbytes(u8 addr,u8 num,u8 datas[])
{
u8 i,j,dat;
DS1302_writecommad(addr);
DS1302_IO=1;
for(j=0;j<num;j++)
{
dat=0;
for(i=0;i<8;i++)
{
dat >>=1;
if(DS1302_IO)
dat |=0x80;
DS1302_SCLK=1;
nop();
DS1302_SCLK=0;
}
datas[j]=dat;
}
nop();
DS1302_CE=0;
DS1302_IO=0;
}
void DS1302_writebyte(u8 addr,u8 dat)
{
u8 i;
DS1302_writecommad(addr);
for(i=0;i<8;i++)
{
DS1302_IO=dat & 0x01;
dat >>=1;
DS1302_SCLK=1;
nop();
DS1302_SCLK=0;
}
DS1302_CE=0;
}
void DS1302_writebytes(u8 addr,u8 num,u8 datas[])
{
u8 i,j,dat;
DS1302_writecommad(addr);
for(j=0;j<num;j++)
{
dat=datas[j];
for(i=0;i<8;i++)
{
DS1302_IO=dat & 0x01;
dat >>=1;
DS1302_SCLK=1;
nop();
DS1302_SCLK=0;
}
}
DS1302_CE=0;
}
void delay(u16 t)
{
u8 i;
while (t–)
{
i=124;
while(i–);
}
}
void LCD_init(void)
{
LCD_write_command(0x38);
LCD_write_command(0x0c);
LCD_write_command(0x06);
LCD_write_command(0x01);
LCD_check_busy();
}
void LCD_write_command(u8 dat)
{
LCD_DB=dat;
LCD_RS=0;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
LCD_check_busy();
}
void LCD_write_data(u8 dat)
{
LCD_DB=dat;
LCD_RS=1;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
LCD_check_busy();
}
void LCD_disp_char(u8 x,u8 y,u8 dat)
{
u8 address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
void LCD_check_busy()
{
u8 temp;
LCD_DB=0xff;
do
{
LCD_E=0;
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
temp=LCD_DB;
temp &=0x80;
}while(temp);
LCD_E=0;
}
void lcd_write_chars(u8 add,u8 *p)
{
LCD_write_command(add);
while (*p!=’\0’)
{
LCD_write_data(*p++);
}
}
void main()
{
u8 i,addr;
DS1302_init();
LCD_init();
lcd_write_chars(0x80+0x01," DS1302");
lcd_write_chars(0x80+0x40," initial!");
delay(2000);
LCD_init();
lcd_write_chars(0x80+0x01," Write RAM!");
lcd_write_chars(0x80+0x40," A to H");
addr='A';
for(i=0;i<8;i++)
{
datetime[i]=addr;
addr ++;
}
addr=0xfe;
DS1302_writebytes(addr,8,datetime);
delay(2000);
LCD_init();
lcd_write_chars(0x80+0x01,"set date 2018");
lcd_write_chars(0x80+0x40,"01-01 12:30:00");
datetime[0]=0x00;
datetime[1]=0x30;
datetime[2]=0x12;
datetime[3]=0x01;
datetime[4]=0x01;
datetime[5]=0x01;
datetime[6]=0x18;
datetime[7]=0x00;
DS1302_writebyte(0x8E,0X00);
addr=0x80;
for(i=0;i<8;i++)
{
DS1302_writebyte(addr,datetime[i]);
addr +=2;
}
DS1302_writebyte(0x8E,0x80);
delay(2000);
LCD_init();
lcd_write_chars(0x80+0x01,"Read RAM!");
addr=0xff;
DS1302_readbytes(addr,8,datetime);
lcd_write_chars(0x80+0x40,datetime);
delay(2000);
LCD_init();
while(1)
{
addr=0xbf;
DS1302_readbytes(addr,8,datetime);
lcd_write_chars(0x80+0x00,"DATE:20");
LCD_write_data((datetime[6] >> 4) | 0x30);
LCD_write_data((datetime[6]& 0x0f)| 0x30);
LCD_write_data('-');
LCD_write_data((datetime[4] >> 4) | 0x30);
LCD_write_data((datetime[4]& 0x0f)| 0x30);
LCD_write_data('-');
LCD_write_data((datetime[3] >> 4) | 0x30);
LCD_write_data((datetime[3]& 0x0f)| 0x30);
lcd_write_chars(0x80+0x40,"TIME:");
LCD_write_data((datetime[2] >> 4) | 0x30);
LCD_write_data((datetime[2]& 0x0f)| 0x30);
LCD_write_data('-');
LCD_write_data((datetime[1] >> 4) | 0x30);
LCD_write_data((datetime[1]& 0x0f)| 0x30);
LCD_write_data('-');
LCD_write_data((datetime[0] >> 4) | 0x30);
LCD_write_data((datetime[0]& 0x0f)| 0x30);
lcd_write_chars(0x80+0x4e,"W");
LCD_write_data(datetime[3] | 0x30);
delay(500);
}
}