📄 main.c
字号:
/* 本程序所使用CPU为51单片机,时钟为24MHZ,程序主体网上所得,稍加修,念在下初学,还请原作者见谅。特此声明*/
#include <reg51.h>
#include <intrins.h>
#include "LCM1602.h"
#include "DS1302.h"
sbit Add_Key = P3 ^ 3;//加1键
sbit Dec_Key = P3 ^ 4;//减1键
sbit OK_Key = P3 ^ 5;//确定键
struct TimerStruct //定义时钟的数据结构
{
unsigned char Year;
unsigned char Month;
unsigned char Day;
unsigned char Week;
unsigned char Hour;
unsigned char Minute;
unsigned char Second;
};
unsigned char DateBuffer[] ={"2000/12/20"}; // 随便设置,不表示显示的初始值,只为方便子程序调用
unsigned char TimeBuffer[] = {"21:49:00"}; //初始值在主程序中设置
unsigned int SecondCounter;//秒计数器(无符号整型)
unsigned char Keyboard_Clock_Number;
unsigned char Temp;
struct TimerStruct RealClock;
void timer0(void) interrupt 1 //定时T0溢出中断,每25mS产生一次中断 方式1 9E58
{ unsigned char Temp;
// struct
TH0=0x9e;//(65536-46080)/256; //重新装入定时25mS的初值到TH0,TL0
TL0=0x58;//(65536-46080)%256;
SecondCounter++; //秒计数器加1
if(SecondCounter==40) //到40,表示1S时间到
{
SecondCounter=0;
/****--以下是读取DS1302的时钟信息,并将结果存储到显示缓冲区中****/
Temp=Read_DS1302_RTC(0x81); //读秒信息
RealClock.Second=Temp;
TimeBuffer[7]=(Temp%16)|0x30;
TimeBuffer[6]=(Temp>>4)|0x30;
Temp=Read_DS1302_RTC(0x83); //读分信息
RealClock.Minute=Temp;
TimeBuffer[4]=(Temp%16)|0x30;
TimeBuffer[3]=(Temp>>4)|0x30;
Temp=Read_DS1302_RTC(0x85); //读时信息
RealClock.Hour=Temp;
TimeBuffer[1]=(Temp%16)|0x30;
TimeBuffer[0]=(Temp>>4)|0x30;
Temp=Read_DS1302_RTC(0x87); //读日信息
RealClock.Day=Temp;
DateBuffer[9]=(Temp%16)|0x30;
DateBuffer[8]=(Temp>>4)|0x30;
Temp=Read_DS1302_RTC(0x89); //读月信息
RealClock.Month=Temp;
DateBuffer[6]=(Temp%16)|0x30;
DateBuffer[5]=(Temp>>4)|0x30;
Temp=Read_DS1302_RTC(0x8d); //读年信息
RealClock.Year=Temp;
DateBuffer[3]=(Temp%16)|0x30;
DateBuffer[2]=(Temp>>4)|0x30;
/*****************---送到LCD上显示出来***********************/
DisplayListChar(0,0,DateBuffer);//刷新LCD上的日期信息
DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
}
}
void main(void){
TMOD=0x01; //T0工作于16位定时功能
TH0=(65536-46080)/256; //T0定时25mS的初值装入TH0,TL0
TL0=(65536-46080)%256;
EA=1; //CPU开中断
ET0=1; //允许T0溢出中断
Delay400Ms();
LCMInit(); //初始化LCD
/************ Init_DS1302_RTC();//初始化DS1302*************/
Init_1302();
TR0=1; //启动T0开始工作
while(1)
{
OK_Key = 1;
Add_Key = 1;
Dec_Key = 1;
if (OK_Key == 0) // 设置和选择项目键
{
Delay5Ms();
Delay5Ms();
EA = 0;
if(OK_Key == 0)
{
Keyboard_Clock_Number++;if(Keyboard_Clock_Number>5)Keyboard_Clock_Number=0;
}
while(OK_Key == 0);
}
switch( Keyboard_Clock_Number )
{
case 0:
{
if(Add_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Add_Key==0)
{
Temp=Read_DS1302_RTC(0x81);
Temp|=0x80; //每次传输低字节
Temp++;
if(Temp>59) Temp = 0;
Temp|=0x80; //每次传输低字节
RealClock.Second=Temp;
TimeBuffer[7]=(Temp%16)|0x30;
TimeBuffer[6]=(Temp>>4)|0x30;
DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
}
}
if(Dec_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Dec_Key==0)
{
Temp=Read_DS1302_RTC(0x81);
Temp--;
if(Temp==0) Temp = 59;
Temp|=0x80; //每次传输低字节
RealClock.Second=Temp;
TimeBuffer[7]=(Temp%16)|0x30;
TimeBuffer[6]=(Temp>>4)|0x30;
DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
}
}
break;//正常显示秒
}
case 1:
{
if(Add_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Add_Key==0)
{
Temp=Read_DS1302_RTC(0x83);
Temp++;
if(Temp>59) Temp = 0;
Temp|=0x80; //每次传输低字节
RealClock.Minute=Temp;
TimeBuffer[3]=(Temp%16)|0x30;
TimeBuffer[4]=(Temp>>4)|0x30;
DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
}
}
if(Dec_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Dec_Key==0)
{
Temp=Read_DS1302_RTC(0x83);
Temp--;
if(Temp==0) Temp = 59;
Temp|=0x80; //每次传输低字节
RealClock.Minute=Temp;
TimeBuffer[3]=(Temp%16)|0x30;
TimeBuffer[4]=(Temp>>4)|0x30;
DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
}
}
break;//正常显示分钟
}
case 2:
{
if(Add_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Add_Key==0)
{
Temp=Read_DS1302_RTC(0x85);
Temp++;
if(Temp>24) Temp = 0;
RealClock.Hour=Temp;
TimeBuffer[1]=(Temp%16)|0x30;
TimeBuffer[0]=(Temp>>4)|0x30;
DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
}
}
if(Dec_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Dec_Key==0)
{
Temp=Read_DS1302_RTC(0x85);
Temp--;
if(Temp==0) Temp = 23;
RealClock.Hour=Temp;
TimeBuffer[1]=(Temp%16)|0x30;
TimeBuffer[0]=(Temp>>4)|0x30;
DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
}
}
break;//正常显示小时
}
case 3:
{
if(Add_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Add_Key==0)
{
Temp=Read_DS1302_RTC(0x87);
Temp++;
if(Temp>31) Temp = 0;
RealClock.Day=Temp;
TimeBuffer[9]=(Temp%16)|0x30;
TimeBuffer[8]=(Temp>>4)|0x30;
DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
}
}
if(Dec_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Dec_Key==0)
{
Temp=Read_DS1302_RTC(0x87);
Temp--;
if(Temp==0) Temp = 30;
RealClock.Day=Temp;
TimeBuffer[9]=(Temp%16)|0x30;
TimeBuffer[8]=(Temp>>4)|0x30;
DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
}
}
break;//正常显示小时
}
case 4:
{
if(Add_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Add_Key==0)
{
Temp=Read_DS1302_RTC(0x89);
Temp++;
if(Temp>12) Temp = 0;
RealClock.Month=Temp;
TimeBuffer[6]=(Temp%16)|0x30;
TimeBuffer[5]=(Temp>>4)|0x30;
DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
}
}
if(Dec_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Dec_Key==0)
{
Temp=Read_DS1302_RTC(0x89);
Temp--;
if(Temp==0) Temp = 12;
RealClock.Month=Temp;
TimeBuffer[6]=(Temp%16)|0x30;
TimeBuffer[5]=(Temp>>4)|0x30;
DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
}
}
break;//正常显示小时
}
case 5:
{
if(Add_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Add_Key==0)
{
Temp=Read_DS1302_RTC(0x8d);
Temp++;
RealClock.Day=Temp;
TimeBuffer[3]=(Temp%16)|0x30;
TimeBuffer[2]=(Temp>>4)|0x30;
DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
}
}
if(Dec_Key==0)
{
Delay5Ms();
Delay5Ms();
if(Dec_Key==0)
{
Temp=Read_DS1302_RTC(0x8d);
Temp--;
RealClock.Year=Temp;
TimeBuffer[3]=(Temp%16)|0x30;
TimeBuffer[2]=(Temp>>4)|0x30;
DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
}
}
break;//正常显示小时
}
default:break;
}
EA = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -