📄 1302.c
字号:
#include <reg52.H>
#define uint unsigned int
#define uchar unsigned char
sbit ledlk=P1^0;
sbit smglk=P1^1;
sbit smgbitlk=P1^2;
sbit rs=P3^4;
sbit lcdcs=P1^5;
sbit scl=P0^0;
sbit sda=P0^2;
sbit rst=P0^1;
//uchar code table[]={"www.mcuby.com"};
//uchar code table2[]={"welcome"};
/**/
void delay(uint ms)
{
uint i,j;
for (j=0;j<ms;j++)
for (i=0;i<120;i++);
}
/*void delayus(uint us)
{
uint i,j;
for (j=0;j<us;j++)
for (i=0;i<12;i++);
}*/
//1602显示开始
void write_command(uchar command)
{
rs=0;
P2=command;
lcdcs=1;
lcdcs=0;
}
void write_data(uchar data0)
{
rs=1;
P2=data0;
lcdcs=1;
lcdcs=0;
}
void init_1602()
{
ledlk=0;
smglk=0;
smgbitlk=0;
delay(15);
write_command(0x38);
delay(5);
write_command(0x0e);
delay(5);
write_command(0x06);
delay(5);
}
//1602显示结束
uchar DS1302_OutputByte(void) //实时时钟读取一字节(内部函数)
{
uchar value,i;
value=0x00;
for (i=8;i>0;i--)
{
value= value>>1 ;
if (sda==1)
{
value= value|0x80;
}
scl=1;
scl=0;
}
return value;
}
void DS1302_InputByte(uchar value)//实时时钟写入一字节(内部函数)
{
uchar i;
for (i=8;i>0;i--)
{
sda=value&0x01;
scl=1;
scl=0;
value=value>>1;
}
}
uchar Read_DS1302(uchar Addr)//读取DS1302某地址的数据
{
unsigned char ucData;
rst = 0;
scl = 0;
rst = 1;
DS1302_InputByte(Addr|0x01); // 地址,命令
ucData = DS1302_OutputByte();// 读1Byte数据
scl = 1;
rst = 0;
return(ucData);
}
void Write_DS1302(uchar Addr,uchar ucDa) //Addr: DS1302地址, ucData: 要写的数据
{
rst = 0;
scl = 0;
rst = 1;
DS1302_InputByte(Addr); // 地址,命令
DS1302_InputByte(ucDa); // 写1Byte数据
scl = 1;
rst = 0;
}
void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write_DS1302(0x8E,0x10);
else
Write_DS1302(0x8E,0x00);
}
uchar tran_input(uchar value)//输入数据入转换函数
{
return (value/10)<<4 | (value%10);
}
uchar Tran_Output(uchar value)//bcd转换成ascii
{
return (((value&0x70)>>4)*10 +(value&0x0F));
}
void DS1302_SetTime(uchar Address, uchar value) // 设置时间函数
{
DS1302_SetProtect(0);
Write_DS1302(Address, tran_input(value));
}
void Init_DS1302(void)//初始化芯片
{
uchar Second=Read_DS1302(0x80);
if(Second&0x80)
DS1302_SetTime(0x80,0);
}
void show_date()
{
uchar i,value,key;
uchar date[]="DATE:2009-03-12";
uchar time[]="TIME:20:59:50";
init_1602();//初始化lcd
write_command(0x80);//液晶显示位置
Init_DS1302();//初始化芯片
// DS1302_SetTime(0x86,12);//设置日期
value=(Read_DS1302(0x87));//日
key=Tran_Output(value) ;
date[13]=( key/10 + '0');
date[14]=( key%10 + '0');
// DS1302_SetTime(0x88,3);
value=(Read_DS1302(0x89));//月
key=Tran_Output(value);
date[10]=( key/10 + '0');
date[11]=( key%10 + '0');
// DS1302_SetTime(0x8c,9);
value=(Read_DS1302(0x8d));//年
key=Tran_Output(value);
date[7]=( key/10 + '0');
date[8]=( key%10 + '0');
for (i=0;i<sizeof(date)-1;i++)
{
write_data(date[i]);
delay(5);
}
write_command(0x80+0x40); //液晶显示位置
//DS1302_SetTime(0x80,0);
value=(Read_DS1302(0x81));//秒
key=Tran_Output(value);
time[11]=( key/10 + '0');
time[12]=( key%10 + '0');
//DS1302_SetTime(0x82,50);
value=(Read_DS1302(0x83));//分
key=Tran_Output(value);
time[8]=( key/10 + '0');
time[9]=( key%10 + '0');
// DS1302_SetTime(0x84,16);
value=(Read_DS1302(0x85));//时
key=Tran_Output(value);
time[5]=( key/10 + '0');
time[6]=( key%10 + '0');
for (i=0;i<sizeof(time)-1;i++)
{
write_data(time[i]);
delay(5);
}
}
void main()
{
while(1)
{
show_date();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -