找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2720|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)多功能萬年歷設(shè)計(jì)如何加一個(gè)12小時(shí)轉(zhuǎn)換24小時(shí)的功能?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
200黑幣
如何加一個(gè)12小時(shí)轉(zhuǎn)換24小時(shí)的功能嗎,實(shí)在是弄不出來了。我的思路是加一個(gè)按鍵判斷,13點(diǎn)~24對(duì)應(yīng)1~12,通過按鍵實(shí)現(xiàn)切換。下面有源代碼和仿真圖,求一個(gè)大佬幫忙修改指導(dǎo)一下萬分感謝。

萬年歷.rar

151.96 KB, 下載次數(shù): 11

最佳答案

查看完整內(nèi)容

改好了,我的仿真是8.10版本的,打不開就在P3.3畫一個(gè)按鈕到地。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來自 2#
ID:140489 發(fā)表于 2024-4-10 15:47 | 只看該作者
在底板修改的顯示函數(shù)的基礎(chǔ)上,添加了按鍵切換顯示,按 加 + 鍵切換顯示

51黑論壇_萬年歷.zip

162.63 KB, 下載次數(shù): 4

回復(fù)

使用道具 舉報(bào)

板凳
ID:712097 發(fā)表于 2024-4-9 13:03 | 只看該作者
改好了,我的仿真是8.10版本的,打不開就在P3.3畫一個(gè)按鈕到地。

萬年歷.rar

158.42 KB, 下載次數(shù): 5

回復(fù)

使用道具 舉報(bào)

地板
ID:1080935 發(fā)表于 2024-4-9 16:21 | 只看該作者
程序中既然用了DS1302,它本身就具備這個(gè)功能,根據(jù)需要修改寄存器即可,然后根據(jù)模式顯示相應(yīng)的信息。
回復(fù)

使用道具 舉報(bào)

5#
ID:1034262 發(fā)表于 2024-4-9 17:38 | 只看該作者
不需要轉(zhuǎn)換,時(shí)間都按12小時(shí)處理,只是顯示時(shí)可以選擇12或24小時(shí)顯示。
回復(fù)

使用道具 舉報(bào)

6#
ID:712097 發(fā)表于 2024-4-9 19:11 | 只看該作者
  1. void Lcd_Time(uchar * clock_time )
  2. {
  3.         uchar i=0,j=0,k=0;
  4.         //顯示   "hour時(shí)min分sec秒"                                            
  5.            i= * clock_time >> 4;
  6. //        i= g_time_buf[0] >> 4;
  7.         Lcd_Character_16X8( 1, 2, 80, letter_logo[i]);    //顯示   sec的高位
  8.            i= * clock_time & 0x0f;
  9. //        i= g_time_buf[0] & 0x0f;
  10.         Lcd_Character_16X8( 1, 2, 88, letter_logo[i]);    //顯示   sec的低位
  11.         Lcd_Character_16X16( 1, 2, 96 , time_logo[2]);  //顯示   秒

  12.    clock_time ++;
  13.    i= *  clock_time >> 4;
  14. //        i= g_time_buf[1] >> 4;
  15.    Lcd_Character_16X8( 1, 2, 48, letter_logo[i]);    //顯示   min的高位
  16.    i= * clock_time & 0x0f;
  17. //        i= g_time_buf[1] >> 4;
  18.    Lcd_Character_16X8( 1, 2, 56, letter_logo[i]);   //顯示   min的低位
  19.    Lcd_Character_16X16( 1, 2, 64 , time_logo[1]);  //顯示   分

  20.    clock_time ++;
  21.    i= * clock_time >> 4;
  22.    j= * clock_time & 0x0f;
  23.    k=i*10+j;
  24.    if(k>12)k=k-12;
  25.    if(k==0)k=12;
  26.         i=k/10;
  27.    Lcd_Character_16X8( 1, 2, 16 , letter_logo[i]);    //顯示   hour的高位
  28.    //i= * clock_time & 0x0f;
  29.    i=k%10;
  30.    Lcd_Character_16X8( 1, 2, 24 , letter_logo[i]);    //顯示   hour的低位
  31.        
  32.    Lcd_Character_16X16( 1, 2, 32 , time_logo[0]);  //顯示   ”時(shí)“      
  33. }
復(fù)制代碼

我修改了這個(gè)函數(shù),仿真可以實(shí)現(xiàn)。
回復(fù)

使用道具 舉報(bào)

7#
ID:1115386 發(fā)表于 2024-4-9 23:29 | 只看該作者
師傅的意思說的是切換到”時(shí)“的時(shí)候可以一鍵切換成12或者24小時(shí),不知道可以外加一個(gè)按鍵然后一按就可以直接轉(zhuǎn)換。就像13點(diǎn)一按就切換成1點(diǎn)。
回復(fù)

使用道具 舉報(bào)

8#
ID:712097 發(fā)表于 2024-4-10 11:09 | 只看該作者
加個(gè)按鈕,程序中加個(gè)bit變量記錄按下狀態(tài),按下按鈕的時(shí)候翻轉(zhuǎn)變量狀態(tài)。根據(jù)變量的狀態(tài)選擇執(zhí)行我修改的函數(shù)的12小時(shí)還是24小時(shí)。這些自己動(dòng)手對(duì)你有好處的?戳讼履惆l(fā)的程序,是個(gè)高手寫的,多學(xué)習(xí)一下。
回復(fù)

使用道具 舉報(bào)

9#
ID:961114 發(fā)表于 2024-4-10 16:26 | 只看該作者
以往十幾年一直在玩STC各型單片機(jī),最近很長一段時(shí)間一直在玩STC新型單片機(jī)的新功能,測(cè)試了STC8H4K64TL單片機(jī)的I2C、RTC、觸摸按鍵功能,也測(cè)試了STC32G的LCM_DMA應(yīng)用(16BIT并口驅(qū)動(dòng)SSD1963屏),上述的學(xué)習(xí)過程中曾多次在此請(qǐng)教問題,每次求問都得到了相應(yīng)的指點(diǎn)、在此再表謝意!為了回饋各位的幫助發(fā)帖分享編程新手的關(guān)于STC8H單片機(jī)觸摸按鍵的應(yīng)用心得,也希望能幫到與我一樣的菜鳥朋友。  以上是閑話 ------✄-------------------------------------✄--------------- 以下是正文  STC8H的觸摸按鍵的基本功能通過官網(wǎng)例程加持是很容易實(shí)現(xiàn)的,只要配置好觸摸按鍵的相關(guān)寄存器、根據(jù)按鍵觸摸狀態(tài)與非觸摸狀態(tài)的鍵值變化是很容易實(shí)現(xiàn)觸摸按鍵的開/關(guān)功能的,以下實(shí)驗(yàn)使用的是STC8H4K64TL-20pin芯片,通過I/0模擬3線SPI總線控制一塊ILI9481-480*320*3.5"TFT屏,用到了P1.1、P1.6、P5.4三個(gè)觸摸按鍵端口。 因?yàn)槲沂窃趯?shí)驗(yàn)板自身顯示單元的屏幕上實(shí)時(shí)顯示測(cè)試結(jié)果的,如果你的實(shí)驗(yàn)板有顯示單元可以通過自己的顯示函數(shù)實(shí)現(xiàn)測(cè)試結(jié)果的顯示,如果沒有掛載顯示單元的話請(qǐng)開啟單片機(jī)的串口通訊功能通過stc-isp軟件的串口助手窗口來實(shí)現(xiàn)監(jiān)測(cè)。 注釋:下述貼出的代碼是在我的工程中摘錄的片段,因?yàn)樯婕肮沧兞康穆暶鲉栴}只能配合解讀、不保證編譯能夠通過。 一、STC8H單片機(jī)觸摸按鍵的基礎(chǔ)代碼 1.配置按鍵寄存器:(觸摸按鍵初始化函數(shù),請(qǐng)?jiān)谥餮h(huán)前聲明此函數(shù)) void key_init()   {     TSRT = 0x00;   //沒有LED分時(shí)掃描     TSCHEN1 |= 0x46;  //使能TK6-P1.6、TK2-P5.4、TK1-P1.1三個(gè)按鍵     TSCFG1  = (7<<4) + 7; //開關(guān)電容放電時(shí)間(系統(tǒng)時(shí)鐘周期數(shù)7500)     TSCFG2  = 1;   //配置觸摸按鍵控制器的內(nèi)部參考電壓AVCC的分壓比為1/2     TSCTRL = 0x80;   //啟動(dòng)觸摸按鍵控制、使用內(nèi)部32K時(shí)鐘     TK_ON();     //使能觸摸按鍵中斷(IE2 |=(1<<7))     EA=1;     //開啟所有中斷使能 } 上述寄存器配置請(qǐng)?jiān)斍檫請(qǐng)閱讀數(shù)據(jù)手冊(cè)的23.5.1-23.5.8章節(jié)。 2.按鍵掃描函數(shù)(中斷函數(shù)): void key_int()  interrupt 35//keil2編譯環(huán)境以根據(jù)STC數(shù)據(jù)手冊(cè)給出的方案通過第三方軟件擴(kuò)展了中斷號(hào) {     u8 j;     j = TSSTA2;     if(j & 0x40)         TSSTA2 |= 0x40; //數(shù)據(jù)溢出,寫1將TSIF清零     if(j & 0x80)     {         TSSTA2 |= 0x80; //掃描完成寫1將TSIF清零         TKn=j&0x0f; //----鍵值存儲(chǔ)--------------------------------------         switch(TKn)         {         case 0x01:             tk[1] = TSDAT;             break;  //1通道鍵值         case 0x02:             tk[2] = TSDAT;             break;  //2通道鍵值         case 0x06:             tk[0] = TSDAT;             break;  //6通道鍵值         } //----以下是按鍵狀態(tài)判斷-----------------------------         if((TKn==6)&&(tk[0]>value_H))//N1非觸摸狀態(tài)         {             N1=1;                  }         if((TKn==6)&&(tk[0]<value_L)) //N1觸摸狀態(tài)         {             N1=0;         }         if((TKn==2)&&(tk[2]>value_H)) //N2非觸摸狀態(tài)         {             N2=1;         }         if((TKn==2)&&(tk[2]<value_L)) //N2觸摸狀態(tài)         {             N2=0;         }         if((TKn==1)&&(tk[1]>value_H)) //N3非觸摸狀態(tài)         {             N3=1;         }         if((TKn==1)&&(tk[1]<value_L)) //N3觸摸狀態(tài)         {             N3=0;         }     } } 中斷函數(shù)里的兩個(gè)參數(shù)value_H、value_L是兩個(gè)數(shù)據(jù),為了獲得這兩個(gè)數(shù)據(jù)我又編寫了兩個(gè)函數(shù)如下: (1)、4位十六進(jìn)制數(shù)據(jù)變換、顯示函數(shù)void display_num(u16 x, u16 y, u16 num); 此函數(shù)是針對(duì)自己的字模庫量身編寫的,沒有參考價(jià)值就不貼代碼了!! (2)、觸摸鍵值顯示函數(shù) void display_value() {     if(TKn==0)     {         tk[0] = TSDAT;   //0通道鍵值     }     if(TKn==1)     {         tk[1] = TSDAT;   //1通道鍵值     }     if(TKn==2)     {         tk[2] = TSDAT;   //2通道鍵值     }     display_num(0, 250, tk[0]);     display_num(150, 250, tk[2]);     display_num(300, 250, tk[1]); } 程序運(yùn)行后,可以實(shí)時(shí)顯示三個(gè)按鍵的十六進(jìn)制即時(shí)數(shù)據(jù),根據(jù)對(duì)數(shù)據(jù)的觀察可以得到?jīng)]有觸摸時(shí)鍵值和觸摸后的鍵值,再根據(jù)顯示值設(shè)定一個(gè)較小的非觸摸鍵值value_H和一個(gè)較大的觸摸鍵值value_L并宏定義好就可以繼續(xù)玩耍了,因?yàn)橹皇呛唵悟?yàn)證,至于實(shí)際工程應(yīng)用標(biāo)準(zhǔn)編程的零點(diǎn)值存儲(chǔ)、零點(diǎn)值跟蹤、門檻值配置這些我沒深入研究就不做討論了,如果需要的話請(qǐng)?jiān)敿?xì)閱讀數(shù)據(jù)手冊(cè)。 二、按鍵功能的實(shí)現(xiàn)方法 1.單獨(dú)按鍵實(shí)現(xiàn)開/關(guān)功能: 上述給出的按鍵初始化和中斷這兩個(gè)函數(shù)就可以實(shí)現(xiàn)觸摸按鍵的基本功能,對(duì)于單個(gè)按鍵(例如TK6按鍵)控制一個(gè)(P3.4口)LED燈的點(diǎn)亮與熄滅的控制而言可以簡化一下中斷函數(shù)即可實(shí)現(xiàn) void key_int()  interrupt 35 {     u8 j;     j = TSSTA2;     if(j & 0x40)         TSSTA2 |= 0x40; //數(shù)據(jù)溢出,寫1將TSIF清零     if(j & 0x80)     {         TSSTA2 |= 0x80; //掃描完成寫1將TSIF清零         TKn=j&0x0f;          if((TKn==6)&&(TSDAT<value_L)) //觸摸狀態(tài)         {             P34=~P34; //請(qǐng)?jiān)谥餮h(huán)前初始化此端口P34=1,低電平點(diǎn)亮LED         }     } }  中斷函數(shù)修改完成后,主函數(shù)的主循環(huán)空運(yùn)行的狀態(tài)下,觸摸按鍵就可以看到控制效果。 2、按鍵加減操作的實(shí)現(xiàn): 觸摸按鍵的加減操作可以參考常用的單片機(jī)獨(dú)立按鍵(機(jī)械按鍵)代碼來實(shí)現(xiàn),觸摸按鍵實(shí)現(xiàn)這個(gè)功能的話可以使用前述未修改的中斷函數(shù),下面是利用N1按鍵實(shí)現(xiàn)的代碼 void Choice_set() {     if(N1==0)     {         rr++;        if(rr>9)//用于屏幕上一位數(shù)據(jù)的顯示        rr=0;      } while(!N1); } 只要在主循環(huán)中調(diào)用這函數(shù)就能實(shí)現(xiàn)數(shù)據(jù)的加操作,如果主循環(huán)中同時(shí)添加字符顯示函數(shù)就可以看到數(shù)據(jù)的變化每次觸摸按鍵時(shí)數(shù)據(jù)不變離開手后數(shù)據(jù)增加1。  到此,STC8H觸摸按鍵這點(diǎn)兒經(jīng)驗(yàn)就分享完成了,由于經(jīng)驗(yàn)淺薄有興趣的新手可以看看、高手就直接繞行好了,其實(shí)即使新手也會(huì)發(fā)現(xiàn)這種通過死循環(huán)來判斷按鍵釋放的方法是不靠譜的,函數(shù)void Choice_set()這樣的按鍵編程雖然可以實(shí)現(xiàn)操作功能,但也只能用于演示、在此也只能作為拋磚引玉了,我也在此真心向高手求救關(guān)于觸摸按鍵加減操作的靠譜的實(shí)現(xiàn)方法,也希望有興趣的朋友能夠交流經(jīng)驗(yàn)完善功能。
回復(fù)

使用道具 舉報(bào)

10#
ID:1115386 發(fā)表于 2024-4-10 18:02 | 只看該作者
chxelc 發(fā)表于 2024-4-10 11:41
改好了,我的仿真是8.10版本的,打不開就在P3.3畫一個(gè)按鈕到地。

大佬現(xiàn)在功能實(shí)現(xiàn)了,但是用的屏幕是LGN12641BSIR的想換成12864的可以幫忙看一看嗎,我換了屏幕顯示的文字不對(duì)
回復(fù)

使用道具 舉報(bào)

11#
ID:1115386 發(fā)表于 2024-4-10 18:06 | 只看該作者
這是功能實(shí)現(xiàn)了但是更換12864顯示不正確,求各位大佬幫忙看一看

萬年歷.rar

191.86 KB, 下載次數(shù): 0

回復(fù)

使用道具 舉報(bào)

12#
ID:1115386 發(fā)表于 2024-4-10 19:40 | 只看該作者
大佬現(xiàn)在功能實(shí)現(xiàn)了,但是用的屏幕是LGN12641BSIR的想換成12864的可以幫忙看一看嗎,我換了屏幕顯示的文字不對(duì)
回復(fù)

使用道具 舉報(bào)

13#
ID:712097 發(fā)表于 2024-4-11 10:00 | 只看該作者
是不是屏幕左右兩邊換位置了?解壓后替換lcd.h試試

lcd.rar

4.43 KB, 下載次數(shù): 2

回復(fù)

使用道具 舉報(bào)

14#
ID:1115386 發(fā)表于 2024-4-11 12:57 | 只看該作者
chxelc 發(fā)表于 2024-4-11 10:00
是不是屏幕左右兩邊換位置了?解壓后替換lcd.h試試

感謝大佬,可以正常顯示了。但是發(fā)現(xiàn)了幾個(gè)小問題不知道什么原因。一鍵切換12/24小時(shí)是在12點(diǎn)的時(shí)候無法切換成00點(diǎn)不知道哪里寫的不完善,還有一個(gè)問題是在設(shè)置時(shí)間時(shí)在設(shè)置”分“的時(shí)候會(huì)出現(xiàn)模糊的情況特別是有兩位數(shù)的時(shí)候。麻煩大佬幫忙指導(dǎo)修改一下萬分感謝.
回復(fù)

使用道具 舉報(bào)

15#
ID:1115386 發(fā)表于 2024-4-11 13:15 | 只看該作者
chxelc 發(fā)表于 2024-4-11 10:00
是不是屏幕左右兩邊換位置了?解壓后替換lcd.h試試

感謝大佬,可以正常顯示了。但是發(fā)現(xiàn)了幾個(gè)小問題不知道什么原因。一鍵切換12/24小時(shí)是在12點(diǎn)的時(shí)候無法切換成00點(diǎn)不知道哪里寫的不完善,還有一個(gè)問題是在設(shè)置時(shí)間時(shí)在設(shè)置”分“的時(shí)候會(huì)出現(xiàn)模糊的情況特別是有兩位數(shù)的時(shí)候。麻煩大佬幫忙指導(dǎo)修改一下萬分感謝.
回復(fù)

使用道具 舉報(bào)

16#
ID:1115386 發(fā)表于 2024-4-11 13:30 | 只看該作者
chxelc 發(fā)表于 2024-4-11 10:00
是不是屏幕左右兩邊換位置了?解壓后替換lcd.h試試

大佬這是我更換12864顯示后的源文件,還有出現(xiàn)問題的圖片麻煩您幫我看一看問題出在了什么地方

1111.jpg (630.2 KB, 下載次數(shù): 66)

1111.jpg

萬年歷.zip

242.39 KB, 下載次數(shù): 1

回復(fù)

使用道具 舉報(bào)

17#
ID:1115386 發(fā)表于 2024-4-11 16:21 | 只看該作者
chxelc 發(fā)表于 2024-4-11 10:00
是不是屏幕左右兩邊換位置了?解壓筇婊籰cd.h試試

感謝大佬,可以正常顯示了。但是發(fā)現(xiàn)了幾個(gè)小問題不知道什么原因。一鍵切換12/24小時(shí)是在12點(diǎn)的時(shí)候無法切換成00點(diǎn)不知道哪里寫的不完善,還有一個(gè)問題是在設(shè)置時(shí)間時(shí)在設(shè)置”分“的時(shí)候會(huì)出現(xiàn)模糊的情況特別是有兩位數(shù)的時(shí)候。麻煩大佬幫忙指導(dǎo)修改一下萬分感謝.
回復(fù)

使用道具 舉報(bào)

18#
ID:1115386 發(fā)表于 2024-4-11 16:30 | 只看該作者
chxelc 發(fā)表于 2024-4-11 10:00
是不是屏幕左右兩邊換位置了?解壓后替換lcd.h試試

感謝大佬,可以正常顯示了。但是發(fā)現(xiàn)了幾個(gè)小問題不知道什么原因。一鍵切換12/24小時(shí)是在12點(diǎn)的時(shí)候無法切換成00點(diǎn)不知道哪里寫的不完善,還有一個(gè)問題是在設(shè)置時(shí)間時(shí)在設(shè)置”分“的時(shí)候會(huì)出現(xiàn)模糊的情況特別是有兩位數(shù)的時(shí)候。麻煩大佬幫忙指導(dǎo)修改一下萬分感謝.
回復(fù)

使用道具 舉報(bào)

19#
ID:712097 發(fā)表于 2024-4-12 16:27 | 只看該作者
wuqing12345 發(fā)表于 2024-4-11 13:30
大佬這是我更換12864顯示后的源文件,還有出現(xiàn)問題的圖片麻煩您幫我看一看問題出在了什么地方

lcd.h
609行
i = *point & 0xff;
改為
i = *point & 0x0f;
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表