欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機驅動數碼管微微發亮,這種問題有沒有解?附程序電路圖 [打印本頁]

作者: zhth1979    時間: 2022-11-8 11:28
標題: 單片機驅動數碼管微微發亮,這種問題有沒有解?附程序電路圖
   
共陽數碼管顯示:com1 com2 com3顯示數字正常,但com4位選控制的這六個燈,前三個為單位顯示,后三個為電量顯示,單位或電量顯示時,正常是不需要亮的燈是不亮,但是不亮時會微微發亮?我也明白是前面顯示數字的段碼影響的,這種問題有解決辦法嗎?

單片機源程序如下:
#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;
               
        }
        
}

下面是把case3 和case4  段碼相與一起送也試過,也不行!
——————————————————————————————————————————————————————————
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;
合并一起送段碼也不行。
case 3:                        
                  duan=0xff;
                        duan=unit[LEDBuf[3] & BAT[LEDBuf[4]];
                  wei=PLACE_CODE[3];         
                  i=0;
                break;

下面是更新了wulin老師的代碼,故障現像依舊。
#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()
{
        static unsigned char i;//靜態變量

        duan=0xff;//段消隱
        switch(i)
        {
                case 0:
                        wei=PLACE_CODE[0];
                        if(digdot0==1) duan=leddata[LEDBuf[0]]&0x7f;
                        else duan=leddata[LEDBuf[0]];  
                break;

                case 1:
                        wei=PLACE_CODE[1];
                        if(digdot1==1) duan=leddata[LEDBuf[1]]&0x7f;      
                        else duan=leddata[LEDBuf[1]];
                break;

                case 2:                       
                        wei=PLACE_CODE[2];
                        duan=leddata[LEDBuf[2]];
                break;

                case 3:                       
                        wei=PLACE_CODE[3];
                        duan=unit[LEDBuf[3]];
                break;

                case 4:                       
                        wei=PLACE_CODE[3];
                        duan=BAT[LEDBuf[4]];
                break;

                default:break;
        }
        i=++i%5;
}


現象更新:1.今天發現是com4的哪路不對(單位和電量顯示燈都會隨顯示數字的變化微亮),com1 com2 com3顯示數字沒有這種現像。也就是說com4控制的這路好像沒有消隱。
作者: 冰火風輪    時間: 2022-11-8 12:29
沒加消隱?
作者: lkc8210    時間: 2022-11-8 13:05
估計是沒消影
最好貼代碼來分析
作者: xuyaqi    時間: 2022-11-8 13:11
微微發亮不舒服,可以LED回路串電阻減弱。
作者: zhth1979    時間: 2022-11-8 13:30
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;
               
        }
       
}
作者: zhth1979    時間: 2022-11-8 13:32
xuyaqi 發表于 2022-11-8 13:11
微微發亮不舒服,可以LED回路串電阻減弱。

這種方法試了,是可以減弱,但還是微微亮。
作者: zhth1979    時間: 2022-11-8 13:32
lkc8210 發表于 2022-11-8 13:05
估計是沒消影
最好貼代碼來分析

消影有的。
作者: zhth1979    時間: 2022-11-8 13:39
本帖最后由 zhth1979 于 2022-11-8 13:52 編輯
lkc8210 發表于 2022-11-8 13:05
估計是沒消影
最好貼代碼來分析

代碼已貼,麻煩大神幫我看看哪里有問題。
作者: zhth1979    時間: 2022-11-8 15:14
冰火風輪 發表于 2022-11-8 12:29
沒加消隱?

有消隱,前三位數字都正常。
作者: xiaoshan7748    時間: 2022-11-8 17:19
送數之前位選要全都置位也就是送0xff,這樣才是真正的消隱
作者: 13327291097    時間: 2022-11-8 17:49
換com4驅動三極管。
作者: yscbg    時間: 2022-11-8 18:07
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掃描防閃爍)
作者: lkc8210    時間: 2022-11-8 18:09
zhth1979 發表于 2022-11-8 13:32
消影有的。

代碼看了,消影消了個寂莫
次序應該是這樣:



作者: wulin    時間: 2022-11-8 19:02
zhth1979 發表于 2022-11-8 13:30
#include "display.h"

       

函數放在1~4ms循環周期環境為佳
  1. void Display()
  2. {
  3.         static unsigned char i;//靜態變量

  4.         duan=0xff;//段消隱
  5.         switch(i)
  6.         {
  7.                 case 0:
  8.                         wei=PLACE_CODE[0];
  9.                         if(digdot0==1)duan=leddata[LEDBuf[0]]&0x7f;
  10.                         else duan=leddata[LEDBuf[0]];  
  11.                 break;

  12.                 case 1:
  13.                         wei=PLACE_CODE[1];
  14.                         if(digdot1==1)
  15.                                 duan=leddata[LEDBuf[1]]&0x7f;      
  16.                         else duan=leddata[LEDBuf[1]];
  17.                 break;

  18.                 case 2:                       
  19.                         wei=PLACE_CODE[2];
  20.                         duan=leddata[LEDBuf[2]];
  21.                 break;

  22.                 case 3:                       
  23.                         wei=PLACE_CODE[3];
  24.                         duan=unit[LEDBuf[3]];
  25.                 break;

  26.                 case 4:                       
  27.                         wei=PLACE_CODE[3];
  28.                         duan=BAT[LEDBuf[4]];
  29.                 break;

  30.                 default:break;
  31.         }
  32.         i=++i%5;
  33. }
復制代碼

作者: zhth1979    時間: 2022-11-8 19:12
發表于 2022-11-8 17:49
換com4驅動三極管。

換了,并且還換了別的型號,沒用。
作者: 188610329    時間: 2022-11-8 20:17
zhth1979 發表于 2022-11-8 19:12
換了,并且還換了別的型號,沒用。

看13樓的正確答案。
作者: 大漠落日    時間: 2022-11-8 20:26
如果排除程序問題,還不行,要換三極管,換個別的類型的,我常用8550做共陽的位選
作者: zhth1979    時間: 2022-11-9 08:46
lkc8210 發表于 2022-11-8 18:09
代碼看了,消影消了個寂莫
次序應該是這樣:

按您的次序改了,還是老樣子,先送段碼和先送位選應該是沒關系的。
作者: zhth1979    時間: 2022-11-9 09:04
lkc8210 發表于 2022-11-8 18:09
代碼看了,消影消了個寂莫
次序應該是這樣:

今天發現是com4的哪路不對(單位和電量顯示燈都會隨顯示數字的變化微亮),com1 com2 com3顯示數字沒有這種現像。也就是說com4控制的這路好像沒有消隱。
作者: zhth1979    時間: 2022-11-9 09:06
大漠落日 發表于 2022-11-8 20:26
如果排除程序問題,還不行,要換三極管,換個別的類型的,我常用8550做共陽的位選

我現在用的就是2TY.
作者: zhth1979    時間: 2022-11-9 09:29
wulin 發表于 2022-11-8 19:02
函數放在1~4ms循環周期環境為佳

您的代碼很不錯,簡潔,直接使用您這段代碼還是老樣子,這樣看不像是底層顯示的問題了,是不是數字分解或是按鍵加減閃爍導致的。
作者: zhth1979    時間: 2022-11-9 11:32
yscbg 發表于 2022-11-8 18:07
1,可能每位顯示時間短(主程序循環一次的時間)太小,LED還沒點亮就掃描下一位了
2.static unsigned char ...

1和4,底層顯示,我放在1ms定時器里了,1ms掃描一位。2.改為靜態函數也一樣 3.段碼和位碼先送哪個應該沒關系吧?我對調試過,并且直用了wulin老師的代碼放進去還是老樣子。
作者: zhth1979    時間: 2022-11-9 12:12
zhth1979 發表于 2022-11-9 11:32
1和4,底層顯示,我放在1ms定時器里了,1ms掃描一位。2.改為靜態函數也一樣 3.段碼和位碼先送哪個應該沒 ...

想了想,不管數字,單位,電量如何變化,最終還是通過個底層去顯示呀。按說這個底層沒問題顯示應該就不會有問題才對呀!
作者: zhth1979    時間: 2022-11-9 16:21
xiaoshan7748 發表于 2022-11-8 17:19
送數之前位選要全都置位也就是送0xff,這樣才是真正的消隱

先送位選也一樣,沒變化。
作者: 人中狼    時間: 2022-11-9 17:04
消隱沒有延時,等于沒消隱

作者: wulin    時間: 2022-11-9 21:34
zhth1979 發表于 2022-11-9 09:29
您的代碼很不錯,簡潔,直接使用您這段代碼還是老樣子,這樣看不像是底層顯示的問題了,是不是數字分解或 ...

你的程序框架一定有問題,導致顯示異常。給你簡化一下測試,仿真正常。



  1. #include <reg51.H>
  2. #define duan P2
  3. #define wei P3 //      
  4. //共陽數碼管編碼表
  5. unsigned char code leddata[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x00};
  6.                               //0,  1,   2    3     4    5    6    7    8    9    A    B    C    D   E    F    16    17  
  7. //數據顯示緩沖區
  8. unsigned char LEDBuf[4];      
  9. //位選信號
  10. unsigned char code PLACE_CODE[] ={0x02,0x04,0x08,0x20};
  11. //1111 1101  1111 1011   1111 0111  1101 1111

  12. //單位段碼
  13. unsigned char code unit[] ={0xfe,0xfd,0xfb,0xf8};
  14. //                      1111 1110 /1111 1101/1111 1011/1111 1000   
  15. //電池段碼
  16. unsigned char code BAT[] ={0xff,0xef,0xcf,0x8f};
  17. //                      1111 1111/1110 1111/1100 1111/1000 1111;   // 1000 1111
  18. unsigned int t;

  19. void Display()
  20. {
  21.         static unsigned char i;//靜態變量
  22.         switch(i)
  23.         {
  24.                 case 0:LEDBuf[i]=leddata[1];break;
  25.                 case 1:LEDBuf[i]=leddata[2]&0x7f;break;//加小數點
  26.                 case 2:LEDBuf[i]=leddata[3];break;
  27.                 case 3:LEDBuf[i]=leddata[4];break;
  28.         }
  29.         wei&=0xd1;//位消隱
  30.         duan=LEDBuf[i];//送段碼
  31.         wei|=PLACE_CODE[i];//送位碼
  32.         i=++i%4;
  33. }

  34. void main()
  35. {
  36.         while(1)
  37.         {
  38.                 Display();               
  39.                 t=110;
  40.                 //延時T=t*9+16us(12M晶振)約1ms
  41.                 while(t--);
  42.         }
  43. }
復制代碼




作者: Y_G_G    時間: 2022-11-10 00:16
幾天都沒有搞定?
這只是一個數碼管而已呀
在每次顯示之前,先消隱

duan = 0x00;
wei = 0x00;
delay_us(10);//自己寫一個uS延時程序

這個放在 Display()里面,最先執行,然后再執行其它的顯示
如果還不行,那就是你程序的其它問題
作者: zhth1979    時間: 2022-11-10 12:56
wulin 發表于 2022-11-9 21:34
你的程序框架一定有問題,導致顯示異常。給你簡化一下測試,仿真正常。

wulin老師,今天發現是com4的哪路不對(單位和電量顯示燈都會隨顯示數字的變化微亮),com1 com2 com3顯示數字沒有這種現像。也就是說com4控制的這路好像沒有消隱。
作者: zhth1979    時間: 2022-11-10 12:56
Y_G_G 發表于 2022-11-10 00:16
幾天都沒有搞定?
這只是一個數碼管而已呀
在每次顯示之前,先消隱

是哪,還沒搞定,請大師指點呀!今天發現是com4的哪路不對(單位和電量顯示燈都會隨顯示數字的變化微亮),com1 com2 com3顯示數字沒有這種現像。也就是說com4控制的這路好像沒有消隱。
作者: hui7279    時間: 2023-10-31 13:52
所謂的消隱沒有做好:因為位碼最后一次在掃描第4位在開啟的狀態并沒有改變,而段碼是下一次送數據時變成顯示了,所有消隱最好將所有的段碼與位碼狀態恢復才行!
作者: hui7279    時間: 2023-10-31 14:10
我也是初學者,學了一年左右,據對消隱的理解看似乎是程序消隱問題:
1、程序是反復掃描來改變狀態的,所以位碼沒有消隱會是最后一次掃描的狀態;
2、我看程序是,swtich后,第4位狀態最后一次開啟后關沒有關閉;
3、下一個循環送段時,第四位閃亮狀態,在送完段碼后的一瞬間,第四位是亮的,然后第一位碼送到,才同時就相當于關閉第四位,瞬間點亮的余輝形成微亮,典型的第4位沒有消隱的處理;
4、26樓的程序是正確的,所以仿真沒有問題,如果樓主的仿真也沒有問題的話,是軟件仿真與實際的差異問題;
5、我個人認為正確的消隱是:如果先送段碼則前先作位消隱,如果先送位碼,則先作段碼消隱,所以14樓程序也是正確的;交換送顯示數據的順序,消隱的對象是不同的,我初學的程序不懂,就在送顯示數據前,所有的狀態恢復到最初的狀態,慢慢看別人的程序,再看書后,理解才清晰點;
——不知道說清楚沒有,因為知識很多是從51Hei學到的,所以回復特有耐性,與其他學習者共勉。

作者: hcfat51h    時間: 2023-10-31 14:52
有沒有可能有LED反向輕微漏電導致其它LED微亮?
作者: 鵜鶘    時間: 2023-10-31 15:43
一年過去了,問題解決了沒有啊?




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