久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

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

單片機源程序如下:
#include "display.h"        
//共陽數(shù)碼管編碼表
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  
                                                                                                               
//數(shù)據(jù)顯示緩沖區(qū)
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  全部數(shù)碼管顯示時間<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老師的代碼,故障現(xiàn)像依舊。
#include "display.h"
        
//共陽數(shù)碼管編碼表
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
                                                                                                               
//數(shù)據(jù)顯示緩沖區(qū)
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;//靜態(tà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;
}


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

#include "display.h"

       
//共陽數(shù)碼管編碼表
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  
                                                                                                               
//數(shù)據(jù)顯示緩沖區(qū)
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  全部數(shù)碼管顯示時間<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 發(fā)表于 2022-11-8 13:11
微微發(fā)亮不舒服,可以LED回路串電阻減弱。

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

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

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

有消隱,前三位數(shù)字都正常。
作者: xiaoshan7748    時間: 2022-11-8 17:19
送數(shù)之前位選要全都置位也就是送0xff,這樣才是真正的消隱
作者: 13327291097    時間: 2022-11-8 17:49
換com4驅動三極管。
作者: yscbg    時間: 2022-11-8 18:07
1,可能每位顯示時間短(主程序循環(huán)一次的時間)太小,LED還沒點亮就掃描下一位了
2.static unsigned char i;//要定義靜態(tài)函數(shù)
3.顯示段位碼注意順序消隱--->位碼---->段碼,否則有殘影,如下OK
                case 0:
                        duan=0xff;        //消隱
                                 wei=PLACE_CODE[0];   //位碼              
                                               if(digdot0==1)
                                                {
                                                      duan=leddata[LEDBuf[0]]&0x7f; //段加小數(shù)點      
                                                }
                                        else
                                                {
                                                        duan=leddata[LEDBuf[0]];
                                                }
                  i++;
                  break;
4.定時器控制Dsplay()<4ms執(zhí)行一次(>60Hz掃描防閃爍)
作者: lkc8210    時間: 2022-11-8 18:09
zhth1979 發(fā)表于 2022-11-8 13:32
消影有的。

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



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

       

函數(shù)放在1~4ms循環(huán)周期環(huán)境為佳
  1. void Display()
  2. {
  3.         static unsigned char i;//靜態(tà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
發(fā)表于 2022-11-8 17:49
換com4驅動三極管。

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

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

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

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

我現(xiàn)在用的就是2TY.
作者: zhth1979    時間: 2022-11-9 09:29
wulin 發(fā)表于 2022-11-8 19:02
函數(shù)放在1~4ms循環(huán)周期環(huán)境為佳

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

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

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

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

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

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



  1. #include <reg51.H>
  2. #define duan P2
  3. #define wei P3 //      
  4. //共陽數(shù)碼管編碼表
  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. //數(shù)據(jù)顯示緩沖區(qū)
  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;//靜態(tài)變量
  22.         switch(i)
  23.         {
  24.                 case 0:LEDBuf[i]=leddata[1];break;
  25.                 case 1:LEDBuf[i]=leddata[2]&0x7f;break;//加小數(shù)點
  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
幾天都沒有搞定?
這只是一個數(shù)碼管而已呀
在每次顯示之前,先消隱

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

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

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

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

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




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日本在线免费视频 | 国产午夜精品久久久久久久 | 蜜臀久久99精品久久久久宅男 | 狠狠综合网 | 国产一级特黄 | 午夜精品影院 | 色一情一乱一伦一区二区三区 | 久久久亚洲天堂 | 久热精品视频在线观看 | 国产日韩久久 | 久久九九国产 | 天堂成人| 国产在线www | 在线观看av的网站 | 国产欧美精品一区二区三区 | 日本国产在线观看 | 谁有毛片网址 | 一区二区福利 | 色婷婷中文字幕 | 国产色视频一区二区三区qq号 | 一级片免费 | 国产吃瓜黑料一区二区 | 国产成人精品在线观看 | 激情做爰呻吟视频舌吻 | 日韩国产欧美 | 欧美日韩在线观看视频 | 成人黄性视频 | 91你懂的| 国产成人精品亚洲男人的天堂 | 日韩国产一区二区 | 中文字幕在线视频播放 | 国产日韩在线视频 | 97中文字幕 | 日韩精品久久久久 | 成人毛片100免费观看 | 欧美日韩亚洲国产 | 欧美日韩在线一区 | 精品国产99 | 五月天激情综合网 | 色婷婷久久 | 欧美成年人视频 |