找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

关于DS1302在LCD1602上显示的一些问题

[复制链接]
admin 发表于 2012-9-2 07:29:52 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本来是新手 才学半个多月 打算设计一个时钟 可是调试的时候 时分秒的数据读不出来 望高手看下市哪里的问题 谢谢了...


#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
uchar hou,min,sec,aa;
sbit wela=P2^7;
sbit dula=P2^6;
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P2^5; //DS1302使能端
sbit IO=P2^0; //DS1302IO口
sbit CLK=P2^1; //DS1302时钟口
//****** 延时函数 大约1ms
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//LCD写指令函数
void LCD_write_commend(uchar com)
{
uchar i;
E=0;
RS=0;
RW=0;

for(i=8;i>0;i--)
{
P0=com;
E=1;
E=0;
com>>=1;
}
}
//LCD写数据函数
void LCD_write_data(uchar dat)
{
uchar j;
E=0;
RS=1;
RW=0;

for(j=8;j>0;j--)
{
P0=dat;
E=1;
E=0;
dat>>=1;
}
}
//******LCD初始化
void LCDinit()
{
wela=0;
dula=0;
LCD_write_commend(0x38);
delay(5);
LCD_write_commend(0x80+0x0);
delay(5);
LCD_write_commend(0x0f);
delay(5);
LCD_write_commend(0x06);
delay(5);
}
//*******DS1302初始化
void DS_write(uchar dat3)
{
uchar h;
CLK=0;
for(h=8;h>0;h--)
{
/*IO=(dat3&0x01);
CLK=1;
CLK=0;
dat3>>=1; */
if(dat3&0x01)
{
IO=1;
}
else
{
IO=0;
}
dat3>>=1;
CLK=1;
CLK=0;
}
}
//***DS1302读函数
uchar DS_read()
{
uchar ReadValue,k;
CLK=0;
IO=1;
for(k=8;k>0;k--)
{
ReadValue>>=1;
if(IO==1)
{
ReadValue|=0x80;
}
else
{
ReadValue&=0x7f;
}
CLK=1;
CLK=0;

}
return ReadValue;
}
//****DS1302位写
void DS_write_byte(uchar address,uchar content)
{
CLK=0;
DS_write(address);
DS_write(content);

}
//****DS1302位读
uchar DS_read_byte(uchar address)
{
uchar ReadValue;
DS_write(address);
ReadValue=DS_read();
return ReadValue;
}
void DSinit()
{

DS_write_byte( 0x8e, 0x00 ) ; //写保护关闭
DS_write_byte( 0x84, 0x13 ) ; //小时
DS_write_byte( 0x82, 0x06 ) ; //分钟
DS_write_byte( 0x80, 0x20 ) ; //秒钟
DS_write_byte( 0x90, 0xa5 ) ; //充电
DS_write_byte( 0x8e, 0x80 ) ; //写保护开启


}
//****下载时间函数
void ClockUpdata() //这里DS1302读出来的数据是二进制的么 所以要写入LCD先要转换成16进制 具体怎么转换呢?
{
uchar ReadValue;
ReadValue=DS_read_byte(0x81) ;
sec=(ReadValue/16)*10+ReadValue%16;
ReadValue=DS_read_byte(0x83) ;
min=(ReadValue/16)*10+ReadValue%16;
ReadValue=DS_read_byte(0x85) ;
hou=(ReadValue/16)*10+ReadValue%16;
}
void timer0() interrupt 1 //***中断函数 每隔50ms更新一次时间
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ClockUpdata();
aa++;
}
void display() //显示函数 具体还不清楚应该怎么显示 所以是乱写的 望高手指点下
{
LCD_write_commend(0x80+0x42);
delay(5);
LCD_write_data(hou);
delay(5);
// LCD_write_data(hou%16);
// delay(5);
LCD_write_data(0xb0);
delay(5);
LCD_write_data(min);
delay(5);
// LCD_write_data(min%16);
// delay(5);
LCD_write_data(0xb0);
delay(5);
LCD_write_data(sec);
delay(5);
// LCD_write_data(sec%16);
// delay(5);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
LCDinit();
DSinit();
ClockUpdata();


while(1)
{
if(aa==10)
{

aa=0;
display();
}

}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 05:49 , Processed in 0.052290 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表