![]() |
發布時間: 2022-11-8 11:28
正文摘要:共陽數碼管顯示:com1 com2 com3顯示數字正常,但com4位選控制的這六個燈,前三個為單位顯示,后三個為電量顯示,單位或電量顯示時,正常是不需要亮的燈是不亮,但是不亮時會微微發亮?我也明白 ... |
一年過去了,問題解決了沒有啊? |
有沒有可能有LED反向輕微漏電導致其它LED微亮? |
我也是初學者,學了一年左右,據對消隱的理解看似乎是程序消隱問題: 1、程序是反復掃描來改變狀態的,所以位碼沒有消隱會是最后一次掃描的狀態; 2、我看程序是,swtich后,第4位狀態最后一次開啟后關沒有關閉; 3、下一個循環送段時,第四位閃亮狀態,在送完段碼后的一瞬間,第四位是亮的,然后第一位碼送到,才同時就相當于關閉第四位,瞬間點亮的余輝形成微亮,典型的第4位沒有消隱的處理; 4、26樓的程序是正確的,所以仿真沒有問題,如果樓主的仿真也沒有問題的話,是軟件仿真與實際的差異問題; 5、我個人認為正確的消隱是:如果先送段碼則前先作位消隱,如果先送位碼,則先作段碼消隱,所以14樓程序也是正確的;交換送顯示數據的順序,消隱的對象是不同的,我初學的程序不懂,就在送顯示數據前,所有的狀態恢復到最初的狀態,慢慢看別人的程序,再看書后,理解才清晰點; ——不知道說清楚沒有,因為知識很多是從51Hei學到的,所以回復特有耐性,與其他學習者共勉。 |
所謂的消隱沒有做好:因為位碼最后一次在掃描第4位在開啟的狀態并沒有改變,而段碼是下一次送數據時變成顯示了,所有消隱最好將所有的段碼與位碼狀態恢復才行! |
Y_G_G 發表于 2022-11-10 00:16 是哪,還沒搞定,請大師指點呀!今天發現是com4的哪路不對(單位和電量顯示燈都會隨顯示數字的變化微亮),com1 com2 com3顯示數字沒有這種現像。也就是說com4控制的這路好像沒有消隱。 |
wulin 發表于 2022-11-9 21:34 wulin老師,今天發現是com4的哪路不對(單位和電量顯示燈都會隨顯示數字的變化微亮),com1 com2 com3顯示數字沒有這種現像。也就是說com4控制的這路好像沒有消隱。 |
幾天都沒有搞定? 這只是一個數碼管而已呀 在每次顯示之前,先消隱 duan = 0x00; wei = 0x00; delay_us(10);//自己寫一個uS延時程序 這個放在 Display()里面,最先執行,然后再執行其它的顯示 如果還不行,那就是你程序的其它問題 |
zhth1979 發表于 2022-11-9 09:29 你的程序框架一定有問題,導致顯示異常。給你簡化一下測試,仿真正常。 ![]()
|
消隱沒有延時,等于沒消隱 |
xiaoshan7748 發表于 2022-11-8 17:19 先送位選也一樣,沒變化。 |
zhth1979 發表于 2022-11-9 11:32 想了想,不管數字,單位,電量如何變化,最終還是通過個底層去顯示呀。按說這個底層沒問題顯示應該就不會有問題才對呀! |
yscbg 發表于 2022-11-8 18:07 1和4,底層顯示,我放在1ms定時器里了,1ms掃描一位。2.改為靜態函數也一樣 3.段碼和位碼先送哪個應該沒關系吧?我對調試過,并且直用了wulin老師的代碼放進去還是老樣子。 |
wulin 發表于 2022-11-8 19:02 您的代碼很不錯,簡潔,直接使用您這段代碼還是老樣子,這樣看不像是底層顯示的問題了,是不是數字分解或是按鍵加減閃爍導致的。 |
大漠落日 發表于 2022-11-8 20:26 我現在用的就是2TY. |
lkc8210 發表于 2022-11-8 18:09 今天發現是com4的哪路不對(單位和電量顯示燈都會隨顯示數字的變化微亮),com1 com2 com3顯示數字沒有這種現像。也就是說com4控制的這路好像沒有消隱。 |
lkc8210 發表于 2022-11-8 18:09 按您的次序改了,還是老樣子,先送段碼和先送位選應該是沒關系的。 |
如果排除程序問題,還不行,要換三極管,換個別的類型的,我常用8550做共陽的位選 |
zhth1979 發表于 2022-11-8 19:12 看13樓的正確答案。 |
發表于 2022-11-8 17:49 換了,并且還換了別的型號,沒用。 |
zhth1979 發表于 2022-11-8 13:30 函數放在1~4ms循環周期環境為佳
|
代碼看了,消影消了個寂莫 次序應該是這樣: ![]() |
1,可能每位顯示時間短(主程序循環一次的時間)太小,LED還沒點亮就掃描下一位了 2.static unsigned char i;//要定義靜態函數 3.顯示段位碼注意順序消隱--->位碼---->段碼,否則有殘影,如下OK case 0: duan=0xff; //消隱 wei=PLACE_CODE[0]; //位碼 if(digdot0==1) { duan=leddata[LEDBuf[0]]&0x7f; //段加小數點 } else { duan=leddata[LEDBuf[0]]; } i++; break; 4.定時器控制Dsplay()<4ms執行一次(>60Hz掃描防閃爍) |
換com4驅動三極管。 |
送數之前位選要全都置位也就是送0xff,這樣才是真正的消隱 |
冰火風輪 發表于 2022-11-8 12:29 有消隱,前三位數字都正常。 |
本帖最后由 zhth1979 于 2022-11-8 13:52 編輯 lkc8210 發表于 2022-11-8 13:05 代碼已貼,麻煩大神幫我看看哪里有問題。 |
lkc8210 發表于 2022-11-8 13:05 消影有的。 |
xuyaqi 發表于 2022-11-8 13:11 這種方法試了,是可以減弱,但還是微微亮。 |
lkc8210 發表于 2022-11-8 13:05 #include "display.h" //共陽數碼管編碼表 unsigned char code leddata[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x00}; //0, 1, 2 3 4 5 6 7 8 9 A B C D E F 16 17 //數據顯示緩沖區 unsigned char LEDBuf[]= {17,17,17,3,3}; //位選信號 unsigned char code PLACE_CODE[] ={0xfd,0xfb,0xf7,0xdf}; //1111 1101 1111 1011 1111 0111 1101 1111 //單位段碼 unsigned char code unit[] ={0xfe,0xfd,0xfb,0xf8}; // 1111 1110 /1111 1101/1111 1011 //1111 1000 //電池段碼 unsigned char code BAT[] ={0xFF,0xEF,0xCF,0x8F}; // 1111 1111/1110 1111/1100 1111/1000 1111; // 1000 1111 unsigned char digdot0=0,digdot1=0; void Display() { unsigned char i; //1.送段碼 //2.送位選 //3.延時 1ms 全部數碼管顯示時間<10ms內 //4.消隱 switch(i) { case 0: duan=0xff; duan=leddata[LEDBuf[0]]; if(digdot0==1) { duan=leddata[LEDBuf[0]]&0x7f; } wei=PLACE_CODE[0]; i++; break; case 1: duan=0xff; duan=leddata[LEDBuf[1]]; if(digdot1==1) { duan=leddata[LEDBuf[1]]&0x7f; } wei=PLACE_CODE[1]; i++; break; case 2: duan=0xff; duan=leddata[LEDBuf[2]]; wei=PLACE_CODE[2]; i++; break; case 3: duan=0xff; duan=unit[LEDBuf[3]]; wei=PLACE_CODE[3]; i++; break; case 4: duan=0xff; duan=BAT[LEDBuf[4]]; wei=PLACE_CODE[3]; i=0; break; default:break; } } |
微微發亮不舒服,可以LED回路串電阻減弱。 |
估計是沒消影 最好貼代碼來分析 |
沒加消隱? |