本例帶hex文件和工程工程文件的完整源碼下載地址:http://www.zg4o1577.cn/bbs/dpj-22517-1.html
//1602液晶屏 萬(wàn)年歷時(shí)鐘源程序---加溫度、背光、灰度 數(shù)字? /******************************************************************************************** 程序名: 1602液晶屏?xí)r鐘程序 編寫(xiě)時(shí)間: 2012年6月8日 硬件支持: LCD1602液晶屏 STC12C2052 外部12MHZ晶振 說(shuō)明備注: 使用2402液晶屏程序,與1602液晶屏程序完全兼容 2011-11-18 23:36 實(shí)現(xiàn)NPN13001三極管控制背光,P3^7接10K限流電阻。 2011-11-19 10:10 添加調(diào)年月日時(shí)間功能鍵 2011-11-20 08:25 添加鬧鈴功能 2011-11-20 18:00 添加PWM調(diào)光功能 2011-11-21 22:00 實(shí)現(xiàn)4位總線(xiàn)_2行顯示 2011-11-23 20:33 加入溫度顯示ds18b02 不加上拉電阻也可以 2011-11-26 13:40 實(shí)驗(yàn)用一個(gè)按鍵實(shí)現(xiàn)長(zhǎng)短兩種開(kāi)關(guān)代替兩個(gè)按鍵 2011-12-11 14:50 加入正負(fù)號(hào)判斷 小數(shù)點(diǎn)顯示溫度,更精確 2011-12-18 23:36 實(shí)現(xiàn)NPN13001三極管控制灰度,P3^5接10K限流電阻 準(zhǔn)備加入光控背光 LED測(cè)光原理應(yīng)用 有光無(wú)背光,外界光線(xiàn)暗 有背光。 /********************************************************************************************/ #include<STC12C2052AD.H> //頭文件 #include <intrins.h> /********************************************************************************************/ typedef unsigned char uint8; // 無(wú)符號(hào)8位整型變量 // #define uchar unsigned char #define uint unsigned int /******************************************************************************************** // 引腳定義 // (使用者根據(jù)實(shí)際更改) /********************************************************************************************/ sbit key1=P3^0; //菜單 sbit key2=P3^1; //調(diào)增 unsigned char data MENU = 0; // 默認(rèn)菜單 = 0 正常顯示時(shí)鐘 /*******************************************************************************************/ /********************************************18b20******************************************/ sbit DQ=P1^0; //溫度輸入端口 //uchar temp; //溫度值變量8位 uint temp; //溫度值變量16位 uchar s; //負(fù)數(shù)標(biāo)志 s=1 //**************延時(shí)b******************* void delay(uchar b) { while (b--) { _nop_(); _nop_(); } } //**************初始化************************ void init_ds18b20(void) { uchar n; DQ=1; delay(60); // 15-60us DQ=0; delay(240);delay(240); //480-960us DQ=1; delay(60); n=DQ; //采集數(shù)據(jù) n=1 有無(wú)器件 delay(60); } //**************寫(xiě)1個(gè)字節(jié)數(shù)據(jù)*低位在前********************************* void write_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { DQ=0; delay(1); DQ=dat&0x01; delay(60); DQ=1; dat>>=1; } delay(60); } //***************讀1個(gè)字節(jié)數(shù)據(jù)********************************* uchar read_byte(void) { uchar i,value; for(i=0;i<8;i++) { DQ=0; value>>=1; DQ=1; delay(1); if(DQ) value|=0x80; delay(60); } return value; } //******************讀取溫度值****************************** uchar readtemperature(void) { uchar a,b; float tt; //浮點(diǎn)變量 有小數(shù)計(jì)算 init_ds18b20(); //初始化 write_byte(0xcc); //寫(xiě)指令 跳過(guò)ROM write_byte(0x44); //寫(xiě)指令 啟動(dòng)溫度測(cè)量 delay(300); //延時(shí) init_ds18b20(); //初始化 write_byte(0xcc); //寫(xiě)指令 跳過(guò)ROM write_byte(0xbe); //寫(xiě)指令 讀取溫度數(shù)據(jù) a=read_byte(); //讀取低8位 b=read_byte(); //讀取高8位 //判斷正負(fù)溫度: 負(fù)數(shù)就取補(bǔ)碼 if(b>127) // 當(dāng)高8位的第8位為1時(shí),就是負(fù)值 1000 0000 0x80 128 { a=~a+1; // 當(dāng)為負(fù)值的時(shí)候,低8位的操作 if(~a>=0xff) // 當(dāng)?shù)?位<-127度 ,則高8位進(jìn)位 { b=~b+1; // 高8位進(jìn)位 } else // 不小于-127度時(shí),高8位取反 { b=~b; } s=1; //負(fù)值標(biāo)志,你只要在液晶上顯示一個(gè)“-”就行。 } temp = b; //先把高八位有效數(shù)據(jù)賦于temp temp <<= 8; //把以上8位數(shù)據(jù)從temp低八位移到高八位 temp = temp|a; //兩字節(jié)合成一個(gè)整型變量 tt = temp*0.0625; //得到真實(shí)十進(jìn)制溫度值 因?yàn)镈S18B20可以精確到0.0625度//所以讀回?cái)?shù)據(jù)的最低位代表的是0.0625度 temp = tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點(diǎn)后第一位也轉(zhuǎn)換為可顯示數(shù)字,同時(shí)進(jìn)行一個(gè)四舍五入操作。 return temp; //返回溫度值 三位數(shù) 各位代表小數(shù) 因?yàn)榉糯?0倍 } /********************************************18b20******************************************/ /********************************************************************************************/ #define LCM2402_DB0_DB7 P1 // 定義LCM2402的數(shù)據(jù)總線(xiàn) sbit LCM2402_RS = P3 ^ 2; // 定義LCM2402的RS控制線(xiàn) sbit LCM2402_RW = P3 ^ 3; // 定義LCM2402的RW控制線(xiàn) sbit LCM2402_E = P3 ^ 4; // 定義LCM2402的E控制線(xiàn) sbit LCM2402_Busy = P1 ^ 7; // 定義LCM2402的測(cè)忙線(xiàn)(與LCM2402_DB0_DB7關(guān)聯(lián)) data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS;//設(shè)置日、月、年、周、時(shí)、分、秒和溫度存放區(qū) data unsigned char Clock_HH,Clock_MM,PWM; // 鬧鐘 調(diào)光 data bit DAY_BIT = 0;//天數(shù)增加標(biāo)志位(用于日期進(jìn)位的啟動(dòng)) data unsigned char DIS_BIT = 0; //多種信息的切換顯示 data unsigned char cou = 0; // 軟計(jì)數(shù)器,對(duì)10ms時(shí)基信號(hào)累加到1s /******************************************************************************************** // 定義LCM2402指令集 // (詳細(xì)請(qǐng)見(jiàn)技術(shù)手冊(cè)) /********************************************************************************************/ #define CMD_clear 0x01 // 清除屏幕 #define CMD_back 0x02 // DDRAM回零位 #define CMD_dec1 0x04 // 讀入后AC(指針)減1,向左寫(xiě) #define CMD_add1 0x06 // 讀入后AC(指針)加1,向右寫(xiě) #define CMD_dis_gb1 0x0f // 開(kāi)顯示_開(kāi)光標(biāo)_開(kāi)光標(biāo)閃爍 #define CMD_dis_gb2 0x0e // 開(kāi)顯示_開(kāi)光標(biāo)_關(guān)光標(biāo)閃爍 #define CMD_dis_gb3 0x0c // 開(kāi)顯示_關(guān)光標(biāo)_關(guān)光標(biāo)閃爍 #define CMD_OFF_dis 0x08 // 關(guān)顯示_關(guān)光標(biāo)_關(guān)光標(biāo)閃爍 #define CMD_set82 0x38 // 8位總線(xiàn)_2行顯示 #define CMD_set81 0x30 // 8位總線(xiàn)_1行顯示(上邊行) #define CMD_set42 0x28 // 4位總線(xiàn)_2行顯示 #define CMD_set41 0x20 // 4位總線(xiàn)_1行顯示(上邊行) #define lin_1 0x80 // 4位總線(xiàn)_1行顯示(上邊行) #define lin_2 0xc0 // 4位總線(xiàn)_1行顯示(上邊行) /******************************************************************************************** // 讀LCM忙程序 [底層協(xié)議] // (所有底層協(xié)議都無(wú)需關(guān)注) // LCM2402測(cè)忙,若LCM2402處于忙狀態(tài),本函數(shù)將等待至非忙狀態(tài) // /********************************************************************************************/ void LCM2402_TestBusy(void){ LCM2402_DB0_DB7 = 0xff; //設(shè)備讀狀態(tài) LCM2402_RS = 0; LCM2402_RW = 1; LCM2402_E = 1; while(LCM2402_Busy); //等待LCM不忙 LCM2402_E = 0; // } /******************************************************************************************** // 寫(xiě)指令程序 // // 向LCM2402寫(xiě)命令 本函數(shù)需要1個(gè)指令集的入口參數(shù) // /********************************************************************************************/ void LCM2402_WriteCMD(uint8 LCM2402_command) { LCM2402_TestBusy(); LCM2402_RS = 0; LCM2402_RW = 0; // LCM2402_DB0_DB7 = LCM2402_command; // 8位總線(xiàn) // LCM2402_E = 1; // LCM2402_E = 0; LCM2402_DB0_DB7 = LCM2402_command/16 << 4; // 4位總線(xiàn)高四位 LCM2402_E = 1; LCM2402_E = 0; LCM2402_DB0_DB7 = LCM2402_command%16 << 4; // 4位總線(xiàn)低四位 LCM2402_E = 1; LCM2402_E = 0; } /******************************************************************************************** // 寫(xiě)數(shù)據(jù)程序 // // 向LCM2402寫(xiě)數(shù)據(jù) // /********************************************************************************************/ void LCM2402_WriteData(uint8 LCM2402_data){ LCM2402_TestBusy(); LCM2402_RS = 1; LCM2402_RW = 0; // LCM2402_DB0_DB7 = LCM2402_command; // 8位總線(xiàn) // LCM2402_E = 1; // LCM2402_E = 0; LCM2402_DB0_DB7 = LCM2402_data/16 << 4; // 4位總線(xiàn)高四位 LCM2402_E = 1; LCM2402_E = 0; LCM2402_DB0_DB7 = LCM2402_data%16 << 4; // 4位總線(xiàn)低四位 LCM2402_E = 1; LCM2402_E = 0; } /******************************************************************************************** // 打印字符串程序 // (本函數(shù)調(diào)用指針函數(shù)) // 向LCM發(fā)送一個(gè)字符串,長(zhǎng)度48字符之內(nèi) // 第一行位置 0x00~0x17 第二行位置 0x40~0x57 // 應(yīng)用舉例:print(0x80,"doyoung.net"); //在第一行第一位處從左向右打印doyoung.net字符串 /********************************************************************************************/ void print(uint8 a,uint8 *str){ LCM2402_WriteCMD(a | 0x80); while(*str != '\0'){ LCM2402_WriteData(*str++); } *str = 0; } /******************************************************************************************** // 打印單字符程序 // // 第一行位置 0x00~0x17 第二行位置 0x40~0x57 // 向LCM發(fā)送一個(gè)字符,以十六進(jìn)制(0x00)表示 // 應(yīng)用舉例:print(0xc0,0x30); //在第二行第一位處打印字符“0” /********************************************************************************************/ void print2(uint8 a,uint8 t){ LCM2402_WriteCMD(a | 0x80); LCM2402_WriteData(t); } /******************************************************************************************** // 定義小漢字 // // 可寫(xiě)入8個(gè)自字義字符,寫(xiě)入后可用其CGRAM代碼直接提取顯示。 // 字符定義方法請(qǐng)參考技術(shù)手冊(cè) /********************************************************************************************/ uint8 code Xword[]={ 0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //℃,代碼 0x00 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, //一,代碼 0x01 0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00, //二,代碼 0x02 0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00, //三,代碼 0x03 0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00, //四,代碼 0x04 0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00, //五,代碼 0x05 0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00, //六,代碼 0x06 0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00, //日,代碼 0x07 }; void CgramWrite(void) { // 裝入CGRAM // uint8 i; LCM2402_WriteCMD(0x06); // CGRAM地址自動(dòng)加1 LCM2402_WriteCMD(0x40); // CGRAM地址設(shè)為00處 for(i=0;i<64;i++) { LCM2402_WriteData(Xword[i]);// 按數(shù)組寫(xiě)入數(shù)據(jù) } } /******************************************************************************************** // LCM2402初始化 //(使用者可自定義,加 * 號(hào)程序行必須保留但可修改) /********************************************************************************************/ void LCM2402_Init(void){ // LCM2402_WriteCMD(CMD_set82); //* 顯示模式設(shè)置:顯示2行,每個(gè)字符為5*7個(gè)像素 8位總線(xiàn)通信 LCM2402_WriteCMD(CMD_set42); //* 顯示模式設(shè)置:顯示2行,每個(gè)字符為5*7個(gè)像素 4位總線(xiàn)通信 LCM2402_WriteCMD(CMD_set42); //* 顯示模式設(shè)置:顯示2行,每個(gè)字符為5*7個(gè)像素 4位總線(xiàn)通信 LCM2402_WriteCMD(CMD_clear); // 顯示清屏 LCM2402_WriteCMD(CMD_back); //* 數(shù)據(jù)指針指向第1行第1個(gè)字符位置 LCM2402_WriteCMD(CMD_add1); // 顯示光標(biāo)移動(dòng)設(shè)置:文字不動(dòng),光標(biāo)右移 LCM2402_WriteCMD(CMD_dis_gb3); // 顯示開(kāi)及光標(biāo)設(shè)置:顯示開(kāi),光標(biāo)開(kāi),閃爍開(kāi) CgramWrite(); // 向CGRAM寫(xiě)入自定義字符 } /********************************************************************************************/ // 以上是LCM2402驅(qū)動(dòng)程序 // /*********************************************************************************************/ /*********************************************************************************************/ bit IsLeapYear(void){ //計(jì)算本年是否是潤(rùn)年 unsigned int a; a = 2000+TIME_YY;//加2000表示成完整的年 if((a%4==0 && a%100!=0)||(a%400==0)){ //潤(rùn)年的計(jì)算公式 return 1;//是潤(rùn)年返回1 } else{ return 0;//不是潤(rùn)年返回0 } } /**********************************************************************************************/ void month_day(void){ unsigned char mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31}; TIME_DD++;//天加1 TIME_WW++;//星期值加1 if(TIME_WW > 7){ TIME_WW = 1;//時(shí)期值限定 } if(TIME_DD > mon_day[TIME_MO-1]){//檢查天是否大于當(dāng)月的最大值 if(IsLeapYear()&&TIME_MO==2){ //計(jì)算本月是否是潤(rùn)年的2月份 TIME_DD = 29;//如果是潤(rùn)年又是2月,則天為29 } else{ TIME_DD = 1; //否則就等于1 TIME_MO++;//月加1 if(TIME_MO > 12){ TIME_MO = 1; //如果月大于12則月等于1 TIME_YY++;//年加1 (公歷年無(wú)限積加) } } } } /**********************************************************************************************/ void init (void){ //上電初始化 TMOD = 0x11; // 定時(shí)/計(jì)數(shù)器0,1工作于方式1 TH0 = 0x3c; // 預(yù)置產(chǎn)生50ms時(shí)基信號(hào) TL0 = 0xb0; EA = 1; // 開(kāi)總中斷 ET0 = 1; // 定時(shí)/計(jì)數(shù)器0允許中斷 TR0 = 1; // 開(kāi)閉定時(shí)/計(jì)數(shù)器0 //// TIME_DD = 17; //時(shí)間在首次使用的值,之后會(huì)在EEPROM自動(dòng)記錄上一天的值 TIME_MO = 11; //初始時(shí)間:2011年11月17日周一,23時(shí)08分00秒 TIME_YY = 11; TIME_WW = 4; TIME_HH = 1; TIME_MM = 0; TIME_SS = 0; } /******************************************************************************************** //顯示項(xiàng)目 時(shí)間部分 在第一行全行顯示時(shí)間 *********************************************************************************************/ void RealTime_Display(void) { print(0x80,"20"); print2(0x82,TIME_YY/10+0x30); print2(0x83,TIME_YY%10+0x30); print(0x84,"/"); // 顯示年 // print2(0x85,TIME_MO/10+0x30); print2(0x86,TIME_MO%10+0x30); print(0x87,"/"); // 顯示月 // print2(0x88,TIME_DD/10+0x30); print2(0x89,TIME_DD%10+0x30); // 顯示日 print(0x8b,"["); // 顯示[ print2(0x8c,TIME_WW%10); //星期 print(0x8d,"]"); // 顯示] print2(0x40,TIME_HH/10+0x30);//小時(shí) print2(0x41,TIME_HH%10+0x30); print(0x42,":"); // 顯示cgram第一個(gè)字模":" // print2(0x43,TIME_MM/10+0x30);//分鐘 print2(0x44,TIME_MM%10+0x30); print(0x45,"."); // 顯示cgram第一個(gè)字模"." // print2(0x46,TIME_SS/10+0x30);//秒 print2(0x47,TIME_SS%10+0x30); // } /**********************************************************************************************/ void delay_ms(unsigned int a){//-延時(shí)函數(shù) 1MS/次 unsigned char i; while( --a != 0){ for(i = 0; i < 125; i++); //一個(gè) ; 表示空語(yǔ)句,CPU空轉(zhuǎn)。 } //i 從0加到125,CPU大概就耗時(shí)1毫秒 } /********************************************************************************************* /********************************************************************************************* 函數(shù)名:PWM初始化函數(shù) 調(diào) 用:PWM_init(); 參 數(shù):無(wú) 返回值:無(wú) 結(jié) 果:將PCA初始化為PWM模式,初始占空比為0 備 注:需要更多路PWM輸出直接插入CCAPnH和CCAPnL即可 /**********************************************************************************************/ void PWM_init (void){ CMOD=0x02; //設(shè)置PCA定時(shí)器 CL=0x00; CH=0x00; CCAPM0=0x42; //PWM0設(shè)置PCA工作方式為PWM方式(0100 0010) CCAP0L=0x00; //設(shè)置PWM0初始值與CCAP0H相同 CCAP0H=0x00; // PWM0初始時(shí)為0 CCAPM1=0x42; //PWM1設(shè)置PCA工作方式為PWM方式(使用時(shí)刪除//) CCAP1L=0x00; //設(shè)置PWM1初始值與CCAP0H相同 CCAP1H=0x00; // PWM1初始時(shí)為0 //CCAPM2=0x42; //PWM2設(shè)置PCA工作方式為PWM方式 //CCAP2L=0x00; //設(shè)置PWM2初始值與CCAP0H相同 //CCAP2H=0x00; // PWM2初始時(shí)為0 //CCAPM3=0x42; //PWM3設(shè)置PCA工作方式為PWM方式 //CCAP3L=0x00; //設(shè)置PWM3初始值與CCAP0H相同 //CCAP3H=0x00; // PWM3初始時(shí)為0 CR=1; //啟動(dòng)PCA定時(shí)器 } /**********************************************************************************************/ /********************************************************************************************* 函數(shù)名:PWM0占空比設(shè)置函數(shù) 調(diào) 用:PWM0_set(); 參 數(shù):0x00~0xFF(亦可用0~255) 返回值:無(wú) 結(jié) 果:設(shè)置PWM模式占空比,為0時(shí)全部高電平,為1時(shí)全部低電平 備 注:如果需要PWM1的設(shè)置函數(shù),只要把CCAP0L和CCAP0H中的0改為1即可 /**********************************************************************************************/ void PWM0_set (unsigned char a){ CCAP0L= a; //設(shè)置值直接寫(xiě)入CCAP0L CCAP0H= a; //設(shè)置值直接寫(xiě)入CCAP0H } /********************************************************************************************* 函數(shù)名:PWM1占空比設(shè)置函數(shù) 調(diào) 用:PWM1_set(); 參 數(shù):0x00~0xFF(亦可用0~255) 返回值:無(wú) 結(jié) 果:設(shè)置PWM模式占空比,為0時(shí)全部高電平,為1時(shí)全部低電平 備 注:如果需要PWM1的設(shè)置函數(shù),只要把CCAP0L和CCAP0H中的0改為1即可 /**********************************************************************************************/ void PWM1_set (unsigned char a){ CCAP1L= a; //設(shè)置值直接寫(xiě)入CCAP1L CCAP1H= a; //設(shè)置值直接寫(xiě)入CCAP1H } /**********************溫度顯示函數(shù)***********************************************************/ void WD_XS(void) { delay_ms(1000); //溫度轉(zhuǎn)換時(shí)間需要750ms以上 temp=readtemperature(); if(s==1){print(0x48," -");} print(0x48," "); print2(0x4b,temp/100+0x30);//百位 實(shí)際 溫度十位數(shù) print2(0x4c,temp%100/10+0x30);//十位 實(shí)際 溫度個(gè)位數(shù) print(0x4d,"."); //小數(shù)點(diǎn) print2(0x4e,temp%10+0x30);//個(gè)位 實(shí)際 溫度小數(shù)位 print2(0x4f,0); // ℃ } /*************************************主函數(shù)***************************************************/ void main (void) { delay_ms(1000);//延時(shí)1S PWM_init(); //PWM初始化 PWM=120; PWM0_set(PWM); //設(shè)置PWM0占空比 [0-255] 背光 默認(rèn)值 PWM1_set(PWM); //設(shè)置PWM1占空比 [0-255] 灰度 默認(rèn)值 init();//初始化 年月日時(shí)分秒 LCM2402_Init();//LCM2402初始化 MENU = 0 ; temp=readtemperature(); //讀取溫度值 while(1) { //主線(xiàn)程// RealTime_Display(); if(DAY_BIT == 1) { //檢查天數(shù)是否更新,是則計(jì)算公歷 month_day();//計(jì)算公歷日期 DAY_BIT = 0;//計(jì)算完成后將日期變更標(biāo)志位置0 } /*調(diào)整時(shí)間日期**************************************************************************************/ if(MENU == 0) { if(TIME_SS%10==1){ WD_XS(); } //每10秒 【當(dāng)秒數(shù)個(gè)位=1時(shí)】運(yùn)行1次溫度顯示函數(shù) if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 1; while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuY"); } // 進(jìn)入菜單1 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ PWM=PWM-10; //背光切換 if(PWM<0){PWM=255;} // PWM0_set(PWM); //設(shè)置PWM占空比 [0-255] NPN 13001 8050 255全滅,0全亮。 print2(0x49,PWM/100+0x30); // print2(0x4a,(PWM-PWM/100*100)/10+0x30);// print2(0x4b,(PWM-PWM/100*100)%10+0x30); print(0x4c,"*"); } } while(key1 == 0 || key2 == 0){ } } if(MENU == 1) { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 2; while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuM"); } // 進(jìn)入菜單2 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ TIME_YY ++ ; if(TIME_YY > 99){ TIME_YY = 0; } } } while(key1 == 0 || key2 == 0){ } } if(MENU == 2) { print(0x4a,"menuM"); if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 3; while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuD"); } // 進(jìn)入菜單3 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ TIME_MO ++ ; if(TIME_MO > 12){ TIME_MO = 1; } } } while(key1 == 0 || key2 == 0){ } } if(MENU == 3) { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 4; while(key1 == 0 || key2 == 0){ print(0x48," "); print(0x4a,"menuW"); } // 進(jìn)入菜單4 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ TIME_DD ++ ; if(TIME_DD > 31){ TIME_DD = 1; } } } while(key1 == 0 || key2 == 0){ } } if(MENU == 4) { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 5; while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuH"); } // 進(jìn)入菜單5 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ TIME_WW ++ ; if(TIME_WW > 7){ TIME_WW = 1; } } } while(key1 == 0 || key2 == 0){ } } if(MENU == 5) { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 6; while(key1 == 0 || key2 == 0){ print(0x48," "); print(0x4a,"menum"); } // 進(jìn)入菜單6 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ TIME_HH ++ ; if(TIME_HH > 23){ TIME_HH = 0; } } } while(key1 == 0 || key2 == 0){ } } if(MENU == 6) { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 7; while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"HuiDu");}// 進(jìn)入菜單7 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ TIME_MM ++ ; TIME_SS=0; if(TIME_MM > 59){ TIME_MM = 0; } } } while(key1 == 0 || key2 == 0){ } } if(MENU == 7) //調(diào)節(jié)灰度 對(duì)比度 { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 8; while(key1 == 0 || key2 == 0){ print(0x48," "); print(0x4a,"--H--"); } // 進(jìn)入菜單8鬧鈴時(shí) } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ PWM=PWM-10; //灰度切換 if(PWM<0){PWM=255;} // PWM1_set(PWM); //設(shè)置PWM占空比 [0-255] NPN 13001 8050 255全滅,0全亮。 print2(0x49,PWM/100+0x30); // print2(0x4a,(PWM-PWM/100*100)/10+0x30);// print2(0x4b,(PWM-PWM/100*100)%10+0x30); print(0x4c,"*"); } } while(key1 == 0 || key2 == 0){ } } if(MENU == 8) { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 9; while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"--m--"); } // 進(jìn)入菜單9鬧鈴分 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ Clock_HH ++ ; print2(0x49,Clock_HH/10+0x30);//小時(shí) print2(0x4a,Clock_HH%10+0x30); print(0x4b,":"); // 顯示cgram第一個(gè)字模":" // print2(0x4c,Clock_MM/10+0x30);//分鐘 print2(0x4d,Clock_MM%10+0x30); print(0x4e," "); if(Clock_HH > 23){ Clock_HH = 0; } } } while(key1 == 0 || key2 == 0){ } } if(MENU == 9) { if(key1 == 0 && key2 == 1) { delay_ms(200);//去抖 if(key1 == 0 && key2 == 1) { MENU = 0; while(key1 == 0 || key2 == 0){ print(0x48," "); } // 進(jìn)入菜單0正常顯示 } } if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖 if(key2 == 0 && key1 == 1){ Clock_MM ++ ; print2(0x49,Clock_HH/10+0x30);//小時(shí) print2(0x4a,Clock_HH%10+0x30); print(0x4b,":"); // 顯示cgram第一個(gè)字模":" // print2(0x4c,Clock_MM/10+0x30);//分鐘 print2(0x4d,Clock_MM%10+0x30); print(0x4e," "); if(Clock_MM > 59){ Clock_MM = 0; } } } while(key1 == 0 || key2 == 0){ } } /*調(diào)整時(shí)間日期結(jié)束***************************************************************************/ if(Clock_MM==TIME_MM && Clock_HH==TIME_HH && Clock_MM > TIME_MM-1) { print(0x49,"clock!!"); //鬧鈴1分鐘 } /*鬧鈴判斷到定時(shí)顯示clock!!*******************************************************************/ } //while(1)循環(huán)結(jié)束 } //主循環(huán)結(jié)束 /********************************************************************************************/ void tiem0(void) interrupt 1{ // T/C0中斷服務(wù)程序(產(chǎn)生50ms時(shí)基信號(hào)) cou++; // 軟計(jì)數(shù)器加1 if(cou > 19){ // 計(jì)數(shù)值到100(1s) cou = 0; // 軟計(jì)數(shù)器清零 TIME_SS++; // 秒計(jì)數(shù)器加1(進(jìn)位10ms*100=1s) if(TIME_SS > 59){ // 秒計(jì)數(shù)值到60 TIME_SS = 0; // 秒計(jì)數(shù)器清零 TIME_MM++; // 分計(jì)數(shù)器加1(進(jìn)位60s=1m) if(TIME_MM > 59){ // 分計(jì)數(shù)到60 TIME_MM = 0; // 分計(jì)數(shù)器清零 TIME_HH++; // 時(shí)計(jì)數(shù)器加1(進(jìn)位60m=1h) if(TIME_HH > 23){ // 時(shí)計(jì)數(shù)到23 TIME_HH = 0; // 時(shí)計(jì)數(shù)器清零 DAY_BIT = 1; //天增加標(biāo)志位 } } } } TH0 = 0x3c; // 重置定時(shí)常數(shù) TL0 = 0xb0; } /*********************************************************************************************/