STC89S51单片机 DS1302时钟显示在LCD液晶屏幕上
1.根据时序图和单字节读写 写读写程序
void ds1302write(uchar addr, uchar dat)//写入函数
{
//要读2次 一次读地址 一次读数据
uchar n;
RST = 0;//可以看到CE先置0 延时一会后再置1
_nop_();
SCLK = 0;//开始先置0
_nop_();
RST = 1; //
_nop_();
//读地址
for (n=0; n<8; n++)//
{
//下降沿时 ds1302会自动把数据放到IO口上
DSIO = addr & 0x01;//取最低位 然后右移 8次 读取8位
addr >>= 1;
SCLK = 1;//然后产生时钟信号开始读取
_nop_();
SCLK = 0;
_nop_();
}
//读数据
for (n=0; n<8; n++)//
{
DSIO = dat & 0x01;//同上
dat >>= 1;
SCLK = 1;//
_nop_();
SCLK = 0;
_nop_();
}
//最后置0
RST = 0;
_nop_();
}
//从keli复制过来是注释是乱码 就不重新写了 同上
unsigned char ds1302read(unsigned char addr)8//读函数
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;
_nop_();
RST = 1;//
_nop_();
for(n=0; n<8; n++)//
{
DSIO = addr & 0x01;//
addr >>= 1;
SCLK = 1;//
_nop_();
SCLK = 0;
_nop_();//
}
_nop_();
for(n=0; n<8; n++)//
{
dat1 = DSIO;
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//
_nop_();
}
RST = 0;
_nop_();
//
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
2. DS1302初始化函数和读取DS1302里面的数据 第一个是程序需要的一些量
#include "clock.h"
#define LCD1602_DATAPINS P0
uchar i,j;
uchar date[16]="date:20 : : ";
uchar time2[16]="time: : : ";
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar TIME[7] = {0, 0x33, 0x11, 0x30, 0x03, 0x06, 0x23};
unsigned char dis_code[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
void Ds1302Init()//初始化
{
uchar n;
ds1302write(0x8E,0x00); //禁止写保护
for (n=0; n<7; n++)//
{
ds1302write(WRITE_RTC_ADDR[n],TIME[n]);//写入一个初始时间 可以自己定
}
ds1302write(0x8E,0x80); //´打开写保护
}
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)
{
TIME[n] = ds1302read(READ_RTC_ADDR[n]);//把读到的数据放到TIME里面
}
}
3. DS1302基本完毕 再是关于LCD液晶显示器相关代码
代码注释都乱码了 具体的可以百度lcd如何写
void LcdInit()
{
LcdWriteCom(0x38);//设置 8 位格式,2 行,5x7
LcdWriteCom(0x0c);//整体显示,关光标,不闪烁
LcdWriteCom(0x06);//设定输入方式,增量不移位
LcdWriteCom(0x01);//清除屏幕显示
}
void LcdcheckBuzy()//检查LCD是否忙
{
uchar sta;
do{
LCD1602_DATAPINS=0xff;
LCD1602_E=0;
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_E=1;
sta=LCD1602_DATAPINS;
}while(sta&0x80);
LCD1602_E=0;
}
void LcdWriteData(uchar dat)
{
LcdcheckBuzy();
LCD1602_E = 0; //
LCD1602_RS = 1; //
LCD1602_RW = 0; //
LCD1602_DATAPINS = dat; //
LCD1602_E = 1; //
_nop_();
LCD1602_E = 0;
}
void LcdWriteCom(uchar com)
{
LcdcheckBuzy();
LCD1602_E = 0; //
LCD1602_RS = 0; //
LCD1602_RW = 0; //
LCD1602_DATAPINS = com;//
LCD1602_E = 1; //
nop_();
LCD1602_E = 0;
}
void string(uchar ad, uchar *s)
{
LcdWriteCom(ad);
while(*s>0)
{
LcdWriteData(*s++);
}
}
4.void main主函数
void main()
{
LcdInit();//³õʼ»¯Ê±lcd
Ds1302Init();//³õʼ»¯Ê±ÖÓ
while(1)
{
Ds1302ReadTime();//读取时间
showTimeandDate();//显示时间到lcd
}
}
void showTimeandDate()
{
date[7]=((TIME[6]/16)+'0');//
date[8]=((TIME[6]&0x0f)%10+'0');//
date[10]=((TIME[4]/16)+'0');//
date[11]=((TIME[4]&0x0f)%10+'0');//
date[13]=((TIME[3]/16)+'0');//
date[14]=((TIME[3]&0x0f)%10+'0');//
time2[5]=TIME[2]/16+'0';//
time2[6]=(TIME[2]&0x0f)%10+'0';//
time2[8]=TIME[1]/16+'0';//
time2[9]=(TIME[1]&0x0f)%10+'0';//
time2[11]=TIME[0]/16+'0';//
time2[12]=(TIME[0]&0x0f)%10+'0';//
string(0x80,date);
string(0xc0,time2);
}
5.展示视频
VID_20230411_173807