標(biāo)題: 單片機(jī)+74HC595控制數(shù)碼管最后一位特別亮 [打印本頁]

作者: hxdby    時間: 2022-1-18 21:22
標(biāo)題: 單片機(jī)+74HC595控制數(shù)碼管最后一位特別亮
大家好,

我用兩片74HC595D 控制8位數(shù)碼管動態(tài)掃描,一片做8位段碼的控制,另一片做8位位碼的控制。
因?yàn)橹笆侵苯佑脝纹瑱C(jī)IO連接數(shù)碼管來控制的,代碼里面需要有消隱和延時程序,用起來沒啥問題,現(xiàn)在改用74HC595后,發(fā)現(xiàn)不需要消隱和延時了,加了消隱和延時發(fā)現(xiàn)反而無法正常顯示了,我不知道為啥是這樣,代碼里我就直接放顯示部分了。

顯示是沒啥問題,但是現(xiàn)在有一個小問題,就是前面7位亮度一致,最后一位比較亮,也就是最后一位比前7位都亮。這個應(yīng)該是最后一位掃描到的時間比前面長造成的,但是我不知道如何解決。

各位大神有解決這個問題的比較成熟的方法么?

顯示程序大概如下:

void SendData595(uint8_t  DataSendH15_8, uint8_t DataSendL7_0);  // 74HC595數(shù)據(jù)發(fā)送

uint8_t  weima_table[]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}  //8位位碼
uint8_t  duanma_table[]={0xd7,0x82,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f} //段碼,0~9

void SHG_DISPLAY()  // 數(shù)碼管顯示,此處無需消隱和延時

{
         SendData_hc595(weima_table[0],  duanma_table[5]);
         SendData_hc595(weima_table[1],  duanma_table[2]);
         SendData_hc595(weima_table[2],  duanma_table[1])
         SendData_hc595(weima_table[3],  duanma_table[4])
         SendData_hc595(weima_table[4],  duanma_table[0]);
         SendData_hc595(weima_table[5],  duanma_table[8])
         SendData_hc595(weima_table[6],  duanma_table[3]); //以上7位顯示亮度均勻一致
         SendData_hc595(weima_table[7],  duanma_table[7]);  //這一位特別亮,比前7位都亮
}



作者: lkc8210    時間: 2022-1-18 23:43
不知到你其它代碼是如何寫滴
  1. void SHG_DISPLAY()  // 數(shù)碼管顯示,此處無需消隱和延時
  2. {
  3.         static uchar mode = 0;
  4.         switch(mode)
  5.         {
  6.         case 0:
  7.                 SendData_hc595(weima_table[0],  duanma_table[5]);
  8.                 break;
  9.         case 1:
  10.                 SendData_hc595(weima_table[1],  duanma_table[2]);
  11.                 break;
  12.         case 2:
  13.                 SendData_hc595(weima_table[2],  duanma_table[1]);
  14.                 break;
  15.         case 3:
  16.                 SendData_hc595(weima_table[3],  duanma_table[4]);
  17.                 break;
  18.         case 4:
  19.                 SendData_hc595(weima_table[4],  duanma_table[0]);
  20.                 break;
  21.         case 5:
  22.                 SendData_hc595(weima_table[5],  duanma_table[8]);
  23.                 break;
  24.         case 6:
  25.                 SendData_hc595(weima_table[6],  duanma_table[3]); //以上7位顯示亮度均勻一致
  26.                 break;
  27.         case 7:
  28.                 SendData_hc595(weima_table[7],  duanma_table[7]);  //這一位特別亮,比前7位都亮
  29.                 break;
  30.         }
  31.         mode = ++mode % 8;
  32. }
復(fù)制代碼

作者: a185980800    時間: 2022-1-19 00:05
寫個case 8:把595所有數(shù)據(jù)清零不就完事了。
作者: xianfajushi    時間: 2022-1-19 08:41
早上剛想寫這方面的內(nèi)容巧了就看到這帖,有些類似的提問,回復(fù)要硬消隱+軟消隱,可是有些人就是愛鉆牛角尖說已經(jīng)消隱了,有些人看了回復(fù)就去試看結(jié)果就解決了,就有這樣人的區(qū)別,對于愛鉆牛角尖的不撞南墻不回頭的怎么辦,佛門有個典故說佛菩薩教眾生長富財(cái)寶十善法有人信行果長富財(cái)寶,有人不信認(rèn)為只有損人利己有財(cái)寶,佛菩薩對于不聽的眾生只好暫時遠(yuǎn)離,因?yàn)橹谰壏治吹蕉嗾f無益,已為說明只能暫時做個遠(yuǎn)緣分,待緣分到了成熟了才能明白才能回頭是岸才能知錯投路徑反遠(yuǎn)知回頭才能達(dá)目的地。今天得閑就做個荔枝演示取消硬消隱和取消軟消隱會造成什么現(xiàn)象,稍后發(fā)動畫。首先取消軟消隱看現(xiàn)象,次取消硬消隱看現(xiàn)象。
作者: xianfajushi    時間: 2022-1-19 08:42


作者: xianfajushi    時間: 2022-1-19 08:50


作者: rundstedt    時間: 2022-1-19 21:15
每個 SendData_hc595后面都加delay可以讓每個位顯示時間均勻一些。
作者: 名字不是重點(diǎn)    時間: 2022-1-21 09:18
這是你的代碼邏輯問題:
顯示的前7個數(shù)據(jù),會被緊接的下一個數(shù)據(jù)代替,所以它們的亮度是一致的,而第8個數(shù)據(jù)顯示完了之后,并沒有第9個數(shù)據(jù)來頂它 ,所以會一直存活,直到下一輪的顯示掃描的第一個數(shù)據(jù)來頂它,存活時間很長,看上去就比前面7個亮了!
如同板凳所說,最后清數(shù)據(jù)就OK了
。
。
。
。
SendData_hc595(weima_table[7],  duanma_table[7]);
SendData_hc595(0x00, 0x00); //<===加入此行或者直接把595的OE關(guān)了。
作者: 名字不是重點(diǎn)    時間: 2022-1-21 09:21
lkc8210 發(fā)表于 2022-1-18 23:43
不知到你其它代碼是如何寫滴

順序掃顯而已,不需要用分支來走。顯得累贅、臃腫。。
作者: lkc8210    時間: 2022-1-21 13:31
名字不是重點(diǎn) 發(fā)表于 2022-1-21 09:21
順序掃顯而已,不需要用分支來走。顯得累贅、臃腫。。

細(xì)心一點(diǎn)
不是順序的
作者: 名字不是重點(diǎn)    時間: 2022-1-21 16:00
lkc8210 發(fā)表于 2022-1-21 13:31
細(xì)心一點(diǎn)
不是順序的

樓主是“兩片74HC595D 控制8位數(shù)碼管動態(tài)掃描,一片做8位段碼的控制,另一片做8位位碼的控制”
而且他給出的代碼也確實(shí)是從位0-位7依次送顯,變的只是段碼,
如果把段碼做一個顯示BUF,整個顯示函數(shù)只要一個語句:
for(i=0;i<8;i++)
{
。。。
}
不就可以了?短小精干。。


作者: lkc8210    時間: 2022-1-21 16:16
名字不是重點(diǎn) 發(fā)表于 2022-1-21 16:00
樓主是“兩片74HC595D 控制8位數(shù)碼管動態(tài)掃描,一片做8位段碼的控制,另一片做8位位碼的控制”
而且他給 ...

for循環(huán)不能解決最后一位特別亮的問題
作者: 名字不是重點(diǎn)    時間: 2022-1-21 16:22
lkc8210 發(fā)表于 2022-1-21 16:16
for循環(huán)不能解決最后一位特別亮的問題

。。。。。
for完了再加一個條發(fā)送空數(shù)據(jù),或是在顯存中多開一個字節(jié),最后一個成員直接賦值為0:
for(i=0;i<9;i++)
{
。。。
}
就OK了
作者: lkc8210    時間: 2022-1-21 16:44
名字不是重點(diǎn) 發(fā)表于 2022-1-21 16:22
。。。。。
for完了再加一個條發(fā)送空數(shù)據(jù),或是在顯存中多開一個字節(jié),最后一個成員直接賦值為0:
for( ...

這樣也可以
char Phone[8] = "52140837";
void SHG_DISPLAY()  // 數(shù)碼管顯示,此處無需消隱和延時
{
        static unsigned char mode = 0;
        SendData_hc595(weima_table[mode],  duanma_table[Phone[mode] - '0']);   
        mode = ++mode % 8;
}
作者: 名字不是重點(diǎn)    時間: 2022-1-21 17:19
lkc8210 發(fā)表于 2022-1-21 16:44
這樣也可以
char Phone[8] = "52140837";
void SHG_DISPLAY()  // 數(shù)碼管顯示,此處無需消隱和延時

你這個沒有循環(huán)哦
作者: lkc8210    時間: 2022-1-21 17:42
名字不是重點(diǎn) 發(fā)表于 2022-1-21 17:19
你這個沒有循環(huán)哦

利用main while來循環(huán)
作者: 名字不是重點(diǎn)    時間: 2022-1-21 21:06
lkc8210 發(fā)表于 2022-1-21 17:42
利用main while來循環(huán)


字?jǐn)?shù)補(bǔ)丁、、、、、
作者: cn_zhx    時間: 2022-1-23 11:03
時間停留問題




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1