📄 main.c
字号:
/*---------------------------------------------------------------*
************************ design by ghtyoo ************************
*----------------------------------------------------------------*/
#include <reg51.h>
#include <init.h>
void Time_C(void);
void Clock_C(void);
void ring_c(void) ;
void Delay(unsigned char i);
extern void ring(void);
extern void LCD_Write(unsigned char cmd);
extern void LCD_Write_Com(unsigned char com);
extern void LCD_Write_Dat(unsigned char dat);
extern void LCD_Write_Dat_Nmov(unsigned char dat);
extern void LCDInit(void);
extern void TimeInit(void);
extern void LCD_Show1(void);
extern unsigned char Key_Scan(void);
extern unsigned char LCD_Read_Dat(unsigned char com);
extern void Watch(void);
extern void Right(void);
extern void Left(void);
unsigned char store_c,store_i,count,time[3],date[3],store[6];
unsigned char wc,wd2,wd1,wd0;
void main()
{
unsigned char i,m,n,j,temp;
store_c=0; //闹钟设置完成标志初始化
store_i=0; //闹钟设置进行中标志初始化
SPEAK=1;
i=0xff;//定义一个没用过的数
LCDInit();
LCD_Show1();
EA=0;
TimeInit();
while(1)
{
temp=i;
i=Key_Scan();
if(i==temp)
continue; //消除按键抖动
switch(i)
{
case '1':LCD_Write_Dat_Nmov('1');break;
case '2':LCD_Write_Dat_Nmov('2');break;
case '3':LCD_Write_Dat_Nmov('3');break;
case '4':LCD_Write_Dat_Nmov('4');break;
case '5':LCD_Write_Dat_Nmov('5');break;
case '6':LCD_Write_Dat_Nmov('6');break;
case '7':LCD_Write_Dat_Nmov('7');break;
case '8':LCD_Write_Dat_Nmov('8');break;
case '9':LCD_Write_Dat_Nmov('9');break;
case '0':LCD_Write_Dat_Nmov('0');break;
// case 'T':LCD_Write_Dat('T');break; //上电开始就有调时间,不需要这个键来特定调时间
// case 'C':LCD_Write_Dat('C');break; //时间都没调好,还来什么闹钟,
// case 'W':LCD_Write_Dat('W');break;
// case 'L':LCD_Write_Dat('L');break;
// case 'R':LCD_Write_Dat('R');break;
// case 'B':LCD_Write_Dat('B');break;
// case 'W':Watch();break;
case 'L':Left() ;break;
case 'R':Right();break;
default:break;
}
if (i=='B')
{
date[0]=(LCD_Read_Dat(0x85)-'0')*10+(LCD_Read_Dat(0x86)-'0');
date[1]=(LCD_Read_Dat(0x88)-'0')*10+(LCD_Read_Dat(0x89)-'0');
date[2]=(LCD_Read_Dat(0x8b)-'0')*10+(LCD_Read_Dat(0x8c)-'0');
time[0]=(LCD_Read_Dat(0xc4)-'0')*10+(LCD_Read_Dat(0xc5)-'0');
time[1]=(LCD_Read_Dat(0xc7)-'0')*10+(LCD_Read_Dat(0xc8)-'0');
time[2]=(LCD_Read_Dat(0xca)-'0')*10+(LCD_Read_Dat(0xcb)-'0');
LCD_Write_Com(0x0c);//开显示,关光标,不闪烁
break;
}
}
TR0=1; //定时器0开始计数
ET0=1; //打开定时器0中断
EA=1; //开总中断
m=time[2];
while(1)
{
n=time[2];
if((m!=n)&&(store_i==0)) //一秒更一次,当闹钟没正在设置时
{
LCD_Write_Com(0x83);
LCD_Write_Dat('2');
LCD_Write_Com(0x84);
LCD_Write_Dat('0');
LCD_Write_Com(0x87);
LCD_Write_Dat('-');
LCD_Write_Com(0x8a);
LCD_Write_Dat('-');
LCD_Write_Com(0xc6);
LCD_Write_Dat(':');
LCD_Write_Com(0xc9);
LCD_Write_Dat(':');
LCD_Write_Com(0x85); //日 期
LCD_Write_Dat(date[0]/10+'0'); //年数少于100年
LCD_Write_Com(0x86);
LCD_Write_Dat(date[0]%10+'0');
LCD_Write_Com(0x88);
LCD_Write_Dat(date[1]/10+'0');
LCD_Write_Com(0x89);
LCD_Write_Dat(date[1]%10+'0');
LCD_Write_Com(0x8b);
LCD_Write_Dat(date[2]/10+'0');
LCD_Write_Com(0x8c);
LCD_Write_Dat(date[2]%10+'0');
LCD_Write_Com(0xc4); //时间
LCD_Write_Dat(time[0]/10+'0');
LCD_Write_Com(0xc5);
LCD_Write_Dat(time[0]%10+'0');
LCD_Write_Com(0xc7);
LCD_Write_Dat(time[1]/10+'0');
LCD_Write_Com(0xc8);
LCD_Write_Dat(time[1]%10+'0');
LCD_Write_Com(0xca);
LCD_Write_Dat(time[2]/10+'0');
LCD_Write_Com(0xcb);
LCD_Write_Dat(time[2]%10+'0');
m=n;
}
if(store_c==1) //闹钟
if((store[0]==date[0])&&(store[1]==date[1])&&(store[2]==date[2])
&&(store[3]==time[0])&&(store[4]==time[1])&&(store[5]==time[2]))
{
ring_c();
}
j=Key_Scan();
if(j=='T')
{
Time_C();
}
if(j=='C')
{
Clock_C();
}
if(j=='W')
Watch();
}
}
/*********************时钟设置******************************/
void Time_C(void)
{
unsigned char i,temp;
i=0xff;//定义一个没用过的数
TR0=0;
ET0=0;
LCD_Write_Com(0x80);
LCD_Write_Dat('T');
LCD_Write_Com(0x83);
LCD_Write_Com(0x0f);//开显示,开光标,闪烁
while(1)
{
temp=i;
i=Key_Scan();
if(i==temp)
continue;
switch(i)
{
case '1':LCD_Write_Dat_Nmov('1');break;
case '2':LCD_Write_Dat_Nmov('2');break;
case '3':LCD_Write_Dat_Nmov('3');break;
case '4':LCD_Write_Dat_Nmov('4');break;
case '5':LCD_Write_Dat_Nmov('5');break;
case '6':LCD_Write_Dat_Nmov('6');break;
case '7':LCD_Write_Dat_Nmov('7');break;
case '8':LCD_Write_Dat_Nmov('8');break;
case '9':LCD_Write_Dat_Nmov('9');break;
case '0':LCD_Write_Dat_Nmov('0');break;
case 'L':Left();break;
case 'R':Right();break;
default:break;
}
if (i=='B')
{
date[0]=(LCD_Read_Dat(0x85)-'0')*10+(LCD_Read_Dat(0x86)-'0');
date[1]=(LCD_Read_Dat(0x88)-'0')*10+(LCD_Read_Dat(0x89)-'0');
date[2]=(LCD_Read_Dat(0x8b)-'0')*10+(LCD_Read_Dat(0x8c)-'0');
time[0]=(LCD_Read_Dat(0xc4)-'0')*10+(LCD_Read_Dat(0xc5)-'0');
time[1]=(LCD_Read_Dat(0xc7)-'0')*10+(LCD_Read_Dat(0xc8)-'0');
time[2]=(LCD_Read_Dat(0xca)-'0')*10+(LCD_Read_Dat(0xcb)-'0');
LCD_Write_Com(0x0c);//开显示,关光标,不闪烁
LCD_Write_Com(0x80);
LCD_Write_Dat(' '); //取消T——调整时间标志
TH0=0x4c;
TL0=0x00;
TR0=1; //定时器0开始计数
ET0=1; //打开定时器0中断
EA=1;
break;
}
}
}
/********************闹钟设置****************************/
void Clock_C(void)
{
unsigned char i,temp;
store_i=1;
i=0xff;//定义一个没用过的数
// TR1=0;
// ET1=0;
LCD_Write_Com(0x80);
LCD_Write_Dat('C');
LCD_Write_Com(0x83);
LCD_Write_Com(0x0f);//开显示,开光标,闪烁
while(1)
{
temp=i;
i=Key_Scan();
if(i==temp)
continue;
switch(i)
{
case '1':LCD_Write_Dat_Nmov('1');break;
case '2':LCD_Write_Dat_Nmov('2');break;
case '3':LCD_Write_Dat_Nmov('3');break;
case '4':LCD_Write_Dat_Nmov('4');break;
case '5':LCD_Write_Dat_Nmov('5');break;
case '6':LCD_Write_Dat_Nmov('6');break;
case '7':LCD_Write_Dat_Nmov('7');break;
case '8':LCD_Write_Dat_Nmov('8');break;
case '9':LCD_Write_Dat_Nmov('9');break;
case '0':LCD_Write_Dat_Nmov('0');break;
case 'L':Left();break;
case 'R':Right();break;
default:break;
}
if (i=='B')
{
store[0]=(LCD_Read_Dat(0x85)-'0')*10+(LCD_Read_Dat(0x86)-'0');
store[1]=(LCD_Read_Dat(0x88)-'0')*10+(LCD_Read_Dat(0x89)-'0');
store[2]=(LCD_Read_Dat(0x8b)-'0')*10+(LCD_Read_Dat(0x8c)-'0');
store[3]=(LCD_Read_Dat(0xc4)-'0')*10+(LCD_Read_Dat(0xc5)-'0');
store[4]=(LCD_Read_Dat(0xc7)-'0')*10+(LCD_Read_Dat(0xc8)-'0');
store[5]=(LCD_Read_Dat(0xca)-'0')*10+(LCD_Read_Dat(0xcb)-'0');
store_c=1; //闹钟标志
store_i=0;
LCD_Write_Com(0x80); //清除闹钟显示信息
LCD_Write_Dat(' ');
LCD_Write_Com(0x0c);//开显示,关光标,不闪烁
break;
}
}
}
/****************蜂鸣器*****************************/
void ring(void)
{
SPEAK=0;
Delay(30);
SPEAK=1;
}
void ring_c(void)
{
unsigned char i;
i=0xff;
while(1)
{
SPEAK=0;
Delay(80);
SPEAK=1;
Delay(80);
SPEAK=0;
Delay(80);
SPEAK=1;
Delay(80);
SPEAK=0;
Delay(80);
SPEAK=1;
Delay(80);
SPEAK=0;
Delay(80);
SPEAK=1;
Delay(250);
Delay(250);
Delay(250);
i=Key_Scan();
if(i=='B')
{
store_c=0;
break;
}
}
}
/*************延时i毫秒函数********************/
void Delay(unsigned char i)
{
unsigned char j;
while(--i !=0)
{
for(j=0;j<125;j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -