完整电路图:
完整代码:
#include <reg51.h>
#include <intrins.h> //包含_nop_( )空函数指令的头文件
#define uchar unsigned char
#define uint unsigned int
#define out P2
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
sbit RST=P1^7 ;
sbit SCLK =P1^6;
sbit DSIO=P1^5;
sbit set=P1^0; //设置时间按钮
sbit up=P1^1; // 增加时间
sbit down=P1^2; // 减小时间
void lcd1602_initial(void); //lcd1602初始化函数
void lcd1602_write_command(uchar com); //lcd1602写命令函数
void lcd1602_write_data(uchar dat); //lcd1602写数据函数
void lcd1602_string(uchar ad ,uchar *s);//lcd1602写字符串
void delay(uint); //延时函数
void Ds1302Write(uchar add,uchar dat);
uchar Ds1302Read(uchar add);
void Ds1302Readtime_data();
uchar bcd_decimal(uchar bcd);
void write_time(uchar add,uchar date);
void xinshi_time();
uchar key_bcd(uchar key_decimal);
void key_set();
void key_process();
void key_up_down();
uchar code table1[]={"2021-01-24"};
uchar code table2[]={"23:59:50"};
uchar nian,zhou,yue,ri,shi,fen,miao;
uchar count=0,done=0,flag=1,flag_up=0,flag_down=0;
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code read_add[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code write_add[7]= {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar code time_data[7]= {0x58, 0x40, 0x14, 0x29, 0x01, 0x01, 0x21};
uchar code xingqi1[]={"MON"};
uchar code xingqi2[]={"TUE"};
uchar code xingqi3[]={"WED"};
uchar code xingqi4[]={"THU"};
uchar code xingqi5[]={"FRI"};
uchar code xingqi6[]={"SAT"};
uchar code xingqi7[]={"SUN"};
/**************************************************************
*函数名 :delay
*函数功能 :延时函数
*函数参数 :需要延时的毫秒数:uint j
*函数返回值 :无
****************************************************************/
void delay(uint j){ //1ms延时子程序
uchar i=250;
for(;j>0;j--){
while(--i);
i=249;
while(--i);
i=250;
}
}
/**************************************************************
*函数名 :key_set
*函数功能 :按键设置
*函数参数 :无
*函数返回值 :无
****************************************************************/
void key_set(){
if(set==0){
delay(5);
while(!set);
count++; //计数,按了几次
lcd1602_write_command(0x0f);
if(flag==1){
done=1;
flag=0;
Ds1302Write(0x8e,0x00);
Ds1302Write(0x80,key_bcd(miao)|0x80);
Ds1302Write(0x8e,0x80);
}
}
}
/**************************************************************
*函数名 :key_up_down
*函数功能 :按键增加时间或者减少时间
*函数参数 :无
*函数返回值 :无
************************************************************