能不能帮我看一下,先谢谢
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD1602_DB P0 //定义1602的DB口为P0口
uchar code table[]="CurrentTime"; //当前时间
uchar code table1[]="00:00:00";
uchar key1Flag = 0;//定义按键关闭符
uchar key2Flag = 0;
uchar key3Flag = 0;
uchar key4Flag = 0;
uchar count = 0;
uchar sec = 57;//秒
uchar min = 59;//分
uchar hour = 9;//小时
uchar clockHour = 0;//闹钟小时
uchar clockMin = 0;//分
uchar clockFlag = 0;// 定义闹钟关闭符
uchar beepNum = 0;//声音
uchar temp=0;
uchar shijian=0;
sbit LCD1602_RS = P2^0; //指令1/数据0选择端
sbit LCD1602_RW = P2^1; //读1写0选择端
sbit LCD1602_E = P2^2; //读1写0使能端
sbit Key1 = P1^0;//定义键位符
sbit Key2 = P1^1;
sbit Key3 = P1^2;
sbit Key4 = P1^3;
sbit Speaker = P2^5;//定义蜂鸣器
sbit LED=P2^4;
void Delay1ms() //@12.000MHz
{
uchar i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void Delay20ms() //@12.000MHz
{
uchar i, j, k;
_nop_();
_nop_();
i = 1;
j = 234;
k = 113;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void delay()
{
unsigned int a;
while(a--);
}
void Beep() //蜂鸣器警报
{
Speaker = 0;
Delay20ms();
Speaker = 1;
}
void LcdWaitReady() //检查LCD忙函数
{
uchar sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta & 0x80);
}
void LcdWriteCmd(uchar cmd) //写命令函数
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LcdWriteDat(uchar dat) //写数据函数
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LcdSetCursor(uchar x, uchar y)//时间设置
{
uchar addr;
if(y == 0)
addr = 0x00 + x;
else
addr = 0x40 + x;
LcdWriteCmd(addr | 0x80);
}
void LcdShowStr(uchar x, uchar y, uchar *str)
{
LcdSetCursor(x, y);
while(*str != '\0')
{
LcdWriteDat(*str++);
}
}
void InitLcd1602()//初始化LCD函数
{
LcdWriteCmd(0x01);
LcdWriteCmd(0x38);
LcdWriteCmd(0x0c);
LcdWriteCmd(0x06);
}
void WriteAddress(uchar x)
{
LcdWriteCmd(0x80 + x);
}
void DisplayMinTens() //显示分十位
{
WriteAddress(0x49);
LcdWriteDat((min / 10) + '0');
Delay1ms();
}
void DisplayMinUnits() //显示分个位
{
WriteAddress(0x4A);
LcdWriteDat((min % 10) + '0');
Delay1ms();
}
void DisplayHourTens() //显示时十位
{
WriteAddress(0x46);
LcdWriteDat((hour / 10) + '0');
Delay1ms();
}
void DisplayHourUnits()//显示时个位
{
WriteAddress(0x47);
LcdWriteDat((hour % 10) + '0');
Delay1ms();
}
void DisplayClkMinTens() //显示闹钟分十位
{
WriteAddress(0x49);
LcdWriteDat((clockMin / 10) + '0');
Delay1ms();
}
void DisplayClkMinUnits() //显示闹钟分个位
{
WriteAddress(0x4A);
LcdWriteDat((clockMin % 10) + '0');
Delay1ms();
}
void DisplayClkHourTens() //显示闹钟时十位
{
WriteAddress(0x46);
LcdWriteDat((clockHour / 10) + '0');
Delay1ms();
}
void DisplayClkHourUnits() //显示闹钟时个位
{
WriteAddress(0x47);
LcdWriteDat((clockHour % 10) + '0');
Delay1ms();
}
void DisplayClkSecTens() //显示秒十位
{
WriteAddress(0x4C);
LcdWriteDat((sec / 10) + '0');
Delay1ms();
}
void DisplayClkSecUnits() //显示秒个位
{
WriteAddress(0x4D);
LcdWriteDat((sec % 10) + '0');
Delay1ms();
}
void ScanKey4()
{
if((Key4 == 0)&(clockFlag ==1))
{
Delay20ms();
if((Key4 == 0)&(clockFlag ==1))
{
clockFlag = 0;
beepNum = 0;
key4Flag = 0;
}
}
}
void InitTimer0()//初始化定时器0
{
TMOD = 0x11;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
ET1=1;
ET0=1;
EA = 1;
PT0=1;
TR0=1;
TR1=1;
}
void main()//主函数
{
InitLcd1602();
LcdShowStr(0,0,table);
LcdShowStr(6,1,table1);
InitTimer0();
while(1)
{
if(sec == 60)
{
sec = 0;
min++;
}
if(min == 60)
{
min = 0;
hour++;
}
if(hour == 24)
{
hour = 0;
}
LcdShowStr(0,0,table);
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
LcdShowStr(11,1,":");
DisplayClkSecUnits();
DisplayClkSecTens();
//==============================================================
if((Key1 == 0)&(key1Flag == 0)) { //设置当前时间
Delay20ms();
if((Key1 == 0)&(key1Flag == 0)) {
TR0 = 0;
InitLcd1602();
LcdShowStr(0,0,"SetCurrentTime");
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
key1Flag = 1;
}
}
while(key1Flag == 1)
{
if(Key1 == 0) {
Delay20ms();
if(Key1 == 0)
{
hour++;
if(hour == 24)
{
hour = 0;
}
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
}
}
if(Key2 == 0)
{
Delay20ms();
if(Key2 == 0)
{
min++;
if(min == 60)
{
min = 0;
hour++;
}
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
}
}
if((Key3 == 0)&(key1Flag == 1)) { //退出设置当前时间
Delay20ms();
if((Key3 == 0)&(key1Flag == 1)) {
InitLcd1602();
LcdShowStr(0,0,table);
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
LcdShowStr(11,1,":");
DisplayClkSecUnits();
DisplayClkSecTens();
key1Flag = 0;
TR0 = 1;
}
}
}
//==============================================================
if((min==0)&(sec<5)) //时间到整点
{
LED=0;
delay();
Beep();
Beep();
Delay20ms();
}
if((min==0)&(sec>=5))
{
LED=1;
}
//==============================================================
if((Key2 == 0)&(key2Flag == 0))
{ //显示闹钟时间
Delay20ms();
if((Key2 == 0)&(key2Flag == 0))
{
key2Flag = 1;
InitLcd1602();
while(key2Flag == 1)
{
LcdShowStr(0,0,"Clock Time");
DisplayClkHourTens();
DisplayClkHourUnits();
LcdShowStr(8,1,":");
DisplayClkMinTens();
DisplayClkMinUnits();
if(Key2 == 0)
{
Delay20ms();
if(Key2 == 0)
{
key2Flag = 0;
InitLcd1602();
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
LcdShowStr(11,1,":");
DisplayClkSecUnits();
DisplayClkSecTens();
}
}
}
}
}
//==============================================================
if((Key3 == 0)&(key3Flag == 0)) //设置闹钟时间
{
Delay20ms();
if((Key3 == 0)&(key3Flag == 0))
{
TR0 = 0;
InitLcd1602();
LcdShowStr(0,0,"SetClockTime");
DisplayClkHourTens();
DisplayClkHourUnits();
LcdShowStr(8,1,":");
DisplayClkMinTens();
DisplayClkMinUnits();
key3Flag = 1;
}
}
while(key3Flag == 1)
{
if(Key1 == 0)
{
Delay20ms();
if(Key1 == 0)
{
clockHour++;
if(clockHour == 24)
{
clockHour = 0;
}
DisplayClkHourTens();
DisplayClkHourUnits();
LcdShowStr(8,1,":");
DisplayClkMinTens();
DisplayClkMinUnits();
}
}
if(Key2 == 0)
{
Delay20ms();
if(Key2 == 0)
{
clockMin++;
if(clockMin == 60)
{
clockHour++;
clockMin = 0;
}
DisplayClkHourTens();
DisplayClkHourUnits();
LcdShowStr(8,1,":");
DisplayClkMinTens();
DisplayClkMinUnits();
}
}
if(Key3 == 0)
{ //退出设置闹钟时间
Delay20ms();
if(Key3 == 0)
{
key3Flag = 0;
InitLcd1602();
TR0 = 1;
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
LcdShowStr(11,1,":");
DisplayClkSecUnits();
DisplayClkSecTens();
}
}
}
//==============================================================
if((Key4 == 0)&(key4Flag == 0)) //闹钟ON/OFF位设置
{
Delay20ms();
if((Key4 == 0)&(key4Flag == 0))
{
key4Flag = 1;
InitLcd1602();
LcdShowStr(0,0,"Clock ON");
Delay20ms();
Delay20ms();
Delay20ms();
Delay20ms();
Delay20ms();
}
}
if((Key4 == 0)&(key4Flag == 1)) //闹钟ON/OFF位设置
{
Delay20ms();
if((Key4 == 0)&(key4Flag == 1))
{
key4Flag = 0;
InitLcd1602();
LcdShowStr(0,0,"Clock OFF");
Delay20ms();
Delay20ms();
Delay20ms();
Delay20ms();
}
}
//==============================================================
if((key4Flag == 1)&(hour == clockHour)&(min == clockMin))
{
clockFlag = 1; //闹钟时间到
InitLcd1602();
LcdShowStr(0,0,table);
LcdShowStr(0,0,"Time's up");
DisplayHourTens();
DisplayHourUnits();
LcdShowStr(8,1,":");
DisplayMinTens();
DisplayMinUnits();
LcdShowStr(11,1,":");
DisplayClkSecUnits();
DisplayClkSecTens();
while(clockFlag == 1)
{
LED=!LED;
Beep();
ScanKey4();
Delay20ms();
ScanKey4();
Delay20ms();
ScanKey4();
Delay20ms();
ScanKey4();
Delay20ms();
ScanKey4();
Delay20ms();
ScanKey4();
Delay20ms();
ScanKey4();
Delay20ms();
ScanKey4();
Delay20ms();
ScanKey4();
beepNum++;
if(beepNum == 20)
{
clockFlag = 0;
beepNum = 0;
key4Flag = 0;
LED=1;
}
}
}
}
}
void Timer0() interrupt 1
{
temp++;
if(temp == 20)
{
sec++;
temp = 0;
}
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
}
void Timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
|