单片机做ds1302实验时出现lcd乱码怎么办

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit CE=P3^5;
sbit DSIO=P3^4;
sbit SCLK=P3^6;
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
uchar code readds[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
uchar code writeds[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
uchar TIME[7]={0,0,0x12,0x01,0x01,0x02,0x13};
void delayms()
{
uint i,j;
for(i=10;i<0;i--)
for(j=110;j<0;j--);
}

uchar DS1302read(uchar addr)
{
uchar i,dat,dat1;
SCLK=0;
delayms();
CE=1;
delayms();
for(i=0;i<8;i++)
{
DSIO=addr&0x01;
addr>>=1;
SCLK=1;
delayms();
SCLK=0;
delayms();
}
for(i=0;i<8;i++)
{
dat1=DSIO;
dat=dat>>1;
dat|=dat1<<7;
SCLK=1;
delayms();
SCLK=0;
delayms();
}
CE=0;
delayms();
SCLK=1;
delayms();
DSIO=0;
delayms();
DSIO=1;
delayms();
return dat;
}
void DS1302write(uchar addr,uchar dat)
{
uchar n;
SCLK=0;
delayms();
CE=1;
delayms();
for(n=0;n<8;n++)
{
DSIO=addr&0x01;
addr>>=1;
SCLK=1;
delayms();
SCLK=0;
delayms();
}
for(n=0;n<8;n++)
{
DSIO=dat&0x01;
dat>>=1;
SCLK=1;
delayms();
SCLK=0;
delayms();
}
CE=0;
delayms();
}

void DS1302init()
{
uchar n;
DS1302write(0x8E,0x00);
for(n=0;n<7;n++)
{
DS1302write(writeds[n],TIME[n]);
}
DS1302write(0x8E,0x80);
}

void lcdwritecom(uchar com)
{
E=0;
RS=0;
RW=0;
P0=com;
delayms();
E=1;
delayms();
E=0;
delayms();
}

void lcdwritedata(uchar dat)
{
E=0;
RS=1;
RW=0;
P0=dat;
delayms();
E=1;
delayms();
E=0;
delayms();
}

void lcdinit()
{
lcdwritecom(0x38);
lcdwritecom(0x0c);
lcdwritecom(0x06);
lcdwritecom(0x01);
}

void DS1302readtime()
{
uchar n;
for(n=0;n<7;n++)
TIME[n]=DS1302read(readds[n]);
}

void lcddisplay()
{
lcdwritecom(0x80+0x40);
lcdwritedata('0'+TIME[2]/16);
lcdwritedata('0'+TIME[2]&0x0f);
lcdwritedata('-');
lcdwritedata('0'+TIME[1]/16);
lcdwritedata('0'+TIME[1]&0x0f);
lcdwritedata('-');
lcdwritedata('0'+TIME[0]/16);
lcdwritedata('0'+TIME[0]&0x0f);
lcdwritecom(0x80);
lcdwritedata('2');
lcdwritedata('0');
lcdwritedata('0'+TIME[6]/16);
lcdwritedata('0'+TIME[6]&0x0f);
lcdwritedata('-');
lcdwritedata('0'+TIME[4]/16);
delayms();
lcdwritedata('0'+TIME[4]&0x0f);
delayms();
lcdwritedata('-');
lcdwritedata('0'+TIME[3]/16);
lcdwritedata('0'+TIME[3]&0x0f);
lcdwritecom(0x8d);
lcdwritedata('0'+TIME[5]&0x07);
}
void main()
{
lcdinit();
DS1302init();
while(1)
{
DS1302readtime();
lcddisplay();
}
}
为什么后面的数字出现了乱码 求各位大神帮忙

估计是你发送给1602的待显示数据有问题,调试看看,

51单片机的话 一般不使用在线仿真 可以使用串口打印的方法调试
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-03-04
需要给你完成一份吗

单片机做ds1302实验时出现lcd乱码怎么办
51单片机的话 一般不使用在线仿真 可以使用串口打印的方法调试

我用DS1302+LCD1602+单片机制作的的电子钟,可以显示,但是时间不会走,而...
DS1302的数据显示存在16进制转换的问题,这个要特别注意。另外不要随便抄别人的程序,用之前一定要读懂,就是抄也要抄那种有正规注释的程序,这样查找问题比较容易。。建议你去杜洋的网站去下载一段标准的代码使用。。下面只是一部分。。\/*** DS1302 ***\/ \/\/设置1302的初始时间 void Init_1302(void)...

DS1302 液晶1602 单片机stc89C52 做出来的时钟,显示乱码该怎么办啊,求...
从你这个屏显的效果来看,字库和LCD驱动应该都是没问题的,你检查下仿真的器件型号是不是相同的,需要注意的是这个时钟的代码是使用的RTC还是外部晶振,然后这个晶振的频率和你仿真时是否一致。

单片机与数码管显示DS1302的时分秒,出现闪烁
那要看你是如何刷新数码管的了,刷得太慢会闪烁的。一般来说,无论你有多少个数码管,总的扫描时间不要超过30ms左右。那么如果有8个管,则每个管扫描时间为30\/8=3.75ms左右;若有5个管,则每个管扫描时间不要超过6ms左右,明白了嘛?

单片机,ds1302时钟电路显示问题,时间一直跳变(在开发板上实验的...
将显示程序的每一位之后的延时时间缩短,试试应该可以解决。

用单片机做了一个温度记录仪,数据记录的很奇怪,悬赏100解决
先别急,错误是有,但不离谱。你发现没?错误是有规律的,就是把温度个位(Dec)+温度十分位发到下一行了,就是说数据串位而且有丢失。我有点不明白你怎么用VB读的数据,串口通信吗?你这样,不去发送存储的数据,就发固定数据,就大概能发现问题所在。

各位单片机好友最近在做DS1302时BCD码什么意思
换成BCD码就是0010 0100B,用16进制就是 24BCD. 0010是2 ,0100是4.Value=(Value\/10)*16+Value%10 把10进制的24用BCD码表示是24BCD,即00100100,变换方法就是,24\/10*16+24% 10 24除10是2乘16是32,用二进制表示 是00100000;24%10是4,用二进制表示是0100,加起来就是00100100....

基于单片机驱动LCD波形显示~~跪求帮忙
1、建立一个数组存放可以显示整个LCD屏的数据(较大),建立一个数组用于存放并处理每次转换的A\/D数据。2、根据A\/D转换来的最大值跟最小值判断波形的峰值。然后将定时A\/D转换的数据转换成一个位。***比如DS1302一列有16位,一共有256列“好像”,这里就可以把最大值的数据定为0x1000 0000 0000...

将DS1302时钟芯片的时期显示在LCD上的代码 要是C语言的 单片机用51的...
void v_BurstW1302T(unsigned char *pSecDa){ unsigned char i;v_W1302(0x8e,0x00); \/* 控制命令,WP=0,写操作?*\/ T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xbe); \/* 0xbe:时钟多字节写命令 *\/ for (i=8;i>0;i--) \/*8Byte = 7Byte 时钟数据 + 1Byte 控制...

做万年历是用单片机自带时钟比用ds1302误差大原因是什么(具体些)_百度...
是32768KHZ的晶振的误差。

相似回答