📄 1302.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit clk=P1^7;
sbit dat=P1^4;
sbit cs=P1^3;
uchar code a[]=" 2010-11-30 1";
uchar code b[]=" 00:00:00 ";
uchar read_date[]={0x00,0x59,0x23,0x30,0x11,0x06,0x10};
//秒、分、小时、日、月、星期、年
code uchar write_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code uchar read_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayus(uint k)
{
for(;k>0;k--);
}
void check_1602()
{
P2=0xff;
rs=0;
rw=1;
en=1;
delayus(3);
while(P2&0x80);
en=0;
}
void write1602_command(uchar d,uchar command)//写指令子函数
{
if(d)
check_1602();
rs=0;
rw=0;
P2=command;
delayus(100);
en=1;
delay(4);
en=0;
}
void write1602_data(uchar date)//写数据子函数
{
rs=1;
rw=0;
P2=date;
delayus(100);
en=1;
delay(4);
en=0;
}
void init()
{
en=0;
rw=0;
write1602_command(1,0x38);
write1602_command(1,0x01);
write1602_command(1,0x0c);
write1602_command(1,0x06);
write1602_command(1,0x80);
}
void write_1302_byte(uchar temp)
{
uchar i;
for (i=0;i<8;i++) //循环8次 写入数据
{
clk=0;
dat=temp&0x01; //每次传输低字节
temp>>=1; //右移一位
clk=1;
}
}
void write_1302( uchar add,uchar date )
{
cs=0;
_nop_();
clk=0;
_nop_();
cs=1;
_nop_(); //启动
write_1302_byte(add); //发送地址
write_1302_byte(date); //发送数据
cs=0; //恢复
}
uchar Read_Ds1302 (uchar addr )
{
uchar i,temp=0x00;
cs=0;
_nop_();
clk=0;
_nop_();
cs=1;
_nop_();
write_1302_byte(addr);
for (i=0;i<8;i++) //循环8次 读取数据
{
clk=1;
_nop_();
if(dat)
temp|=0x80; //每次传输低字节
clk=0;
temp>>=1; //右移一位
}
cs=0;
_nop_();
cs=1;
dat=0;
return (temp); //返回
}
void Read_RTC(void) //读取 日历
{
unsigned char i,*p;
p=read_address; //地址传递
for(i=0;i<7;i++) //分7次读取 年月日时分秒星期
{
read_date[i]=Read_Ds1302(*p);
p++;
}
}
void Set_RTC(void) //设定 日历
{
unsigned char i,*p,tmp;
/*for(i=0;i<7;i++){
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}*/
write_1302(0x8E,0X00);
p=write_address; //传地址
for(i=0;i<7;i++) //7次写入 年月日时分秒星期
{
write_1302(*p,read_date[i]);
p++;
}
write_1302(0x8E,0x80);
}
void display(uchar num)
{
write1602_data(num/16+0x30);
write1602_data(num%16+0x30);
}
void main()
{ uchar i;
init();
write1602_command(1,0x80);
for(i=0;i<16;i++)
{
write1602_data(a[i]);
delay(1);
}
write1602_command(1,0x80+0x40);
for(i=0;i<16;i++)
{
write1602_data(b[i]);
delay(1);
}
//cs=0;
//Set_RTC();
while(1)
{
Read_RTC();
write1602_command(1,0x80+0x40+9);
display(read_date[0]);
write1602_command(1,0x80+0x40+6);
display(read_date[1]);
write1602_command(1,0x80+0x40+3);
display(read_date[2]);
write1602_command(1,0x80+10);
display(read_date[3]);
write1602_command(1,0x80+7);
display(read_date[4]);
write1602_command(1,0x80+15);
write1602_data(0x30+read_date[5]);
write1602_command(1,0x80+4);
display(read_date[6]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -