#include
#define uchar unsigned char
#define uint unsigned int
#define KEY_IO P3
#define LCD_IO P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit SPK = P1^2;
sbit LED = P2^4;
sbit KEY_0 = P3^7;
sbit KEY_1 = P3^6;
sbit KEY_2 = P3^5;
sbit KEY_3 = P3^4;
bit new_s, modify = 0;
char t0, sec = 0, min = 0, hour = 0;
char code LCD_line1[] = \"I LOVE U\";
char code LCD_line2[] = \"Timer: 00:00:00 \"; char Timer_buf[] = \"00:00:00\";
char a,b,c,k = 0;
//-------------------- void delay(uint z)
{
uintx, y;
for(x = z; x > 0; x--)
for(y = 100; y > 0; y--);
}//-------------------- void W_LCD_Com(uchar com)//写指令 {
LCD_RS = 0;
LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令
LCD_EN = 1;delay(5); LCD_EN = 0; //用EN输入一个高脉冲 }
//-------------------- void W_LCD_Dat(uchar dat)//写数据
{LCD_RS = 1;LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据LCD_EN = 1;delay(5); LCD_EN = 0; //用EN输入一个高脉冲 }
//-------------------- void W_LCD_STR(uchar *s)//写字符串 {while(*s)W_LCD_Dat(*s++); }
//--------------------
void W_BUFF(void)//填写显示缓冲区
{Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;W_LCD_STR(Timer_buf);}
//--------------------
uchar read_key(void){ucharx1, x2;KEY_IO = 255;x1 = KEY_IO;if (x1 != 255) {delay(100);x2 = KEY_IO;if (x1 != x2)return 255;while(x2 != 255) x2 = KEY_IO;if else if (x1 == 0xbf)return 1;else if (x1 == 0xdf)return 2;else if (x1 == 0xef)return 3;else if (x1 == 0xf7)return 4;}return 255;} //--------------------
void Init(){LCD_RW = 0;W_LCD_Com(0x38); delay(50);W_LCD_Com(0x0c);W_LCD_Com(0x06);W_LCD_Com(0x01);W_LCD_Com(0x80); W_LCD_STR(LCD_line1); W_LCD_STR(LCD_line2);
TMOD = 0x01;//T0定时方式1TH0 = 0x4c;TR0 = 1;//启动T0
PT0 = 1;//高优先级, 以保证定时精度
ET0 = 1;EA = 1;}
//--------------------
void main(){uint i, j;uchar Key;Init();while(1){//
if (new_s) { //如果出现了新的一秒, 修改时间
new_s = 0;sec++;sec %= 60;if(!sec){min++;min %= 60;if(!min){ hour++; hour %= 24;}}W_BUFF();//写显示
W_LCD_Com(0xc0 + 7);(x1 == 0x7f)return 0;W_LCD_Com(0xC0);
//
if (!sec && !min) { //整点报时
for (i = 0; i
switch(Key) {//分别处理四个按键
case0: if(KEY_0) {min++;min %= 60;W_BUFF(); break;}case1: if(KEY_1) {hour++; hour %= 24; W_BUFF(); break;}case2: if(KEY_2){ a=sec;b=min;c=hour;sec = 0, min = 0, hour = 0;}case3: if(KEY_3){sec=a+sec;if(sec>60){sec=sec-60;min++;}min=b+min ;if(min>60){min=min-60;hour++;}hour=c+hour;if(hour>24){hour=hour-24;} }} }} //--------------------
void timer0(void) interrupt 1//T0中断函数, 50ms执行一次{TH0 = 0x4c;t0++; t0 %= 20;//20, 一秒钟if(t0 == 0){new_s = 1; LED = ~LED;}if(modify)LED = 0;} K0分加一 K1时加一 K2秒表开始
K3秒表结束,恢复正常时间!