#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit key0 = P3^0;//時間調節分秒時切換 sbit key1 = P3^1; //時間加 sbit key2 = P3^2; //時間減 sbit lcdrw = P2^5;//讀寫操作選擇,1讀 0寫 sbit rs = P2^6;//寄存器選擇,1數據 0指令 sbit lcden = P2^7;//使能信號 uchar code table[] = {" 2010-10-22 FRI"}; uchar code table1[] = {" 00:00:00"}; uchar count,shi,fen,miao,s1num; void delay(uint z) { uint x,y; for(x = z;x > 0;x --) for(y = 110;y > 0;y --); } void write_com(uchar com)//寫指令 { rs = 0; lcden = 0; P0 = com; delay(5); lcden = 1; delay(5); lcden = 0; } void write_date(uchar date)//寫數據 { rs = 1; lcden = 0; P0 = date; delay(5); lcden = 1; delay(5); lcden = 0; } void init() { uchar num; lcdrw = 0; lcden = 0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);//清零 write_com(0x80); //液晶第一行地址 for(num = 0;num < 15;num ++) { write_date(table[num]); delay(5); } write_com(0x80+0x40);//液晶第二行地址 for(num = 0;num < 12;num ++) { write_date(table1[num]); delay(5); } TMOD = 0x01; TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; EA = 1; // 開中斷 ET0 = 1; //定時器0中斷 TR0 = 1; //啟動定時器 } void write_sfm(uchar add,uchar date) { uchar shi,ge; shi = date/10; ge = date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void keyscan() { if(key0 == 0) { delay(5); if(key0 == 0) { s1num ++; while(!key0); if(s1num == 1) { TR0 = 0; write_com(0x80+0x40+10); write_com(0x0f); } if(s1num == 2) { write_com(0x80+0x40+7); } if(s1num == 3) { write_com(0x80+0x40+4); } if(s1num == 4) { s1num = 0; write_com(0x0c);//不閃光標 TR0 = 1; } } } if(s1num != 0) { if(key1 == 0) { delay(5); if(key1 == 0) { while(!key1); if(s1num == 1) { miao ++; if(miao == 60) miao = 0; write_sfm(10,miao); write_com(0x80+0x40+10); } if(s1num == 2) { fen ++; if(fen == 60) fen = 0; write_sfm(7,fen); write_com(0x80+0x40+7); } if(s1num == 3) { shi ++; if(shi == 24) shi = 0; write_sfm(4,shi); write_com(0x80+0x40+4); } } } if(key2 == 0) { delay(5); if(key2 == 0) { while(!key2); if(s1num == 1) { if(miao == 0) { miao = 60; write_sfm(10,miao); write_com(0x80+0x40+10); } miao --; write_sfm(10,miao); write_com(0x80+0x40+10); } if(s1num == 2) { if(fen == 0) { fen = 60; write_sfm(7,fen); write_com(0x80+0x40+7); } fen --; write_sfm(7,fen); write_com(0x80+0x40+7); } if(s1num == 3) { if(shi == 0) { shi = 24; write_sfm(4,shi); write_com(0x80+0x40+4); } shi --; write_sfm(4,shi); write_com(0x80+0x40+4); } } } } } void main() { init(); while(1) { keyscan(); // while(1); } } void timer0() interrupt 1 { TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; count ++; if(count == 20) { count = 0; miao ++; if(miao == 60) { miao = 0; fen ++; if(fen == 60) { fen = 0; shi ++; if(shi ==24) { shi = 0; } write_sfm(4,shi); } write_sfm(7,fen); } write_sfm(10,miao); } }