📄
字号:
#include <stdio.h>
#include <reg51.h>
#include <math.h>
//#include "eeprom.h"
#define uchar unsigned char
#define uint unsigned int
#define BUSY 0x80 //lcd忙检测标志
#define LCD_DATA P0 //定义P0口为LCD通讯端口
sbit RS=P1^0; //数据/命令端
sbit RW=P1^1; //读/写选择端
sbit E=P1^2;
sbit speaker=P1^3;
char second=0,minite=0,hour=0; //定义并初始化时钟变量
uint day=3,month=1,year=2000; //定义并初始化日期变量
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;
//uchar *week[]={"SUN","MON","TUE","WEN","THU","FRI","SAT"};
//uchar idata time[]={0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00};
/*uchar code datechina[3][8]= {{0x08,0x0f,0x12,0x0f,0x10a,0x1f,0x02,0x02},
{0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00},
{0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00}}; */
//char code gd[200];
//char idata dateclock[7]={0x40,0x02,0x04,0x08,0x10,0x20,0x01};
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 stopwatchjudge[1][3];
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 LCDchina(void);
void displaytime(void);
//void displaydate(void);
void displayclock(void);
//void displaystopwatch(void);
void changehour(void);
void changeminite(void);
void changeyear(void);
void changemonth(void);
void changeday(void);
void displaytimejudge(void);
void displayclockjudge(void);
//void displaystopwatchjudge(void);
//void displaydateclock(void);
//void displayhourjudge(void);
//void displayminitejudge(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 inc_stopwatch(void);
//void dec_stopwatch(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);
//void dishz(uint chn);
//uchar inva(uchar m);
/*********延时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(0x06); //显示光标右移设置,检测忙信号
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++;
}
}
/*
void LCDchina(void)
{
unsigned char i=0;
for(i=0;i<8;i++)
{ //也是CGRAM的地址AC不能到0,进行了这样的处理
WriteCommand(0x40+i);
WriteData(datechina[j][i]);
}
}
*/
/***************液晶显示时间子函数1*****************/
void displaytimejudge(void)
{
DisplayOneChar(0,1,hour/10+0x30); //液晶上显示小时
DisplayOneChar(1,1,hour%10+0x30);
// DisplayOneChar(7,1,0x3A);
DisplayOneChar(3,1,minite/10+0x30); //液晶上显示分
DisplayOneChar(4,1,minite%10+0x30);
// DisplayOneChar(10,1,0x3A);
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(12,0,0x2D);
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);
// DisplayOneChar(9,0,0x2D);
}
/************液晶显示时间子函数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);
//DisplayListChar(8,0,"SMTWTFS");
delay(250);
/* for(m=0;m<7;m++)
{
if((clockjudge[set]&dateclock[m])!=0)
{DisplayOneChar(8+m,0,0x20);}
}*/
if(set1==1)
{
DisplayOneChar(9,1,0x20);
DisplayOneChar(10,1,0x20);
}
if(set1==2)
{
DisplayOneChar(12,1,0x20);
DisplayOneChar(13,1,0x20);
}
/* if(set1==3)
{
WriteCommand(0x0f);
WriteCommand(0x88+set2);
} */
delay(250);
//WriteCommand(0x0c);
}
/*
void displaystopwatchjudge(void)
{
DisplayOneChar(5,1,stopwatchjudge[0][0]/10+0x30);
DisplayOneChar(6,1,stopwatchjudge[0][0]%10+0x30);
DisplayOneChar(8,1,stopwatchjudge[0][1]/10+0x30);
DisplayOneChar(9,1,stopwatchjudge[0][1]%10+0x30);
DisplayOneChar(11,1,stopwatchjudge[0][2]/10+0x30);
DisplayOneChar(12,1,stopwatchjudge[0][2]%10+0x30);
delay(250);
if(set==1)
{
DisplayOneChar(5,1,0x20);
DisplayOneChar(6,1,0x20);
}
if(set==2)
{
DisplayOneChar(8,1,0x20);
DisplayOneChar(9,1,0x20);
}
if(set==3)
{
DisplayOneChar(11,1,0x20);
DisplayOneChar(12,1,0x20);
}
delay(250);
}
/*
void displaydateclock(void)
{
displayclockjudge();
DisplayListChar(8,0,"SMTWTFS");
delay(250);
for(m=0;m<7;m++)
{
if(clockjudge[n]&dateclock[week1]!=0)
DisplayOneChar(m+8,0,0x20);
delay(250);
}
}
void displayhourjudge(void)
{
displayclockjudge();
delay(250);
DisplayOneChar(9,1,0x20);
DisplayOneChar(10,1,0x20);
delay(250);
}
void displayminitejudge(void)
{
displayclockjudge();
delay(250);
DisplayOneChar(12,1,0x20);
DisplayOneChar(13,1,0x20);
delay(250);
} */
/**************键盘扫描子函数******************/
void keyscan(void)
{
uchar xx; //局部变量
P2=0xff;
if(P2!=0xff)
{
delay(30);
if(P2!=0xff)
{
xx=P2;
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;displaydate();break;
case 1:TR0=1;displayclock();break;
default:
break;
}
}
/*******************显示主界面*******************/
void menu_key(void)
{
//delay(500);
disturb=0;
//if((set1!=0)&&(status==1))
//{
status++;
set=0;
set1=0;
view=0;
//}
/*
if(status==2)
{
if(set1==3)
{
if((clockjudge[set]&dateclock[set2])==0)
{
next=1;
clockjudge[set]=(clockjudge[set]|dateclock[set2]);
}
if(((clockjudge[set]&dateclock[set2])!=0)&&(next==0))
{
clockjudge[set]=(clockjudge[set]&(~dateclock[set2]));
}
next=0;
}
} */
if(status>1)
{
status=0;
}
}
/**************设定工作模式子函数****************/
void tab_key(void)
{
// set2=0;
disturb=0;
if(status==0)
{
set++;
}
if(status==1)
{set1++;
if(set1>2)
set1=0;
}
}
/****************按键加法子函数******************/
void inc_key(void)
{
/* set2++;
if(set2>6)
{set2=0;}*/
disturb=0;
switch(status)
{
case 0:inc_time();
break;
// case 1:
// break;
case 1:inc_clock();
break;
default:
break;
}
}
/****************时间加法子函数*****************/
void inc_time(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -