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

LCD1602液晶显示DS1302实时时钟Proteus仿真

发布时间:2020-06-19 发布时间:
|
Proteus仿真图:

 

 

仿真程序:

 

#include

#include

#include

#define uint  unsigned int

#define uchar unsigned char

//*******LCD*******

sbit LCDRS=P2^0; //LCD数据/命令选择端

sbit LCDRW=P2^1;

sbit LCDEN=P2^2; //LCD使能新号端

//******DS1302******

sbit IO=P1^0; //1302数据线

sbit SCLK=P1^1; //1302时钟线

sbit RST=P1^2; //复位

 

uint num=0;

//uchar week[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"};

uchar Date[]={"Date: 2000-00-00 "};

uchar Time[]={"Time: *00:00-00* "};

uchar date_time[7]; //从ds1302读取的当前日期时间

//=======延时=======

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//********向1302写数据*********

void write_ds1302(uchar dat)

{

uchar i;

for(i=0;i<8;i++)

{

IO=dat & 0x01; //保持最后一位为1,读状态

SCLK=1;

delay(1);

SCLK=0;

dat >>= 1;

}

}

//*********从1302读数据*********

uchar read_ds1302()

{

uchar i,b=0x00;

for(i=0;i<8;i++)

{

b |= _crol_((uchar)IO,i);

SCLK=1;

delay(1);

SCLK=0;

}

return b/16*10+b%16; //与BCD码转换

}

//*********从指定位置读数据********

uchar read_data(uchar addr)

{

uchar dat;

RST=0;

SCLK=0;

RST=1;

write_ds1302(addr);

dat=read_ds1302();

SCLK=1;

RST=0;

return dat;

}

//*********读取当前日期时间*********

void read_date_time()

{

uchar i,addr=0x81;

for(i=0;i<7;i++)

{

date_time[i]=read_data(addr);

addr+=2;

}

}

//----------LCD写指令----------

void lcd_write_com(uchar com)

{

LCDRS=0; //RS为0时,写指令,RS为1时,写数据

P0=com;

delay(5);

LCDEN=1;

delay(5);

LCDEN=0;

}

//----------LCD写数据----------

void lcd_write_data(uchar dat)

{

LCDRS=1;

P0=dat;

delay(5);

LCDEN=1;

delay(5);

LCDEN=0;

}

//-------LCD初始化-------

void lcd_init()

{

LCDEN=0;

lcd_write_com(0x38); //LCD显示模式设置

lcd_write_com(0x0c); //LCD显示开/关及光标设置

lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1

lcd_write_com(0x01); //显示清屏

}

//---------设置液晶显示位置-----------

void set_lcd_pos(uchar p)

{

lcd_write_com(p | 0x80);

}

//---------液晶显示程序----------

void lcd_print(uchar p,uchar *s)

{

set_lcd_pos(p);

for(num=0;num<16;num++)

{

lcd_write_data(s[num]);

delay(10);

}

}

//----------日期时间转换-----------

void format_datetime(uchar d,uchar *p)

{

p[0]=d/10+'0';

p[1]=d%10+'0';

}

//---------主程序----------

void main()

{

LCDRW=0;

lcd_init();

while(1)

{

read_date_time();

format_datetime(date_time[6],Date+8); //年月日

format_datetime(date_time[4],Date+11);

format_datetime(date_time[3],Date+14);

// strcpy(Date+13,week[date_time[5]]);

format_datetime(date_time[2],Time+7); //时间转换

format_datetime(date_time[1],Time+10);

format_datetime(date_time[0],Time+13);

lcd_print(0x00,Date);

lcd_print(0x40,Time);

}

}

关键字:LCD1602  液晶显示  DS1302  实时时钟 

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

热门文章 更多
如何升级STM32单片机的代码