本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_E=P2^5;
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^7;
sbit DS1302_RST=P1^0;
sbit DS1302_CLK=P1^1;
sbit DS1302_DIO=P1^2;
uchar first_time[]={0x30,0x25,0x15,0x21,0x08,0x3,0x21};
uchar time[]={0,0,'-',0,0,'-',0,0,0};
uchar date[]={0,0,'-',0,0,'-',0,0,0};
void delay(uint x)
{
uint i;
uchar j;
for(i=0;i<x;i++)
for(j=0;j<25;j++);
}
/****************************写数据**************************/
void write_cmd(uchar cmd)
{
LCD_RS=0;
P0=cmd;
LCD_E=0;
LCD_E=1;
LCD_E=0;
delay(4);
}
/*************************写命令****************************/
void write_dat(uchar dat)
{
LCD_RS=1;
P0=dat;
LCD_E=0;
LCD_E=1;
LCD_E=0;
delay(4);
}
/***********************1602液晶初始化**************************/
void LCD_Init()
{
write_cmd(0x38);
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x06);
write_cmd(0x01);
}
/******************************清除显示*****************************/
void ClearScreen()
{
write_cmd(0x01);
delay(4);
}
/**************************1602液晶显示字节**************************/
void WriteByte(uchar x,uchar y,uchar dat)
{
if(x==1)
write_cmd(0x80+(y-1));
else if(x==2)
write_cmd(0x80+0x40+(y-1));
write_dat(dat);
}
/*************************1602液晶显示字串****************************/
void WriteString(uchar x,uchar y,uchar *str)
{
if(x==1)
write_cmd(0x80+(y-1));
else if(x==2)
write_cmd(0x80+0x40+(y-1));
while(*str)
{
write_dat(*str);
str++;
}
}
/*************************往DS1302写入1Byte数据******************************/
void DS1302_WByte(uchar dat)
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
DS1302_DIO=(0x01&temp);
DS1302_CLK=1;
DS1302_CLK=0;
temp>>=1;
}
}
/**************************从DS1302读取1Byte数据******************************/
uchar DS1302_RByte()
{
uchar i,temp=0;
for(i=0;i<8;i++)
{
temp>>=1;
if(DS1302_DIO==1)
temp=temp|(0x80);
DS1302_CLK=1;
DS1302_CLK=0;
}
return temp;
}
/***************************在addr处写数据****************************/
void DS1302_write(uchar addr,uchar dat)
{
DS1302_RST = 1;
DS1302_WByte(addr);
DS1302_WByte(dat);
DS1302_RST=0;
}
/*************************在addr处读取数据**************************/
uchar DS1302_read(uchar addr)
{
uchar temp;
DS1302_RST = 1;
DS1302_WByte(addr);
temp=DS1302_RByte();
DS1302_RST=0;
return temp;
}
/*****************************DS1302初始化*****************************/
void DS1302_Init()
{
DS1302_write(0x8e,0x00); //禁止1302写保护
DS1302_write(0x80,0x00); //启动1302晶振
DS1302_write(0x84,0x00); //24小时制
DS1302_write(0x8e,0x80); //启动1302写保护
}
/***************************设置DS1302日期和时间***************************
******************* 秒 分 时 日 月 星期 年 ***********************/
void DS1302_set(uchar *p)
{
uchar i,addr=0x80;
DS1302_write(0x8e,0x00);
for(i=0;i<7;i++)
{
DS1302_write(addr,*p);
addr=addr+2;
p++;
}
DS1302_write(0x8e,0x80);
}
/**************************读取DS1302日期**************************/
void GET_date(uchar *p)
{
*(p+0)=DS1302_read(0x8d)/16+48;
*(p+1)=DS1302_read(0x8d)%16+48;
*(p+3)=DS1302_read(0x89)%32/16+48;
*(p+4)=DS1302_read(0x89)%16+48;
*(p+6)=DS1302_read(0x87)%64/16+48;
*(p+7)=DS1302_read(0x87)%16+48;
}
/**************************读取DS1302时间*************************/
void GET_time(uchar *p)
{
*(p+0)=DS1302_read(0x85)%64/16+48;
*(p+1)=DS1302_read(0x85)%16+48;
*(p+3)=DS1302_read(0x83)%128/16+48;
*(p+4)=DS1302_read(0x83)%16+48;
*(p+6)=DS1302_read(0x81)%128/16+48;
*(p+7)=DS1302_read(0x81)%16+48;
}
void main()
{
LCD_Init(); //液晶初始化函数
DS1302_Init;
while(1)
{
;
}
} |