关于ds1302和lcd1602问题,请大神指教,好人好报,急。
这次想做个ds1302的时钟用lcd1602来显示,可是在写完程序之后发现模拟的电路运行不正常,我觉得电路应该没问题,1302已经给他置了初值进去便能计时,现在lcd1602不能显示出正确的时间,我估计是读取1302哪里的问题,要么就是转换为bcd码 再转换为十进制错了这里的转换我一直不理解 我用的是模块化编程 贴上一部分代码我是小白 望大神指教。谢谢了。这个是1302的程序
#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uintunsigned int
sbit rst=P3^4;
sbit sclk=P3^5;
sbit io=P3^6;
uchartime_data={13,1,5,6,20,47,32} ;//年 星期 月 日 小时 分 秒
uchartime_add={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
ucharread_add={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81} ;
void write_ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0;
io=dat&0x01; //从低位开始传输
dat=dat>>1;
sclk=1; //数据在上升沿有效 开始写入
}
}
uchar read_ds1302_byte(uchar add)
{
uchar i;
uchar dat;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
write_ds1302_byte(add);//由于写时sclk为高电平
for(i=0;i<8;i++)
{
sclk=0; //读下降沿有效
dat=dat>>1; //只移7位
if(io)
{
dat=dat|0x80;
sclk=1;
}
}
rst=0;
_nop_();
sclk=0;
_nop_();
sclk=1;
_nop_();
io=1;
return(dat);
}
void write_ds1302(uchar add,uchar dat)
{
rst=0;
_nop_();
rst=1;
_nop_();
sclk=0;
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sclk=1;
}
void set_rtc()
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_data/10; //十位
time_data=time_data%10; //个位
time_data=j*16+time_data;//转换为十六进制
}
write_ds1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write_ds1302(time_add,time_data);
}
write_ds1302(0x8e,0x80); //加写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data=read_ds1302_byte(read_add); //读取的是16进制数 需转换
}
}
这是1602的代码
#include"LCD1602.H"
#include<reg52.h>
#include"DELAY.H"
#include"dds1302.h"
#define uchar unsigned char
#define uintunsigned int
sbit rs=P1^1;
sbit rw=P1^2;
sbit en=P1^3;
unsigned char digital={"0123456789"} ;
void write_data(unsigned char dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delay_50us(6);
en=1;
delay_50us(20);
en=0;
}
void write_command(unsigned char com) /***lcd1602写指令***/
{
rs=0;
rw=0;
en=0; //先拉低使能端,因为初始化默认为高电平
P0=com;
delay_50us(6);
en=1;
delay_50us(20);
en=0;
}
void disp_year()
{
uint i ,j; //十位 个位
i=time_data/16; //十位
j=time_data%16; //个位
write_command(0x80+5);
write_data(digital);
write_command(0x80+6);
write_data(digital);
delay_50us(200); //延时1ms
}
void disp_month()
{
uchar i ,j; //十位 个位
i=time_data/16; //十位
j=time_data%16; //个位
write_command(0x80+8);
write_data(digital);
write_command(0x80+9);
write_data(digital);
delay_50us(200); //延时1ms
}
void disp_date() //日
{
uchar i ,j; //十位 个位
i=time_data/16; //十位
j=time_data%16; //个位
write_command(0x80+11);
write_data(digital);
write_command(0x80+12);
write_data(digital);
delay_50us(200); //延时1ms
}
void disp_day() /***星期***/
{
uchar i ,j; //十位 个位
i=time_data/16; //十位
j=time_data%16; //个位
write_command(0x80+14); //第一列 14行
write_data(digital);
write_command(0x80+15);
write_data(digital);
delay_50us(200); //延时1ms
}
void disp_hour()
{
uchar i ,j; //十位 个位
i=time_data/16; //十位
j=time_data%16; //个位
write_command(0xc0+5); //第一列 14行
write_data(digital);
write_command(0xc0+6);
write_data(digital);
delay_50us(200); //延时1ms
}
void disp_minute()
{
uchar i ,j; //十位 个位
i=time_data/16; //十位
j=time_data%16; //个位
write_command(0xc0+8); //第一列 14行
write_data(digital);
write_command(0xc0+9);
write_data(digital);
delay_50us(200); //延时1ms
}
void disp_second()
{
uint i ,j; //十位 个位
i=time_data/16; //十位
j=time_data%16; //个位
write_command(0xc0+11); //第一列 14行
write_data(digital);
write_command(0xc0+12);
write_data(digital);
delay_50us(200); //延时1ms
}
void disp_all_date()
{
disp_year() ;
disp_month();
disp_day(); //星期
disp_date(); //日
disp_hour();
disp_minute();
disp_second();
}
void init_lcd1602(void)
{
write_command(0x38);
delay(20);
write_command(0x38);
delay(20);
write_command(0x38);
write_command(0x0c);
delay(20);
write_command(0x06);
delay(20);
write_command(0x01);
delay(20);
}
这是主函数main()
#include"dds1302.h"
#include<reg52.h>
#include<intrins.h>
#include"DELAY.H"
#include"LCD1602.H"
void main()
{
set_rtc();
init_lcd1602();
write_command(0x80);
write_data('D');
write_data('a');
write_data('t');
write_data('e');
write_data(':');
while(1)
{
read_rtc();
disp_all_date();
}
}
附上模拟电路图片 怎么没有人了。。。????求助啊 同求。。。。。。 一部分一部分的测试了 用串口先输出来看结果,如果这个你不想也估计没人能帮你了 bbssilverkey 发表于 2013-5-9 10:03 static/image/common/back.gif
用串口先输出来看结果,如果这个你不想也估计没人能帮你了
已经解决了 ,折腾了几个小时 谢谢 大哈欠E 发表于 2013-5-9 14:10 static/image/common/back.gif
已经解决了 ,折腾了几个小时 谢谢
呵呵,加油吧,以后经常都会遇到这种事.
页:
[1]