📄
字号:
#include <stdio.h>
#include <reg51.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define BUSY 0x80 //lcd忙检测标志
#define LCD_DATA P0 //定义P0口为LCD通讯端口
sbit RS=P2^5; //数据/命令端
sbit RW=P2^6; //读/写选择端
sbit E=P2^7;
sbit speaker=P2^3;
char second=0,minite=0,hour=9; //定义并初始化时钟变量
uint day=20,month=6,year=2008; //定义并初始化日期变量
uint k,k1,k2,s1,s2,s3,s4,j,m,n;
int set=0,set1,weekjudge;
uchar mstcnt0=0,mstcnt1=0, status=0,ss=0,view=0;disturb=0,clockview;
char idata clockjudge[32]={0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
};
char idata hourjudge[32]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
char idata minitejudge[32]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void delay(uint k);
void init_timer0(void);
void init_timer1(void); //LCD延时子程序
void LCDInit(void); //LCD初始化子程序
void ReadStatus(void); //LCD检测忙子程序
void WriteCommand(uchar WC); //写指令到ICM子函数
void WriteData(uchar WD); //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar *DData); //显示指定坐标的一串字符子函数
void init_timer0(void);
void displaytime(void);
void displayclock(void);
void changehour(void);
void changeminite(void);
void changeyear(void);
void changemonth(void);
void changeday(void);
void displaytimejudge(void);
void displayclockjudge(void);
void keyscan(void );
void menu_key(void);
void tab_key(void);
void inc_key(void);
void dec_key(void);
void inc_time(void);
void dec_time(void);
void changesecond(void);
void inc_clock(void);
void dec_clock(void);
void inc_stopwatch(void);
void dec_stopwatch(void);
int dayjudge(int year,int month);
int date(int year,int month);
int yearchange(int year);
/*********延时K*1ms,12.000mhz**********/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++);
}
}
/**********写指令到LCD子函数************/
void WriteCommand(uchar WC)
{
ReadStatus();
LCD_DATA=WC;
RS=0; // 选中指令寄存器
RW=0; // 写模式
E=1;
E=0;
}
/**********写数据到LCD子函数************/
void WriteData(uchar WD)
{
ReadStatus(); //检测忙信号
LCD_DATA=WD;
RS=1; // 选中数据寄存器
RW=0; // 写模式
E=1;
E=0;
}
/***********LCD内部等待函数*************/
void ReadStatus(void)
{
LCD_DATA=0xff;
E=1;
RS=0;
RW=1;
while(LCD_DATA&BUSY)
{ E=0;
E=1;
}
E=0;
}
/**********LCD初始化子函数***********/
void LCDInit(void) //LCM初始化
{
LCD_DATA=0;
WriteCommand(0x38); //8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommand(0x08); //关闭显示,检测忙信号
WriteCommand(0x01); //清屏,检测忙信号
WriteCommand(0x0c); //显示屏打开,光标不显示,不闪烁,检测忙信号
}
/****************显示指定坐标的一个字符子函数*************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40
X|=0x80; //指令码为地址码+0X80
WriteCommand(X);
WriteData(DData);
}
/***********显示指定坐标的一串字符子函数***********/
void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while((X<16)&&DData[ListLength]!=0x00)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
/***************液晶显示时间子函数1*****************/
void displaytimejudge(void)
{
DisplayOneChar(0,1,hour/10+0x30); //液晶上显示小时
DisplayOneChar(1,1,hour%10+0x30);
DisplayOneChar(3,1,minite/10+0x30); //液晶上显示分
DisplayOneChar(4,1,minite%10+0x30);
DisplayOneChar(6,1,second/10+0x30); //液晶上显示秒
DisplayOneChar(7,1,second%10+0x30);
yearchange(year);
DisplayOneChar(5,0,month/10+0x30); //液晶上显示月
DisplayOneChar(6,0,month%10+0x30);
DisplayOneChar(8,0,day/10+0x30); //液晶上显示日
DisplayOneChar(9,0,day%10+0x30);
DisplayOneChar(0,0,s1+0x30); //液晶上显示年
DisplayOneChar(1,0,s2+0x30);
DisplayOneChar(2,0,s3+0x30);
DisplayOneChar(3,0,s4+0x30);
}
/************液晶显示时间子函数3***************/
void changeminite(void)
{
DisplayOneChar(0,1,hour/10+0x30);
DisplayOneChar(1,1,hour%10+0x30);
DisplayOneChar(3,1,minite/10+0x30); //液晶上显示分
DisplayOneChar(4,1,minite%10+0x30);
delay(250);
DisplayOneChar(3,1,0x20);
DisplayOneChar(4,1,0x20);
delay(250);
}
/**************液晶显示时间子函数2*****************/
void changehour(void)
{
DisplayOneChar(0,1,hour/10+0x30); //液晶上显示小时
DisplayOneChar(1,1,hour%10+0x30);
delay(250);
DisplayOneChar(0,1,0x20);
DisplayOneChar(1,1,0x20);
delay(250);
}
/**************液晶显示日期子函数1*****************/
void changesecond(void)
{
DisplayOneChar(3,1,minite/10+0x30); //液晶上显示分
DisplayOneChar(4,1,minite%10+0x30);
DisplayOneChar(6,1,second/10+0x30); //液晶上显示秒
DisplayOneChar(7,1,second%10+0x30);
delay(250);
DisplayOneChar(6,1,0x20);
DisplayOneChar(7,1,0x20);
delay(250);
}
/**************液晶显示日期子函数2*****************/
void changeday(void)
{
DisplayOneChar(5,0,month/10+0x30); //液晶上显示月
DisplayOneChar(6,0,month%10+0x30);
DisplayOneChar(8,0,day/10+0x30); //液晶上显示日
DisplayOneChar(9,0,day%10+0x30);
delay(250);
DisplayOneChar(9,0,0x20);
DisplayOneChar(8,0,0x20);
delay(250);
}
/**************液晶显示日期子函数3*****************/
void changemonth(void)
{
yearchange(year);
DisplayOneChar(0,0,s1+0x30); //液晶上显示年
DisplayOneChar(1,0,s2+0x30);
DisplayOneChar(2,0,s3+0x30);
DisplayOneChar(3,0,s4+0x30);
DisplayOneChar(5,0,month/10+0x30); //液晶上显示月
DisplayOneChar(6,0,month%10+0x30);
delay(250);
DisplayOneChar(5,0,0x20);
DisplayOneChar(6,0,0x20);
delay(250);
}
/**************液晶显示日期子函数4*****************/
void changeyear(void)
{
DisplayOneChar(6,1,second/10+0x30); //液晶上显示秒
DisplayOneChar(7,1,second%10+0x30);
yearchange(year);
DisplayOneChar(0,0,s1+0x30); //液晶上显示年
DisplayOneChar(1,0,s2+0x30);
DisplayOneChar(2,0,s3+0x30);
DisplayOneChar(3,0,s4+0x30);
delay(250);
DisplayOneChar(1,0,0x20);
DisplayOneChar(2,0,0x20);
DisplayOneChar(3,0,0x20);
DisplayOneChar(0,0,0x20);
delay(250);
}
void displayclockjudge(void)
{
DisplayOneChar(9,1,hourjudge[set]/10+0x30);
DisplayOneChar(10,1,hourjudge[set]%10+0x30);
DisplayOneChar(12,1,minitejudge[set]/10+0x30);
DisplayOneChar(13,1,minitejudge[set]%10+0x30);
delay(250);
if(set1==1)
{
DisplayOneChar(9,1,0x20);
DisplayOneChar(10,1,0x20);
}
if(set1==2)
{
DisplayOneChar(12,1,0x20);
DisplayOneChar(13,1,0x20);
}
delay(250);
}
/**************键盘扫描子函数******************/
void keyscan(void)
{
uchar xx; //局部变量
P1=0xff;
if(P1!=0xff)
{
delay(30);
if(P1!=0xff)
{
xx=P1;
switch(xx) // 根据按键状态,调用不同的子函数
{
case 0xfe: menu_key();
break;
case 0xfd: tab_key();
break;
case 0xfb:inc_key();
break;
case 0xf7:dec_key();
default:
break;
}
}
}
delay(400);
switch(status)
{
case 0:TR0=1;displaytime();break;
case 1:TR0=1;displayclock();break;
default:
break;
}
}
/*******************显示主界面*******************/
void menu_key(void)
{
disturb=0;
status++;
set=0;
set1=0;
view=0;
if(status>1)
{
status=0;
}
}
/**************设定工作模式子函数****************/
void tab_key(void)
{
disturb=0;
if(status==0)
{
set++;
}
if(status==1)
{set1++;
if(set1>2)
set1=0;
}
}
/****************按键加法子函数******************/
void inc_key(void)
{
disturb=0;
switch(status)
{
case 0:inc_time();
break;
case 1:inc_clock();
break;
default:
break;
}
}
/****************时间加法子函数*****************/
void inc_time(void)
{
if(set==1)
{
hour++;
if(hour==24)
hour=0;
}
if(set==2)
{
minite++;
if(minite==60)
minite=0;
}
if(set==3)
{
second++;
if(second==60)
second=0;
}
if(set==4)
{
year++;
}
if(set==5)
{
month++;
if(month>12)
month=1;
}
if(set==6)
{
day++;
k1=dayjudge(year,month);
if(day>k1)
day=1;
}
}
/****************闹钟加法子函数*****************/
void inc_clock(void)
{
if(set1==1)
{
hourjudge[set]++;
if(hourjudge[set]>23)
hourjudge[set]=0;
}
if(set1==2)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -