![]() |
發布時間: 2024-4-9 13:03
正文摘要:如何加一個12小時轉換24小時的功能嗎,實在是弄不出來了。我的思路是加一個按鍵判斷,13點~24對應1~12,通過按鍵實現切換。下面有源代碼和仿真圖,求一個大佬幫忙修改指導一下萬分感謝。 |
在底板修改的顯示函數的基礎上,添加了按鍵切換顯示,按 加 + 鍵切換顯示 |
162.63 KB, 下載次數: 4
wuqing12345 發表于 2024-4-11 13:30 lcd.h 609行 i = *point & 0xff; 改為 i = *point & 0x0f; |
chxelc 發表于 2024-4-11 10:00 感謝大佬,可以正常顯示了。但是發現了幾個小問題不知道什么原因。一鍵切換12/24小時是在12點的時候無法切換成00點不知道哪里寫的不完善,還有一個問題是在設置時間時在設置”分“的時候會出現模糊的情況特別是有兩位數的時候。麻煩大佬幫忙指導修改一下萬分感謝. |
chxelc 發表于 2024-4-11 10:00 感謝大佬,可以正常顯示了。但是發現了幾個小問題不知道什么原因。一鍵切換12/24小時是在12點的時候無法切換成00點不知道哪里寫的不完善,還有一個問題是在設置時間時在設置”分“的時候會出現模糊的情況特別是有兩位數的時候。麻煩大佬幫忙指導修改一下萬分感謝. |
chxelc 發表于 2024-4-11 10:00 感謝大佬,可以正常顯示了。但是發現了幾個小問題不知道什么原因。一鍵切換12/24小時是在12點的時候無法切換成00點不知道哪里寫的不完善,還有一個問題是在設置時間時在設置”分“的時候會出現模糊的情況特別是有兩位數的時候。麻煩大佬幫忙指導修改一下萬分感謝. |
chxelc 發表于 2024-4-11 10:00 感謝大佬,可以正常顯示了。但是發現了幾個小問題不知道什么原因。一鍵切換12/24小時是在12點的時候無法切換成00點不知道哪里寫的不完善,還有一個問題是在設置時間時在設置”分“的時候會出現模糊的情況特別是有兩位數的時候。麻煩大佬幫忙指導修改一下萬分感謝. |
大佬現在功能實現了,但是用的屏幕是LGN12641BSIR的想換成12864的可以幫忙看一看嗎,我換了屏幕顯示的文字不對 |
這是功能實現了但是更換12864顯示不正確,求各位大佬幫忙看一看 |
191.86 KB, 下載次數: 0
chxelc 發表于 2024-4-10 11:41 大佬現在功能實現了,但是用的屏幕是LGN12641BSIR的想換成12864的可以幫忙看一看嗎,我換了屏幕顯示的文字不對 |
以往十幾年一直在玩STC各型單片機,最近很長一段時間一直在玩STC新型單片機的新功能,測試了STC8H4K64TL單片機的I2C、RTC、觸摸按鍵功能,也測試了STC32G的LCM_DMA應用(16BIT并口驅動SSD1963屏),上述的學習過程中曾多次在此請教問題,每次求問都得到了相應的指點、在此再表謝意!為了回饋各位的幫助發帖分享編程新手的關于STC8H單片機觸摸按鍵的應用心得,也希望能幫到與我一樣的菜鳥朋友。 以上是閑話 ------✄-------------------------------------✄--------------- 以下是正文 STC8H的觸摸按鍵的基本功能通過官網例程加持是很容易實現的,只要配置好觸摸按鍵的相關寄存器、根據按鍵觸摸狀態與非觸摸狀態的鍵值變化是很容易實現觸摸按鍵的開/關功能的,以下實驗使用的是STC8H4K64TL-20pin芯片,通過I/0模擬3線SPI總線控制一塊ILI9481-480*320*3.5"TFT屏,用到了P1.1、P1.6、P5.4三個觸摸按鍵端口。 因為我是在實驗板自身顯示單元的屏幕上實時顯示測試結果的,如果你的實驗板有顯示單元可以通過自己的顯示函數實現測試結果的顯示,如果沒有掛載顯示單元的話請開啟單片機的串口通訊功能通過stc-isp軟件的串口助手窗口來實現監測。 注釋:下述貼出的代碼是在我的工程中摘錄的片段,因為涉及公共變量的聲明問題只能配合解讀、不保證編譯能夠通過。 一、STC8H單片機觸摸按鍵的基礎代碼 1.配置按鍵寄存器:(觸摸按鍵初始化函數,請在主循環前聲明此函數) void key_init() { TSRT = 0x00; //沒有LED分時掃描 TSCHEN1 |= 0x46; //使能TK6-P1.6、TK2-P5.4、TK1-P1.1三個按鍵 TSCFG1 = (7<<4) + 7; //開關電容放電時間(系統時鐘周期數7500) TSCFG2 = 1; //配置觸摸按鍵控制器的內部參考電壓AVCC的分壓比為1/2 TSCTRL = 0x80; //啟動觸摸按鍵控制、使用內部32K時鐘 TK_ON(); //使能觸摸按鍵中斷(IE2 |=(1<<7)) EA=1; //開啟所有中斷使能 } 上述寄存器配置請詳情還請閱讀數據手冊的23.5.1-23.5.8章節。 2.按鍵掃描函數(中斷函數): void key_int() interrupt 35//keil2編譯環境以根據STC數據手冊給出的方案通過第三方軟件擴展了中斷號 { u8 j; j = TSSTA2; if(j & 0x40) TSSTA2 |= 0x40; //數據溢出,寫1將TSIF清零 if(j & 0x80) { TSSTA2 |= 0x80; //掃描完成寫1將TSIF清零 TKn=j&0x0f; //----鍵值存儲-------------------------------------- switch(TKn) { case 0x01: tk[1] = TSDAT; break; //1通道鍵值 case 0x02: tk[2] = TSDAT; break; //2通道鍵值 case 0x06: tk[0] = TSDAT; break; //6通道鍵值 } //----以下是按鍵狀態判斷----------------------------- if((TKn==6)&&(tk[0]>value_H))//N1非觸摸狀態 { N1=1; } if((TKn==6)&&(tk[0]<value_L)) //N1觸摸狀態 { N1=0; } if((TKn==2)&&(tk[2]>value_H)) //N2非觸摸狀態 { N2=1; } if((TKn==2)&&(tk[2]<value_L)) //N2觸摸狀態 { N2=0; } if((TKn==1)&&(tk[1]>value_H)) //N3非觸摸狀態 { N3=1; } if((TKn==1)&&(tk[1]<value_L)) //N3觸摸狀態 { N3=0; } } } 中斷函數里的兩個參數value_H、value_L是兩個數據,為了獲得這兩個數據我又編寫了兩個函數如下: (1)、4位十六進制數據變換、顯示函數void display_num(u16 x, u16 y, u16 num); 此函數是針對自己的字模庫量身編寫的,沒有參考價值就不貼代碼了!!! (2)、觸摸鍵值顯示函數 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]); } 程序運行后,可以實時顯示三個按鍵的十六進制即時數據,根據對數據的觀察可以得到沒有觸摸時鍵值和觸摸后的鍵值,再根據顯示值設定一個較小的非觸摸鍵值value_H和一個較大的觸摸鍵值value_L并宏定義好就可以繼續玩耍了,因為只是簡單驗證,至于實際工程應用標準編程的零點值存儲、零點值跟蹤、門檻值配置這些我沒深入研究就不做討論了,如果需要的話請詳細閱讀數據手冊。 二、按鍵功能的實現方法 1.單獨按鍵實現開/關功能: 上述給出的按鍵初始化和中斷這兩個函數就可以實現觸摸按鍵的基本功能,對于單個按鍵(例如TK6按鍵)控制一個(P3.4口)LED燈的點亮與熄滅的控制而言可以簡化一下中斷函數即可實現 void key_int() interrupt 35 { u8 j; j = TSSTA2; if(j & 0x40) TSSTA2 |= 0x40; //數據溢出,寫1將TSIF清零 if(j & 0x80) { TSSTA2 |= 0x80; //掃描完成寫1將TSIF清零 TKn=j&0x0f; if((TKn==6)&&(TSDAT<value_L)) //觸摸狀態 { P34=~P34; //請在主循環前初始化此端口P34=1,低電平點亮LED } } } 中斷函數修改完成后,主函數的主循環空運行的狀態下,觸摸按鍵就可以看到控制效果。 2、按鍵加減操作的實現: 觸摸按鍵的加減操作可以參考常用的單片機獨立按鍵(機械按鍵)代碼來實現,觸摸按鍵實現這個功能的話可以使用前述未修改的中斷函數,下面是利用N1按鍵實現的代碼 void Choice_set() { if(N1==0) { rr++; if(rr>9)//用于屏幕上一位數據的顯示 rr=0; } while(!N1); } 只要在主循環中調用這函數就能實現數據的加操作,如果主循環中同時添加字符顯示函數就可以看到數據的變化每次觸摸按鍵時數據不變離開手后數據增加1。 到此,STC8H觸摸按鍵這點兒經驗就分享完成了,由于經驗淺薄有興趣的新手可以看看、高手就直接繞行好了,其實即使新手也會發現這種通過死循環來判斷按鍵釋放的方法是不靠譜的,函數void Choice_set()這樣的按鍵編程雖然可以實現操作功能,但也只能用于演示、在此也只能作為拋磚引玉了,我也在此真心向高手求救關于觸摸按鍵加減操作的靠譜的實現方法,也希望有興趣的朋友能夠交流經驗完善功能。 |
加個按鈕,程序中加個bit變量記錄按下狀態,按下按鈕的時候翻轉變量狀態。根據變量的狀態選擇執行我修改的函數的12小時還是24小時。這些自己動手對你有好處的。看了下你發的程序,是個高手寫的,多學習一下。 |
師傅的意思說的是切換到”時“的時候可以一鍵切換成12或者24小時,不知道可以外加一個按鍵然后一按就可以直接轉換。就像13點一按就切換成1點。 |
我修改了這個函數,仿真可以實現。 |
不需要轉換,時間都按12小時處理,只是顯示時可以選擇12或24小時顯示。 |
程序中既然用了DS1302,它本身就具備這個功能,根據需要修改寄存器即可,然后根據模式顯示相應的信息。 |