注释加上了,请高行帮解决下
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4; //1602使能端
sbit lcdrs=P3^5; //1602读写控制端
sbit dula=P2^6; //开发板上的数码管段选,这里只是为了关闭数码管,下面的位选也一样,
sbit wela=P2^7;
uchar num;
sbit sck=P2^2; //1302时钟控制端
sbit sda=P2^0; //1302数据输入端
sbit rst=P2^1; //1302复位
unsigned char timedata[7]={0,0,0,0x23,0x11,0x03,0x11}; //秒分时日月周年 11-11-23 00:00:00
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年的 写 操作地址
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分时日月周年的 读 操作地址
code unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'}; //1602显示码0~9
void write_ds1302_byte(unsigned char temp) //写一个字节
{
unsigned char i;
for(i=0;i<8;i++) //循环8次写入数据
{
sda=temp&0x01; //每次传送低字节
sck=1;sck=0;
temp>>=1; //右移一位
}
}
void write_ds1302(unsigned char address,unsigned char dat) //向1302写地址和数据
{
rst=0;
_nop_();
sck=0;_nop_();
rst=1;_nop_(); //启动
write_ds1302_byte(address); //发送地址
write_ds1302_byte(dat); //发送数据
sck=1;
rst=0; //恢复
}
unsigned char read_ds1302(unsigned char address) //读数据
{
unsigned char i,temp=0x00;
rst=0;_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(address);
for(i=0;i<8;i++) //循环8次 读取数据
{
if(sda)
temp|=0x80; //每次传送低字节
sck=0;
temp>>=1; //右移一位
sck=1;
}
rst=0;_nop_(); //以下为DSc1302复位的稳定时间
rst=0;sck=0;_nop_();
sck=1;_nop_();sda=0;
_nop_();sda=1;_nop_();
return (temp); //返回读取的值
}
void set_rtc(void) //设定日历
{
unsigned char i;
write_ds1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++) //分7次 写入 秒分时日月周年
{
write_ds1302(write_rtc_address[i],timedata[i]);
}
write_ds1302(0x8e,0x80); //写保护
}
void read_rtc(void)
{
unsigned char i;
for(i=0;i<7;i++) //分7次 读取 秒分时日月周年
{
timedata[i]=read_ds1302(read_rtc_address[i]);
}
}
void delay(uint z) //时延(ms)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //1602写命令
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //1602写数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //1602初始化
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void display(void) //1602显示时钟
{
write_com(0x80+0x01);
write_data('2');
write_data('0');
write_data(table[(timedata[3]>>4)&&0x0f]); //显示年
write_data(table[timedata[3]&&0x0f]);
write_data('-');
write_data(table[(timedata[4]>>4)&&0x0f]); //显示月
write_data(table[timedata[4]&&0x0f]);
write_data('-');
write_data(table[(timedata[3]>>4)&&0x0f]); //显示日
write_data(table[timedata[3]&&0x0f]);
write_data(table[(timedata[5]>>4)&&0x0f]); //显示星期
write_data(table[timedata[5]&&0x0f]);
write_com(0x80+0x40);
write_data(table[(timedata[2]>>4)&&0x0f]); //显示时
write_data(table[timedata[2]&&0x0f]);
write_data(':');
write_data(table[(timedata[1]>>4)&&0x0f]); //显示分
write_data(table[timedata[1]&&0x0f]);
write_data(':');
write_data(table[(timedata[0]>>4)&&0x0f]); //显示秒
write_data(table[timedata[0]&&0x0f]);
}
main()
{
init(); //1602初始化
set_rtc(); //设定时钟
while(1)
{
read_rtc(); //读取时钟
display(); //显示时钟
delay(500);
}
}
|