一、程序源碼:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器 #define uint unsigned int //定義常用數據類型替代碼 #define uchar unsigned char #define dat P0 //定義LCD1602的數據口為P0 sbit k0=P2^0; //定義K0按鍵為P20 sbit k1=P2^1; //定義K0按鍵為P21 sbit k2=P2^2; //定義K0按鍵為P22 sbit k3=P2^3; //定義K0按鍵為P23 sbit rs=P1^4; //定義RS口為P14 sbit rw=P1^5; //定義RW口為P15 sbit e=P1^6; //定義E口為P16 uchar busy; //1602判忙標志 uchar table0[16]={"0123456789"}; uchar table1[16]={"Begin:"}; uint i=0; uint j=0; uint temp; uchar key_mode=0; int k=99; void delay(unsigned int i) { while(i--); } void delay_1ms(void) //延時程序 { uchar i,j; for(i=0;i<10;i++) for(j=0;j<20;j++); } void busy_1602(void) //查詢忙碌標志信號程序 { do { e=0; rw=1; rs=0; e=1; busy=dat; e=0; delay_1ms(); } while(busy&&0x10==1); } void com_1602(uchar a) //寫指令到LCM程序 { busy_1602(); e=0; rw=0; rs=0; e=1; dat=a; e=0; } void dat_1602(uchar a) //寫數據到LCM程序 { busy_1602(); e=0; rw=0; rs=1; e=1; dat=a; e=0; } void int_1602(void) //啟動LCM程序 { com_1602(0x38); com_1602(0x0c); com_1602(0x06); com_1602(0x01); } void displaySet(int d) { uchar rev_data[16]={"-Count Reform!- "}; com_1602(0x80);//第一行 for(i=0;i<16;i++) { dat_1602(rev_data[i]); } com_1602(0xc0); //發送數據第二行 for(i=0;i<6;i++) { dat_1602(table1[i]); } com_1602(0xc6); dat_1602(table0[d/10]); dat_1602(table0[d%10]); } void displayStatic99(int d) { uchar rev_data[16]={"-99 Countdown!- "}; com_1602(0x80);//第一行 for(i=0;i<16;i++) { dat_1602(rev_data[i]); } com_1602(0xc0); //發送數據第二行 for(i=0;i<6;i++) { dat_1602(table1[i]); } com_1602(0xc6); dat_1602(table0[d/10]); dat_1602(table0[d%10]); } void displayStatic00() { uchar rev_data[16]={"-99 Countdown!- "}; com_1602(0x80);//第一行 for(i=0;i<16;i++) { dat_1602(rev_data[i]); } com_1602(0xc0); //發送數據第二行 for(i=0;i<6;i++) { dat_1602(table1[i]); } com_1602(0xc6); dat_1602('0'); dat_1602('0'); } void displayDynamic(int d) { uchar rev_data[16]={"-99 Countdown!- "}; com_1602(0x80);//第一行 for(i=0;i<16;i++) { dat_1602(rev_data[i]); } com_1602(0xc0); //發送數據第二行 for(i=0;i<6;i++) { dat_1602(table1[i]); } com_1602(0xc6); while(d>=0) { dat_1602(table0[d/10]); dat_1602(table0[d%10]); delay(50000); d--; com_1602(0xc6); } } void keypros() { if(k0==0) //檢測按鍵K1是否按下 { delay(1000); //消除抖動 一般大約10ms if(k0==0) //再次判斷按鍵是否按下 { key_mode=1; } while(!k0); //檢測按鍵是否松開 } if(k3==0) //檢測按鍵K1是否按下 { delay(1000); //消除抖動 一般大約10ms if(k3==0) //再次判斷按鍵是否按下 { key_mode=0; } while(!k3); //檢測按鍵是否松開 } if(k1==0) //檢測按鍵K1是否按下 { delay(1000); //消除抖動 一般大約10ms if(k1==0) //再次判斷按鍵是否按下 { key_mode=2; if(k<99) { k+=1; } } while(!k1); //檢測按鍵是否松 } if(k2==0) //檢測按鍵K1是否按下 { delay(1000); //消除抖動 一般大約10ms if(k2==0) //再次判斷按鍵是否按下 { key_mode=2; k-=1; } while(!k2); //檢測按鍵是否松 } } /******************************************************************************* * 函 數 名 : main * 函數功能 : 主函數 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void main() { int_1602(); while(1) { keypros(); if(key_mode==0) { displayStatic99(k); } if(key_mode==1) { displayDynamic(k); key_mode=3; } if(key_mode==2) { displaySet(k); } if(key_mode==3) { displayStatic00(); } } }
二、視頻展示:https://www.bilibili.com/video/BV1c5411W744/