1602顯示時鍾可以調節時分秒(加減)
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #define uchar unsigned char #define uint unsigned int static uchar count,j,s1num; char shi,fen,miao; sbit RS = P2^4; //Pin4 sbit RW = P2^5; //Pin5 sbit E = P2^6; //Pin6 sbit s1=P3^0; //矩陣鍵盤分離出獨立鍵盤 sbit s2=P3^1; sbit s3=P3^2; sbit rd=P3^7; uchar code table1[]=" 2013-7-30 MON "; uchar code table2[]=" 00:00:00 "; /******************************************************************/ /* 延時函數 */ /******************************************************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /******************************************************************/ /* 寫入命令函數 */ /******************************************************************/ void WriteCommand(unsigned char c) { delay(5);//操作前短暫延時,保證信號穩定 E=0; RS=0; RW=0; delay(5); E=1; P0=c; E=0; } /******************************************************************/ /* 寫入數據函數 */ /******************************************************************/ void WriteData(unsigned char c) { delay(5); //操作前短暫延時,保證信號穩定 E=0; RS=1; RW=0; delay(5); E=1; P0=c; E=0; RS=0; } /******************************************************************/ /* 初始化函數 */ /******************************************************************/ void InitLcd() { //delay(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //顯示光標移動位置 WriteCommand(0x0c); //顯示開及光標設置 WriteCommand(0x01); //顯示清屏 // fen=59; //測試用 // miao=53; // shi=23; delay(15); WriteCommand(0x80); //顯示第一行 for(j=0;j<16;j++) { WriteData(table1[j]); delay(5); } WriteCommand(0x80+0x40); //顯示第二行 for(j=0;j<16;j++) { WriteData(table2[j]); delay(5); } } /******************************************************************/ /* 時分秒顯示 */ /******************************************************************/ void writesfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; WriteCommand(0x80+0x40+add); WriteData(0x30+shi); WriteData(0x30+ge); } /******************************************************************/ /* 鍵盤功能函數 */ /******************************************************************/ void keysan() { rd=0; if(s1==0) { delay(5); if(s1==0) { s1num++; while(!s1); if(s1num==1) { TR0=0; WriteCommand(0x80+0x40+10); WriteCommand(0x0f);//顯示光標 } } if(s1num==2) { WriteCommand(0x80+0x40+7); } if(s1num==3) { WriteCommand(0x80+0x40+4); } if(s1num==4) { s1num=0; WriteCommand(0x0c); //光標不閃爍 TR0=1; } } if(s1num!=0) //s1抬起時完成加減操作 { if(s2==0) { delay(5); if(s2==0) { while(!s2); if(s1num==1) { miao++; if(miao==60) miao=0; writesfm(10,miao); WriteCommand(0x80+0x40+10); } if(s1num==2) { fen++; if(fen==60) fen=0; writesfm(7,fen); WriteCommand(0x80+0x40+7); } if(s1num==3) { shi++; if(shi==24) shi=0; writesfm(4,shi); WriteCommand(0x80+0x40+4); } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); if(s1num==1) { miao--; if(miao==-1) miao=59; writesfm(10,miao); WriteCommand(0x80+0x40+10); } if(s1num==2) { fen--; if(fen==-1) fen=59; writesfm(7,fen); WriteCommand(0x80+0x40+7); } if(s1num==3) { shi--; if(shi==-1) shi=23; writesfm(4,shi); WriteCommand(0x80+0x40+4); } } } } } /******************************************************************/ /* 主函數 */ /******************************************************************/ void main(void) { TMOD=0x01; //定時器0 10ms in 12M crystal 用於計時 TH0=(65536-50000)/256; //初值 TL0=(65536-50000)%256; ET0=1; TR0=1; EA =1; InitLcd(); //初始化LCD,送初值 while(1) { keysan(); if(count==10) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } writesfm(4,shi) ; } writesfm(7,fen) ; } writesfm(10,miao) ; } } } void timer0() interrupt 1 //定時器中斷0 { TH0=(65536-50000)/256; //初值 TL0=(65536-50000)%256; count++; }
最後更新:2017-04-03 18:52:14