LCD电子时钟

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);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静安书以沫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值