熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2025-3-24 13:20
正文摘要:用模塊資料+豆包AI+自己修改生成的C代碼,調(diào)試OK,奉獻(xiàn)給大家 TM1650 4KEY4LED計(jì)數(shù)器(總減+移位+減1+加1)C代碼 //TM1650四按鍵四數(shù)碼管數(shù)據(jù)調(diào)整實(shí)驗(yàn)OK //功能:按TM1650四按鍵四LED數(shù)碼管模塊第二 ... |
cjtdz 發(fā)表于 2025-4-5 16:02 哦,你以為我做測(cè)試沒有實(shí)用價(jià)值,我的習(xí)慣是使用任何一個(gè)元器件或者模塊,只要有條件,就先做測(cè)試,這次對(duì)TM1650驅(qū)動(dòng)四位數(shù)碼管做的測(cè)試很有收獲,TM1650驅(qū)動(dòng)四位數(shù)碼管,3.3V的驅(qū)動(dòng)電壓顯示正常,沒有其它IC3.3V驅(qū)動(dòng)數(shù)碼管亮度不夠的情況,而且和5V驅(qū)動(dòng)的亮度基本一致,位驅(qū)動(dòng)和段驅(qū)動(dòng)畫圖的時(shí)候沒有必要一一對(duì)應(yīng),PCB里怎么順就怎么連,唯一缺點(diǎn)是八級(jí)亮度應(yīng)該夠了,最暗的一級(jí)在全黑的夜晚有些偏亮,要是再暗一半就完美了。 做測(cè)試就好好做測(cè)試,沒有必要顯示一些不必要的內(nèi)容,我在我的試驗(yàn)板上加一個(gè)18B20,肯定就可以顯示溫度,加一個(gè)時(shí)鐘IC,就可以顯示時(shí)間,這樣做有何意義?畫蛇添足,只要能顯示1到9,A到F就足夠了,足以證明我的電路沒有錯(cuò),程序沒有錯(cuò)。 ![]() 這次用TM1650驅(qū)動(dòng)四位數(shù)碼管,主要顯示RDA5807調(diào)頻收音機(jī)的頻率,電路板已經(jīng)做好,只要能顯示1到9就夠了,亮度太亮沒有影響,調(diào)完頻率之后就熄滅顯示。RDA5807調(diào)頻收音機(jī)也做過測(cè)試,可以設(shè)置任意頻率收臺(tái),這次是增加數(shù)碼管顯示頻率和手動(dòng)調(diào)臺(tái),我所有測(cè)試做完以后再設(shè)計(jì)電路,成功率相當(dāng)高,如果不做測(cè)試,萬一哪一步出了問題,從頭再來花費(fèi)的精力更大。 做好的TM1650驅(qū)動(dòng)四位數(shù)碼管的電路以后肯定還有用處,下一步我要用K型熱電偶測(cè)試一個(gè)小電爐的最高溫度,大概是兩三百度,用這個(gè)電路做測(cè)試非常合適。 |
kmsj 發(fā)表于 2025-4-4 16:33 你說的對(duì),只要段碼能顯示的,你想讓它顯示什么就可以顯示什么。我不是否定你的做法,我說的意思是:實(shí)際應(yīng)用時(shí),不是按你指定的段碼顯示的呀?比如接一個(gè)溫度傳感器,要顯示一天的溫度,它顯示的溫度數(shù)是隨機(jī)的,不是你指定的。從零下幾度到三十多度,都有可能。 |
cjtdz 發(fā)表于 2025-4-1 15:46 TM1860只要能顯示1234,7段碼基本上用完了,要顯示什么都可以,只要能顯示1234,必然可以顯示5678、90Ab、CdEF,無非就是增加段碼數(shù)組而已。 ![]() 我就做一個(gè)GIF動(dòng)畫,讓你看看除了顯示1234,還可以顯示5678、90Ab、CdEF,第一次做GIF動(dòng)畫,不知道會(huì)不會(huì)動(dòng)態(tài)顯示,估計(jì)你根本沒有用過TM1860,TM1860驅(qū)動(dòng)數(shù)碼管,是通過I2C發(fā)數(shù)據(jù)給TMM1860,只要能顯示1234,所有需要的內(nèi)容都可以顯示。 |
本帖最后由 cjtdz 于 2025-4-1 16:04 編輯 kmsj 發(fā)表于 2025-3-28 18:47 沙發(fā)那一層,只要在主程序里添加一個(gè)端口,去控制一個(gè)繼電器,就可做一個(gè)最長時(shí)間為9999秒,可以任意設(shè)定的定時(shí)器。比如:你設(shè)定為120,也就是2分鐘,當(dāng)從120遞減到0時(shí),你可以讓P0.0輸出高電平或低電平,通過電阻、三極管,驅(qū)動(dòng)繼電器,去控制什么電器的開啟與關(guān)閉。在前面做好位定義,比如:sbit kaiguan=P1^0;在主程序相應(yīng)的地方(主循環(huán)里)添加kaiguan=0;或者kaiguan=1;(根據(jù)你的硬件配置),這不一個(gè)遞減定時(shí)器不就做成了?! |
kmsj 發(fā)表于 2025-3-28 18:47 你這只能顯示1234這幾個(gè)固定數(shù)字,只能做簡單的實(shí)驗(yàn),沒有實(shí)用價(jià)值。在實(shí)際應(yīng)用中,有些是需要調(diào)整可變的。 |
![]() 前段時(shí)間畫了一個(gè)TM1650測(cè)試四位數(shù)碼管的單面板,第一次用TM1650,老老實(shí)實(shí)的按照TM1650的數(shù)據(jù)手冊(cè)畫圖,TM1650和四位數(shù)碼管之間的四個(gè)公共端管腳連接和7個(gè)段碼輸出+小數(shù)點(diǎn)輸出管腳連接,嚴(yán)格按照數(shù)據(jù)手冊(cè)提供的原理圖連接。 ![]() 一共買了四種四位數(shù)碼管,0.28寸的和0.36寸的各兩種。 ![]() 手工做的單面板可以測(cè)試兩種四位數(shù)碼管。 ![]() ![]() 按照TM1650數(shù)據(jù)手冊(cè)編程,兩種數(shù)碼管都可以正常顯示數(shù)字,只是編完程序之后才發(fā)現(xiàn),TM1650的公共端和段碼輸出小數(shù)點(diǎn)和數(shù)碼管的公共端和段碼輸出小數(shù)點(diǎn),根本沒有必要一一對(duì)應(yīng),只要公共端和段碼輸出之間不要搞錯(cuò)就可以了。 看了樓主的程序好復(fù)雜,很多看不懂,我只是顯示數(shù)字,沒有用到按鍵檢測(cè),TM1650的數(shù)據(jù)手冊(cè)在我認(rèn)知以內(nèi),我編的程序很簡單。 ![]() 后來又畫了一個(gè)TM1650驅(qū)動(dòng)四位數(shù)碼管的雙面板,用來顯示調(diào)頻收發(fā)模塊的頻率,這次畫圖,TM1650和數(shù)碼管之間,公共端和段碼小數(shù)點(diǎn)輸出之間的順序按實(shí)際畫圖,怎么順就怎么連。 ![]() 也就是TM1650與數(shù)碼管之間的驅(qū)動(dòng)連接,DIG是1接4、3接2、2接3、1接4,段碼和小數(shù)點(diǎn)是a接a、g接c、f接f、e接b……,除了a接a、f接f是對(duì)應(yīng)的,其它都是按PCB布線方便決定的連接,我相信我編程的時(shí)候只要注意公共端掃描的順序,重新編一下段碼表,正確顯示數(shù)字應(yīng)該不是問題,用豆包AI可以實(shí)現(xiàn)嗎? |
程序再添新功能。上面的TM1650頭文件和C文件不變,把模塊的第一個(gè)按鍵改成遞減開始/暫停功能 //TM1650四按鍵四數(shù)碼管數(shù)據(jù)調(diào)整實(shí)驗(yàn)2OK //功能:按TM1650四按鍵四LED數(shù)碼管模塊第二個(gè)鍵,個(gè)位閃爍,第三個(gè)鍵數(shù)值減小,第四個(gè)鍵數(shù)值增大 //按第一個(gè)按鍵時(shí),4位LED總顯示數(shù)值遞減計(jì)數(shù),再按一次,暫停。 #include<reg52.h> //#include<intrins.h> #include"tm1650.h" #define uchar unsigned char #define uint unsigned int // 新增全局變量聲明 bit flash_flag; // 閃爍標(biāo)志 uchar flash_counter; // 閃爍計(jì)時(shí)器 uchar adjust_mode = 0; // 新增調(diào)整模式狀態(tài) uchar digits[4] = {0,0,0,0}; // 新增數(shù)值存儲(chǔ)數(shù)組 uint combined_value; // 4位LED顯示總數(shù)值 bit counting_down = 0; // 倒計(jì)時(shí)標(biāo)志 bit pause_flag = 0; // 暫停標(biāo)志 // 顯示編碼表(帶小數(shù)點(diǎn)控制位) uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 聲明 Scan_Key 函數(shù) uchar Scan_Key(); // 定時(shí)器0初始化(原代碼功能不變) void Timer0_Init() { TMOD |= 0x01; // 模式1 TL0 = 0x18; // 1ms定時(shí) TH0 = 0xFC; ET0 = 1; // 中斷使能 TR0 = 1; EA = 1; } // 顯示更新函數(shù)(優(yōu)化小數(shù)點(diǎn)處理) void Update_Display() { uchar seg_data; // 千位(地址0x68) seg_data = (adjust_mode==4 && flash_flag) ? 0x00 : CODE[digits[0]]; TM1650_Set(0x68, seg_data | (adjust_mode==4 ? 0x80 : 0x00)); // 百位(地址0x6A) seg_data = (adjust_mode==3 && flash_flag) ? 0x00 : CODE[digits[1]]; TM1650_Set(0x6A, seg_data | (adjust_mode==3 ? 0x80 : 0x00)); // 十位(地址0x6C) seg_data = (adjust_mode==2 && flash_flag) ? 0x00 : CODE[digits[2]]; TM1650_Set(0x6C, seg_data | (adjust_mode==2 ? 0x80 : 0x00)); // 個(gè)位(地址0x6E) seg_data = (adjust_mode==1 && flash_flag) ? 0x00 : CODE[digits[3]]; TM1650_Set(0x6E, seg_data | (adjust_mode==1 ? 0x80 : 0x00)); // 計(jì)算總數(shù)值 combined_value = digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3]; } // 定時(shí)器0中斷服務(wù)(原代碼功能不變) void Timer0_ISR() interrupt 1 { static uint counter = 0; TH0 = 0xFC; // 重裝初值 TL0 = 0x18; if(++counter >= 500) { // 500ms周期 flash_flag = !flash_flag; counter = 0; } } // 定時(shí)器1初始化 void Timer1_Init() { TMOD |= 0x10; // 定時(shí)器1,模式1 TH1 = 0xFC; // 1ms定時(shí) TL1 = 0x18; ET1 = 1; // 定時(shí)器1中斷使能 TR1 = 0; // 先不啟動(dòng)定時(shí)器1 EA = 1; } // 定時(shí)器1中斷服務(wù) void Timer1_ISR() interrupt 3 { static uint counter = 0; TH1 = 0xFC; // 重裝初值 TL1 = 0x18; if (++counter >= 1000) { // 1000ms = 1s counter = 0; if (counting_down &&!pause_flag && combined_value > 0) { combined_value--; // 將總數(shù)值拆分為各個(gè)數(shù)位 digits[0] = combined_value / 1000; digits[1] = (combined_value / 100) % 10; digits[2] = (combined_value / 10) % 10; digits[3] = combined_value % 10; Update_Display(); } } } // 按鍵處理(增加邊界保護(hù)) void Process_Key(uchar key) { static uchar last_key = 0; if(key == last_key) return; // 模式切換鍵處理 if(key == 0x54) // 0x54是TM1650的按鍵代碼之一 { adjust_mode = (adjust_mode < 4) ? adjust_mode+1 : 0; flash_flag = 0; // 強(qiáng)制顯示穩(wěn)定 } if(key == 0x5c) // 0x5c是TM1650的按鍵代碼之一 { if(combined_value > 0) { if (!counting_down) { counting_down = 1; // 開始倒計(jì)時(shí) TR1 = 1; // 啟動(dòng)定時(shí)器1 pause_flag = 0; // 開始時(shí)不暫停 } else { pause_flag =!pause_flag; // 切換暫停狀態(tài) } } } // 數(shù)值調(diào)整(帶范圍限制) if(adjust_mode > 0) { uchar *p = &digits[4 - adjust_mode]; if(key == 0x4C) *p = (*p - 1 + 10) % 10; // 循環(huán)減,0x4c是TM1650的按鍵代碼之一 if(key == 0x44) *p = (*p + 1) % 10; // 循環(huán)加,0x44是TM1650的按鍵代碼之一 } last_key = key; } // 主函數(shù)(修正初始化邏輯) void main() { Timer0_Init(); Timer1_Init(); TM1650_Set(0x48, 0x51); // 顯示控制:5級(jí)亮度 Update_Display(); // 初始化顯示 while(1) { Process_Key(Scan_Key()); Update_Display(); } } |
參與人數(shù) 1 | 黑幣 +40 | 收起 理由 |
---|---|---|
![]() | + 40 | 共享資料的黑幣獎(jiǎng)勵(lì)! |
Powered by 單片機(jī)教程網(wǎng)