📄 ds1302_lcm.txt
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar data cur_time[]={0x00,0x00,12,27,0x04,0x00,0x08};
uchar *xingqi[]={"Sun","Mon","Tue","Wen","Thu","Fri","Sat"};
uchar head1=0x80,head2=0xc0;/*lcd显示第一行首地址为head1,第二行为head2*/
bit line1=0;
bit line2=1;
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;/*lcd管脚*/
sbit t_clk=P1^1;
sbit t_io=P1^0;
sbit t_rst=P1^2;
sbit ACC0=ACC^0;
void delay200us()
{uchar m,n;
for(m=1;m>0;m--)
for(n=50;n>0;n--);
}
/********************************************************************以下是ds1302程序*/
void input1byte(uchar udata)
{uchar i;
ACC=udata;
for(i=8;i>0;i--)
{
t_io=ACC0;
t_clk=1;
t_clk=0;
ACC>>=1;
}
}
uchar output1byte(void)
{
uchar i,temp;
temp=0;
for(i=0;i<8;i++)
{
temp>>=1;
if(t_io==1)
temp=temp|0x80;
t_clk=1;
t_clk=0;
}
return(temp);
}
void w_1302(uchar addr,uchar j)
{t_rst=0;
t_clk=0;
t_rst=1;
input1byte(addr);
input1byte(j);
t_clk=1;
t_rst=0;
}
uchar r_1302(uchar addr)
{
unsigned char j,k=0x00;
t_rst=0;
t_clk=0;
t_rst=1;
input1byte(addr);
j=output1byte();
t_clk=1;
t_rst=0;
k=j/16;
j=j%16;
j=j+k*10;
return(j);
}
void set_1302()
{
uchar i,j;
uchar addr=0x80;
w_1302(0x8e,0x00);
for(i=0;i<7;i++)
{
j=cur_time[i];
w_1302(addr,j);
addr+=2;
}
w_1302(0x8e,0x80);
}
void get_1302()
{
uchar i;
uchar addr=0x81;
for (i=0;i<7;i++)
{
cur_time[i]=r_1302(addr);
addr+=2;
}
}
/********************************************************************/
/******************************************************************以下是lcd显示程序**/
bit busy_lcm()
{uchar temp;
P0=0xff;
RS=0;
RW=1;
E=1;
delay200us();
temp=P0;
E=0;
if(temp&0x80)return 1;
else return 0;
}
void w_comm(uchar temp)
{while(busy_lcm());
P0=temp;
RS=0;
RW=0;
E=1;
delay200us();
E=0;
}
void w_data(uchar temp)
{while(busy_lcm());
P0=temp;
RS=1;
RW=0;
E=1;
delay200us();
E=0;
}
void lcd_string(uchar x,uchar y,uchar *str)
{uchar address;
if(y==line1)address=head1+x;
else address=head2+x;
w_comm(address);
while(*str)
{w_data(*str);
str++;
}
}
void lcd_char(uchar x,uchar y,uchar udat)
{uchar address;
if(y==line1)address=head1+x;
else address=head2+x;
w_comm(address);
w_data(udat);
}
void lcd_init()
{w_comm(0x38);
w_comm(0x0c);
w_comm(0x06);
w_comm(0x01);
}
void display()
{
lcd_string(0x00,line1,"20");
lcd_char(0x02,line1,(cur_time[6]/10)|0x30);
lcd_char(0x03,line1,(cur_time[6]%10)|0x30);
lcd_string(0x04,line1,"-");
lcd_char(0x05,line1,(cur_time[4]/10)|0x30);
lcd_char(0x06,line1,(cur_time[4]%10)|0x30);
lcd_string(0x07,line1,"-");
lcd_char(0x08,line1,(cur_time[3]/10)|0x30);
lcd_char(0x09,line1,(cur_time[3]%10)|0x30);
lcd_string(0x0f,line1,xingqi[cur_time[5]]);
lcd_char(0x00,line2,(cur_time[2]/10)|0x30);
lcd_char(0x01,line2,(cur_time[2]%10)|0x30);
lcd_string(0x02,line2,":");
lcd_char(0x03,line2,(cur_time[1]/10)|0x30);
lcd_char(0x04,line2,(cur_time[1]%10)|0x30);
lcd_string(0x05,line2,":");
lcd_char(0x06,line2,(cur_time[0]/10)|0x30);
lcd_char(0x07,line2,(cur_time[0]%10)|0x30);
}
/********************************************************************/
void main(void)
{uchar i,k;
for(i=0;i<7;i++)
{
k=cur_time[i]/10;
cur_time[i]=cur_time[i]%10;
cur_time[i]=cur_time[i]+16*k;
}
set_1302();
lcd_init();
delay200us();
delay200us();
delay200us();
delay200us();
while(1)
{get_1302();
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -