能不能幫我看一下,先謝謝
#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;
}
|