標(biāo)題: 單片機(jī)6個(gè)數(shù)碼管動(dòng)態(tài)顯示程序問題 [打印本頁]

作者: 86爆缸    時(shí)間: 2022-10-22 15:49
標(biāo)題: 單片機(jī)6個(gè)數(shù)碼管動(dòng)態(tài)顯示程序問題
利用動(dòng)態(tài)掃描的方式在6個(gè)數(shù)碼管上顯示出穩(wěn)定的654321;
但是如圖6個(gè)數(shù)碼管顯示出錯(cuò)了;
單片機(jī)代碼如下,請(qǐng)問是哪里的問題
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^7;
sbit wela=P2^6;
uchar num,numwe,numdu;
void init();
void main()
{
        numwe=0xfe;
        numdu=8;
        init();//初始化子程序

        while(1)
        {
               
        }
}
void init()//設(shè)置定時(shí)器方式來達(dá)到動(dòng)態(tài)顯示效果
{
        TMOD=0x01;
        TH0=(65336-500)/256;
        TL0=(65336-500)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void timer0() interrupt 1
{
        TH0=(65336-500)/256;
        TL0=(65336-500)%256;
        num++;
        if(num==1)
        {
                num=0;
                numdu--;
                if(numdu==0)
                numdu=8;
                dula=1;//送段選數(shù)據(jù)
                P0=table[numdu];//賦值6,5,4,3,2,1顯示
                dula=0;
                P0=0xff;//消影
                wela=1;//送位選數(shù)據(jù)
                P0=numwe;
                numwe=_crol_(numwe,1);//循環(huán)左移1位,使6個(gè)數(shù)碼管輪流顯示
                wela=0;
                if(numwe==0xbf)
                numwe=0xfe;
               
        }
}

51hei圖片_20221022154538.jpg (5.27 MB, 下載次數(shù): 87)

51hei圖片_20221022154538.jpg

作者: 一事無成    時(shí)間: 2022-10-22 18:52
講真看不懂你的中斷程序,這個(gè)num有啥用?還有P0=table[numdu];中的numdu確定是在1-6之間循環(huán)?另外把驅(qū)動(dòng)芯片型號(hào)發(fā)一下。
作者: 86爆缸    時(shí)間: 2022-10-22 19:00
一事無成 發(fā)表于 2022-10-22 18:52
講真看不懂你的中斷程序,這個(gè)num有啥用?還有P0=table[numdu];中的numdu確定是在1-6之間循環(huán)?另外把驅(qū)動(dòng) ...

芯片是89C52RC;P0=table[numdu]這我就是想不明白哪里出錯(cuò)了;中斷程序設(shè)置的是5ms,來達(dá)到數(shù)碼管動(dòng)態(tài)顯示的目的;
這個(gè)是郭天祥10天入門單片機(jī)里的例題,這個(gè)出錯(cuò)的是我的解法
作者: 86爆缸    時(shí)間: 2022-10-22 19:01
/*******************************************************************/
/* TX-1C單片機(jī)實(shí)驗(yàn)板實(shí)驗(yàn)例程                                                                   */
/*******************************************************************/
/*                                                         
利用動(dòng)態(tài)掃描方法在六位數(shù)碼管上顯示出穩(wěn)定的654321.
時(shí)鐘頻率為11.0592M
*/
/*********************************************************/
#include<reg52.h>  //52單片機(jī)頭文件
#include <intrins.h> //包含有左右循環(huán)移位子函數(shù)的庫
#define uint unsigned int    //宏定義
#define uchar unsigned char  //宏定義
sbit dula=P2^6;       //數(shù)碼管段選鎖存端
sbit wela=P2^7;       ////數(shù)碼管位選鎖存端
uchar code table[]={   //數(shù)碼管顯示編碼
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar,uchar,uchar,uchar,uchar,uchar); //函數(shù)聲明
void delay(uint);
void main()
{
        while(1)
        {
                display(6,5,4,3,2,1);         //始終顯示
        }
}

void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six)
{
        dula=1;
                P0=table[one];   //送段數(shù)據(jù)
                dula=0;
                P0=0xff;                //送位數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存后段選數(shù)據(jù)通過位選鎖存器
                wela=1;
                P0=0xfe;
                wela=0;
                delay(1);

                dula=1;
                P0=table[two];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xfd;
                wela=0;
                delay(1);

                dula=1;
                P0=table[three];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xfb;
                wela=0;
                delay(1);

                dula=1;
                P0=table[four];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xf7;
                wela=0;
                delay(1);

                dula=1;
                P0=table[five];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xef;
                wela=0;
                delay(1);

                dula=1;
                P0=table[six];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xdf;
                wela=0;
                delay(1);
}

void delay(uint z)       //延時(shí)子函數(shù)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

作者: 86爆缸    時(shí)間: 2022-10-22 19:31
上面是郭天祥老師的解法
作者: lkc8210    時(shí)間: 2022-10-22 20:29
P0=0xFF;消影消了個(gè)寂
正確寫法該是
wela=1
P0=0xff
wela=0
dula=1
P0=table
dula=0
wela=1
P0=numwe
wela=0
作者: 86爆缸    時(shí)間: 2022-10-22 22:08
lkc8210 發(fā)表于 2022-10-22 20:29
P0=0xFF;消影消了個(gè)寂寞
正確寫法該是
wela=1

        num=0;
                numdu--;
                wela=1;
                P0=0xff;
                wela=0;
                if(numdu==0)
                numdu=8;
                dula=1;//送段選數(shù)據(jù)
                P0=table[numdu];//賦值6,5,4,3,2,1顯示
                dula=0;
                //P0=0xff;//消影
                wela=1;//送位選數(shù)據(jù)
                P0=numwe;
                numwe=_crol_(numwe,1);//循環(huán)左移1位,使6個(gè)數(shù)碼管輪流顯示
                wela=0;
                if(numwe==0xbf)
                numwe=0xfe;
作者: 86爆缸    時(shí)間: 2022-10-22 22:15
lkc8210 發(fā)表于 2022-10-22 20:29
P0=0xFF;消影消

這樣消影?但是如圖的話,動(dòng)態(tài)顯示654321還是不行啊

51hei圖片_20221022221232.jpg (255.82 KB, 下載次數(shù): 90)

51hei圖片_20221022221232.jpg

作者: wulin    時(shí)間: 2022-10-23 08:22
86爆缸 發(fā)表于 2022-10-22 22:15
這樣消影?但是如圖的話,動(dòng)態(tài)顯示654321還是不行啊

用位消隱和段消隱都一樣有效,樓主用500us周期掃描速度太快,削弱了消隱效果。通常掃描一輪不低于20ms不會(huì)看出閃爍。一般每個(gè)數(shù)碼管顯示1ms,6ms完成一輪掃描為宜。




代碼修改如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar code table[]={
  6. 0x3f,0x06,0x5b,0x4f,
  7. 0x66,0x6d,0x7d,0x07,
  8. 0x7f,0x6f,0x77,0x7c,
  9. 0x39,0x5e,0x79,0x71};
  10. sbit dula=P2^6;
  11. sbit wela=P2^7;
  12. uchar num;//numwe,numdu;
  13. void init();
  14. void main()
  15. {
  16. //        numwe=0xfe;
  17. //        numdu=8;
  18.         init();//初始化子程序
  19.        
  20.         while(1)
  21.         {
  22.        
  23.         }
  24. }
  25. void init()//設(shè)置定時(shí)器方式來達(dá)到動(dòng)態(tài)顯示效果
  26. {
  27.         TMOD=0x01;
  28.         TH0=(65536-1000)/256;
  29.         TL0=(65536-1000)%256;
  30.         EA=1;
  31.         ET0=1;
  32.         TR0=1;
  33. }
  34. void timer0() interrupt 1
  35. {
  36.         TH0=(65536-1000)/256;
  37.         TL0=(65536-1000)%256;

  38.         num++;
  39.         if(num==6)
  40.                 num=0;

  41.         dula=1;
  42.         P0=0x00;//消影
  43.         dula=0;

  44.         wela=1;
  45.         P0=~(0x01<<num);//送位碼
  46.         wela=0;

  47.         dula=1;
  48.         P0=table[6-num];//賦值6,5,4,3,2,1顯示
  49.         dula=0;
  50. }
復(fù)制代碼




作者: zhxiufan    時(shí)間: 2022-10-23 09:06
定時(shí)器定時(shí)時(shí)間太短,將500改為2000到5000之間。另外顯示應(yīng)該先位碼再段碼
作者: 86爆缸    時(shí)間: 2022-10-23 11:28
zhxiufan 發(fā)表于 2022-10-23 09:06
定時(shí)器定時(shí)時(shí)間太短,將500改為2000到5000之間。另外顯示應(yīng)該先位碼再段碼

先位碼后段碼的話,段碼未賦初值,當(dāng)dula=1的時(shí)候,P0還是位選的數(shù)據(jù),會(huì)先出現(xiàn)亂碼吧,所以我才先段碼后位碼的
作者: 86爆缸    時(shí)間: 2022-10-23 12:03
wulin 發(fā)表于 2022-10-23 08:22
用位消隱和段消隱都一樣有效,樓主用500us周期掃描速度太快,削弱了消隱效果。通常掃描一輪不低于20ms不 ...

謝謝大佬,你的代碼寫的很漂亮,我定義的變量還是多了;
不過消影應(yīng)該是P0=0xff,我這個(gè)是共陰極數(shù)碼管;
同時(shí)我試了下用不用消影的區(qū)別,數(shù)碼管顯示都正常,沒有亂碼

作者: 86爆缸    時(shí)間: 2022-10-23 12:10
wulin 發(fā)表于 2022-10-23 08:22
用位消隱和段消隱都一樣有效,樓主用500us周期掃描速度太快,削弱了消隱效果。通常掃描一輪不低于20ms不 ...

大佬你的代碼我能看懂沒問題,但我自己的代碼試了下延長掃描周期,但就是沒法顯示和你一樣的效果;
找不到我的代碼錯(cuò)在哪里了
作者: 86爆缸    時(shí)間: 2022-10-23 12:15
wulin 發(fā)表于 2022-10-23 08:22
用位消隱和段消隱都一樣有效,樓主用500us周期掃描速度太快,削弱了消隱效果。通常掃描一輪不低于20ms不 ...

我找到我代碼的問題了,位選賦值那的if語句用錯(cuò)了,輸出結(jié)果就是6個(gè)數(shù)碼管流水燈亮,然后同時(shí)每個(gè)數(shù)碼管都賦值6,5,4,3,2,1;難怪我這都是亂碼了
作者: 86爆缸    時(shí)間: 2022-10-23 12:26
86爆缸 發(fā)表于 2022-10-23 12:15
我找到我代碼的問題了,位選賦值那的if語句用錯(cuò)了,輸出結(jié)果就是6個(gè)數(shù)碼管流水燈亮,然后同時(shí)每個(gè)數(shù)碼管 ...

試了下還是不行,我想我這個(gè)應(yīng)該是定義的變量多了,掃描時(shí)間又短,段選位選多個(gè)變量造成的亂碼?




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