本帖最后由 51黑電子會員 于 2020-4-25 09:50 編輯
- #include<reg52.h>//單片機頭文件
- #define uchar unsigned char//宏定義,用uchar表示unsigned char,叫無符號字符型數據類型,取值范圍為:0到255。
- #define uint unsigned int//宏定義,用uint表示unsigned int,叫無符號整數型數據類型,取值范圍為:0到65535。
- sbit RS=P0^7;//位定義LCD1602字符型液晶顯示器的數據/命令選擇引腳
- sbit RW=P0^6;//位定義LCD1602字符型液晶顯示器的讀寫引腳
- sbit EN=P0^5; //位定義LCD1602字符型液晶顯示器的使能引腳
- sbit S1=P3^5;//移位按鍵S1
- sbit S2=P3^4;//增加按鍵S2
- sbit S3=P3^3;//減少按鍵S3
- sbit S4=P3^2;//啟停按鍵S4
- uchar count,S1num,S4num;//count為定時器0中斷次數變量,S1num為移位按鍵S1按鍵按下次數變量,S4num為啟停按鍵S4按下次數變量。
- uchar shi,fen,miao;//未做時間修改的計時時鐘、分鐘、秒鐘變量
- uchar secondge,secondshi; //秒鐘個位、十位的變量
- uchar minutange,minutanshi;//分鐘個位、十位的變量
- uchar hourge,hourshi;//時鐘個位、十位的變量
- uchar table0[]="2019-11-11";//LCD1602第一行初始顯示
- uchar table1[]="00:00:00";//LCD1602第二行初始顯示
- void Delay(uint z)//延時程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void WriteCommand(uchar command)//LCD1602字符型液晶顯示器寫指令函數
- {
- RS=0;//LCD1602字符型液晶顯示器指令寄存器低電平
- RW=0;//LCD1602字符型液晶顯示器寫指令操作低電平
- P2=command;//LCD1602字符型液晶顯示器寫指令函數寫指令到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器指令寄存器中執行。
- Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
- EN=1;//LCD1602字符型液晶顯示器使能端高電平
- Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
- EN=0;//LCD1602字符型液晶顯示器使能端低電平
- }
- void WriteData(uchar information)//LCD1602字符型液晶顯示器寫數據函數
- {
- RS=1;//LCD1602字符型液晶顯示器數據寄存器高電平
- RW=0;//LCD1602字符型液晶顯示器寫數據操作低電平
- P2=information;//LCD1602字符型液晶顯示器寫數據函數寫數據到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器上顯示。
- Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
- EN=1;//LCD1602字符型液晶顯示器使能端高電平
- Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
- EN=0;//LCD1602字符型液晶顯示器使能端低電平
- }
- void LCD1602Init()//LCD1602初始化函數
- {
- WriteCommand(0x38);//設置LCD1602字符型液晶顯示器16x2顯示,5*7或5*8點陣,8位數據并口,簡稱顯模。
- WriteCommand(0x08);//設置LCD1602字符型液晶顯示器顯示開,簡稱亮屏。
- WriteCommand(0x01);//設置清除LCD1602字符型液晶顯示器屏上所有內容,并讓光標復位到LCD1602字符型液晶顯示器屏左上角,簡稱清屏。
- WriteCommand(0x06);//設置開光標(或字符)地址指針自增1,光標右移動一個字符位,整屏顯示不移動。
- WriteCommand(0x0c);//設置開LCD1602字符型液晶顯示器顯示,關光標,關光標(字符)閃爍。
- }
- void Timer0Init()//定時器0初始化函數
- {
- TMOD=0x01;//設定定時器0工作模式為模式1
- TH0=(65536-50000)/256;//TH0裝初值
- TL0=(65536-50000)%256;//TL0裝初值
- EA=1;//開啟定時器總中斷
- ET0=1;//開啟定時器0中斷開關
- TR0=1;//啟動定時器0
- }
- void LCD1602Display()//LCD1602字符型液晶顯示器顯示函數
- {
- uchar j;//j表示數組元素個數變量
- WriteCommand(0x80+0x00);//LCD1602字符型液晶顯示器第一行第一個位置顯示
- for(j=0;j<10;j++)//有10個字符,要循環10次。
- {
- WriteData(table0[j]);//顯示字符串
- Delay(5);
- }
- WriteCommand(0x80+0x40);//LCD1602字符型液晶顯示器第二行第一個位置顯示
- for(j=0;j<8;j++)//有8個字符,要循環8次。
- {
- WriteData(table1[j]);//顯示字符串
- Delay(5);
- }
- }
- void LCD1602DisplayTime(uchar address,uchar num)//LCD1602顯示時間兩位數分解函數
- {
- uchar shi,ge;//十位、個位的變量
- shi=num/10;//十位數
- ge=num%10;//個位數
- WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
- WriteData(0x30+shi);//0x30表示字符庫的數字0,整個代碼表示十位可顯示0到9的數字。
- WriteData(0x30+ge);//0x30表示字符庫的數字0,整個代碼表示個位可顯示0到9的數字。
- }
- void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶顯示器顯示修改時間個位數分解函數
- {
- uchar ge;//個位的變量
- ge=num%10;//個位數
- WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
- WriteData(0x30+ge);//0x30表示字符庫的數字0,整個代碼表示個位可顯示0到9的數字。
- }
- void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶顯示器修改時間十位數分解函數
- {
- uchar shi;//十位變量
- shi=num%10;//十位數
- WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
- WriteData(0x30+shi);//0x30表示字符庫的數字0,整個代碼表示十位可顯示0到9的數字。
- }
- void KeyScan()//按鍵掃描函數
- {
- if(S1==0)//判斷移位按鍵S1是否按下
- {
- Delay(5);
- if(S1==0)//再次判斷移位按鍵S1是否按下
- {
- S1num++;//移位按鍵S1按鍵次數變量先賦值再自加
- while(!S1);//等待移位按鍵S1彈起
- switch(S1num)
- {
- case 1:
- TR0=0;//關定時器0
- S4num=0;//啟停按鍵S4按下次數清零
- secondge=miao%10;//關掉定時器0定時后,把秒鐘計時時間數值取余賦給秒鐘個位顯示位。
- secondshi=miao/10;//關掉定時器0定時后,把秒鐘計時時間數值取除賦給秒鐘十位顯示位。
- WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第8個位置的顯示位
- WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
- break;
- case 2:
- secondshi=secondshi;//關掉定時器0定時后,把秒鐘計時時間數值取除后得到的值再賦給秒鐘十位顯示位。
- WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶顯示器第二行第7個位置的顯示位
- WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
- break;
- case 3:
- minutange=fen%10;//關掉定時器0定時后,把分鐘計時時間數值取余賦給分鐘個位顯示位。
- minutanshi=fen/10;//關掉定時器0定時后,把分鐘計時時間數值取除賦給分鐘十位顯示位。
- WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶顯示器第二行第5個位置的顯示位
- WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
- break;
- case 4:
- minutanshi=minutanshi;//關掉定時器0定時后,把分鐘計時時間數值取除后得到的值再賦給分鐘十位顯示位。
- WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶顯示器第二行第4個位置的顯示位
- WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
- break;
- case 5:
- hourge=shi%10;//關掉定時器0定時后,把時鐘計時時間數值取余賦給時鐘個位顯示位。
- hourshi=shi/10;//關掉定時器0定時后,把時鐘計時時間數值取除賦給時鐘十位顯示位。
- WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶顯示器第二行第2個位置的顯示位
- WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
- break;
- case 6:
- hourshi=hourshi;//關掉定時器0定時后,把時鐘計時時間數值取除后得到的值再賦給時鐘十位顯示位。
- WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶顯示器第二行第1個位置的顯示位
- WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
- break;
- case 7:
- WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第8個位置的顯示位
- WriteCommand(0x0c);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
- TR0=1;//打開定時器0
- S1num=0;//移位按鍵S1按鍵按下次數清零
- break;
- default:
- S1num=0;//移位按鍵S1按鍵按下次數清零
- break;
- }
- }
- }
- if(S1num!=0)//判斷移位按鍵S1按鍵按下次數變量是否為0
- {
- if(S2==0)//判斷增加按鍵S2是否按下
- {
- if(S2==0)//判斷增加按鍵S2是否按下
- {
- Delay(5);
- if(S2==0)//再次判斷增加按鍵S2是否按下
- {
- while(!S2);//等待增加按鍵S2彈起
- switch(S1num)//移位按鍵S1按鍵按下次數變量選擇位
- {
- case 1://移位按鍵S1按鍵第一次按下
- secondge++;//秒鐘個位數先賦值再加加
- if(secondge==10)//判斷秒鐘個位數設定值是否達到10
- secondge=0;//秒鐘個位數歸零
- LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位的顯示數
- WriteCommand(0x80+0x40+0x07);//寫入LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位
- miao=secondshi*10+secondge;//移位修改秒鐘個位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 2://移位按鍵S1按鍵第二次按下
- secondshi++;//秒鐘十位數先賦值再加加
- if(secondshi==6)//判斷秒鐘十位數設定值是否達到6
- secondshi=0;//秒鐘十位數歸零
- LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位的顯示數
- WriteCommand(0x80+0x40+0x06);//寫入LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位
- miao=secondshi*10+secondge;//移位修改秒鐘十位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 3://移位按鍵S1按鍵第三次按下
- minutange++;//分鐘個位數先賦值再加加
- if(minutange==10)//判斷分鐘個位數設定值是否達到10
- minutange=0;//分鐘個位數歸零
- LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位的顯示數
- WriteCommand(0x80+0x40+0x04);//寫入LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位
- fen=minutanshi*10+minutange;//移位修改分鐘個位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 4://移位按鍵S1按鍵第四次按下
- minutanshi++;//分鐘十位數先賦值再加加
- if(minutanshi==6)//判斷分鐘十位數設定值是否達到6
- minutanshi=0;//分鐘十位數歸零
- LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶顯示器第二行第4個位置的分鐘十位顯示位的顯示數
- WriteCommand(0x80+0x40+0x03);//寫入LCD1602字符型液晶顯示器第二行第7個位置的分鐘十位顯示位
- fen=minutanshi*10+minutange;//移位修改分鐘十位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 5://移位按鍵S1按鍵第五次按下
- hourge++;//時鐘個位數先賦值再加加
- if(hourge==4)//判斷時鐘個位數設定值是否達到4
- hourge=0;//時鐘個位數歸零
- LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位的顯示數
- WriteCommand(0x80+0x40+0x01);//寫入LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位
- shi=hourshi*10+hourge;//移位修改時鐘個位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 6://移位按鍵S1按鍵第六次按下
- hourshi++;//時鐘十位數先賦值再加加
- if(hourshi==3)//判斷時鐘十位數設定值是否達到3
- hourshi=0;//時鐘十位數歸零
- LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶顯示器第二行第1個位置的時鐘十位顯示位的顯示數
- WriteCommand(0x80+0x40+0x00);//寫入LCD1602第二行第1個位置的時鐘十位顯示位
- shi=hourshi*10+hourge;//移位修改時鐘十位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- default:
- S1num=0;//移位按鍵S1按鍵按下次數清零
- break;
- }
- }
- }
- if(S3==0)//判斷減少按鍵S3是否按下
- {
- Delay(5);
- if(S3==0)//再次判斷減少按鍵S3是否按下
- {
- while(!S3);//等待減少按鍵S3彈起
- switch(S1num)//移位按鍵S1按鍵按下次數變量選擇位
- {
- case 1://移位按鍵S1按鍵第一次按下
- secondge--;//秒鐘個位數先賦值再減減
- if(secondge==-1)//判斷秒鐘個位數設定值是否達到-1
- secondge=9;//秒鐘個位數歸9
- LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位的顯示數
- WriteCommand(0x80+0x40+0x07);//寫入LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位
- miao=secondshi*10+secondge;//移位修改秒鐘個位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 2://移位按鍵S1按鍵第二次按下
- secondshi--;//秒鐘十位數先賦值再減減
- if(secondshi==-1)//判斷秒鐘十位數設定值是否達到-1
- secondshi=5;//秒鐘十位數歸5
- LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位的顯示數
- WriteCommand(0x80+0x40+0x06);//寫入LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位
- miao=secondshi*10+secondge;//移位修改秒鐘十位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 3://移位按鍵S1按鍵第三次按下
- minutange--;//分鐘個位數先賦值再減減
- if(minutange==-1)//判斷分鐘個位數設定值是否達到-1
- minutange=9;//分鐘個位數歸9
- LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位的顯示數
- WriteCommand(0x80+0x40+0x04);//寫入LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位
- fen=minutanshi*10+minutange;//移位修改分鐘個位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 4://移位按鍵S1按鍵第四次按下
- minutanshi--;//分鐘十位數先賦值再減減
- if(minutanshi==-1)//判斷分鐘十位數設定值是否達到6
- minutanshi=5;//分鐘十位數歸5
- LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶顯示器第二行第4個位置的分鐘十位顯示位的顯示數
- WriteCommand(0x80+0x40+0x03);//寫入LCD1602字符型液晶顯示器第二行第7個位置的分鐘十位顯示位
- fen=minutanshi*10+minutange;//移位修改分鐘十位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 5://移位按鍵S1按鍵第五次按下
- hourge--;//時鐘個位數先賦值再減減
- if(hourge==-1)//判斷時鐘個位數設定值是否達到-1
- hourge=3;//時鐘個位數歸3
- LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位的顯示數
- WriteCommand(0x80+0x40+0x01);//寫入LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位
- shi=hourshi*10+hourge;//移位修改時鐘個位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- case 6://移位按鍵S1按鍵第六次按下
- hourshi--;//時鐘十位數先賦值再減減
- if(hourshi==-1)//判斷時鐘十位數設定值是否達到-1
- hourshi=2;//時鐘十位數歸2
- LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶顯示器第二行第1個位置的時鐘十位顯示位的顯示數
- WriteCommand(0x80+0x40+0x00);//寫入LCD1602字符型液晶顯示器第二行第1個位置的時鐘十位顯示位
- shi=hourshi*10+hourge;//移位修改時鐘十位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
- break;
- default:
- S1num=0;//移位按鍵S1按鍵按下次數清零
- break;
- }
- }
- }
- }
- if(S4==0)//判斷啟停按鍵S4是否按下
- {
- Delay(5);
- if(S4==0)//再次判斷啟停按鍵S4是否按下
- {
- S4num++;//啟停按鍵S4按下次數先賦值再加加
- while(!S4);//等待啟停按鍵S4彈起
- if(S4num==1)//判斷啟停按鍵S4是否第一次按下過。實現直接停止。
- {
- TR0=0;//關定時器0
- }
- if(S1num>=1&&S4num==1)//判斷移位按鍵S1按鍵和啟停按鍵S4是否按下過。實現移位停止后,可移位修改時間數值或不修改時間數值,然后再啟動。
- {
- TR0=1;//開定時器0
- WriteCommand(0x0c);//開LCD1602顯示,關光標,關光標(或字符)閃爍。
- S4num=0;//啟停按鍵S4按下次數變量清零
- S1num=0;//移位按鍵S1按鍵按下次數變量清零
- }
- if(S4num==2)//判斷移位按鍵S4按鍵是否第二次按下過
- {
- TR0=1;//開定時器0
- S4num=0;//啟停按鍵S4按下次數變量清零
- }
- }
- }
- }
- void Timer0() interrupt 1//定時器0中斷函數
- {
- TH0=(65536-50000)/256;//TH0重新裝值
- TL0=(65536-50000)%256;//TL0重新裝值
- count++;//定時器0中斷次數先賦值再加
- if(count==18)//判斷定時器0中斷次數是否為18次
- {
- count=0;//定時器0中斷次數歸零
- miao++;//秒鐘先賦值再加
- if(miao==60)//判斷秒鐘是否達到60秒
- {
- miao=0;//秒鐘歸零
- fen++;//分鐘先賦值再加
- if(fen==60)//判斷分鐘是否達到60分
- {
- fen=0;//分鐘歸零
- shi++;//時鐘先賦值再加
- if(shi==24)//判斷時鐘是否達到24時
- {
- shi=0;//時鐘歸零
- }
- LCD1602DisplayTime(0x00,shi);//時鐘顯示兩位數分解函數
- }
- LCD1602DisplayTime(0x03,fen);//分鐘顯示兩位數分解函數
- }
- LCD1602DisplayTime(0x06,miao);//秒鐘顯示兩位數分解函數
- }
- }
- void main()//主函數
- {
- LCD1602Init();//LCD1602字符型液晶顯示器初始化函數
- Timer0Init();//定時器0初始化函數
- LCD1602Display();//LCD1602字符型液晶顯示器顯示函數
- while(1)
- {
- KeyScan();//按鍵掃描函數
- }
- }
復制代碼
圖片116.png (81.04 KB, 下載次數: 52)
下載附件
2020-4-25 09:35 上傳
|