⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302_lcm.txt

📁 采用实时芯片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 + -