找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3393|回復(fù): 6
收起左側(cè)

51單片機(jī)變量定義為unsigned long時(shí)8位數(shù)碼管顯示亂碼

[復(fù)制鏈接]
ID:287899 發(fā)表于 2020-10-31 10:47 | 顯示全部樓層 |閱讀模式
程序如下:#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned  long  code DUAN[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//uchar DUAN2[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//uchar WEI[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//uchar WEI2[8]={0xc7,0xcf,0xd7,0xdf,0xe7,0xef,0xf7,0xff};
void delay(uchar g)
{
  uchar x,y;
        for(x=g;x>0;x--)
        for(y=110;y>0;y--);
}       
void main()
{
       
unsigned  long i;
         while(1)
        {
          for(i=0;i<10000000;i++)
          {
                        P3=0X01;
            P2=DUAN[i%10];
                        delay(20);
                        P3=0X00;
                       
                        P3=0X02;
                        P2=DUAN[i/10%10];
                        delay(20);
                        P3=0X00;
                       
                        P3=0X04;
                        P2=DUAN[i/100%10];
                        delay(20);
                        P3=0X00;
                       
                        P3=0X08;
                        P2=DUAN[i/1000%10];
                        delay(20);
                        P3=0X00;
                       
                        P3=0X10;
                        P2=DUAN[i/10000%10];
                        delay(20);
                        P3=0X00;
                       
                        P3=0X20;
                        P2=DUAN[i/100000%10];
                        delay(20);
                        P3=0X00;
                       
                        P3=0X40;
                        P2=DUAN[i/1000000%10];
                        delay(20);
                        P3=0X00;
                       
                        P3=0X80;
                        P2=DUAN[i/10000000%10];
                        delay(20);
                        P3=0X00;
           }
  }
}

51hei截圖20201031104553.png
回復(fù)

使用道具 舉報(bào)

ID:451718 發(fā)表于 2020-10-31 12:49 | 顯示全部樓層
你這個(gè)問題的模糊概念不止一個(gè)哦。
首先,先弄清楚段碼在低層的真實(shí)用途。段碼的數(shù)組定義成unsigned char類型就夠了,不需要定義成long。
其次,數(shù)組的成員概念。你用long型量去做數(shù)組的角碼,你是準(zhǔn)備用多大的內(nèi)存來存數(shù)組?
回復(fù)

使用道具 舉報(bào)

ID:287899 發(fā)表于 2020-11-1 13:32 | 顯示全部樓層
本帖最后由 zycs 于 2020-11-1 13:35 編輯
robinsonlin 發(fā)表于 2020-10-31 12:49
你這個(gè)問題的模糊概念不止一個(gè)哦。
首先,先弄清楚段碼在低層的真實(shí)用途。段碼的數(shù)組定義成unsigned char ...

想從1加到99999999,數(shù)組定義的unsigned char 。本來在主函數(shù)里定義的變量i是unsigned int類型的,但是從1加到2萬多就亂碼了,所以我就想是不是unsigned int類型的變量范圍太小了就改成unsigned long類型的,但還是亂碼。想請(qǐng)給位師傅幫忙看看問題出在哪里
回復(fù)

使用道具 舉報(bào)

ID:287899 發(fā)表于 2020-11-1 15:11 | 顯示全部樓層
robinsonlin 發(fā)表于 2020-10-31 12:49
你這個(gè)問題的模糊概念不止一個(gè)哦。
首先,先弄清楚段碼在低層的真實(shí)用途。段碼的數(shù)組定義成unsigned char ...

對(duì)不起描述的太模糊了,我想實(shí)現(xiàn)的功能是八位數(shù)管顯示從一加到99999999,本來數(shù)組定義的是unsigned char類型,主函數(shù)里的變量i定義的unsigned int類型,但是這樣只能加到3萬多再往后加就亂碼了,所以我想著是不是unsigned int類型的變量i范圍太小了,所以就把i改成了unsigned long類型的,但是這樣就直接亂碼了,數(shù)組我已經(jīng)改回unsigned char 類型的了。請(qǐng)各位幫忙看看代碼哪里出了問題
回復(fù)

使用道具 舉報(bào)

ID:287899 發(fā)表于 2020-11-1 16:37 | 顯示全部樓層
不用了各位,問題解決了
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2020-11-1 16:40 | 顯示全部樓層
zycs 發(fā)表于 2020-11-1 15:11
對(duì)不起描述的太模糊了,我想實(shí)現(xiàn)的功能是八位數(shù)管顯示從一加到99999999,本來數(shù)組定義的是unsigned char ...

仿真數(shù)碼管顯示亂碼的原因不是數(shù)組用錯(cuò)類型,而是顯示代碼順序有錯(cuò)和延時(shí)時(shí)間不當(dāng)。
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. unsigned  long  code DUAN[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5. //uchar DUAN2[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. //uchar WEI[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  7. //uchar WEI2[8]={0xc7,0xcf,0xd7,0xdf,0xe7,0xef,0xf7,0xff};
  8. void delay(uint g)
  9. {
  10.         uint x,y;
  11.         for(x=g;x>0;x--)
  12.                 for(y=110;y>0;y--);
  13. }        
  14. void main()
  15. {
  16.         unsigned  long i;
  17.         while(1)
  18.         {
  19.                 for(i=0;i<10000000;i++)
  20.                 {
  21.                         P3=0X00;
  22.                         P2=DUAN[i%10];
  23.                         P3=0X01;
  24.                         delay(1);

  25.                         P3=0X00;
  26.                         P2=DUAN[i/10%10];
  27.                         P3=0X02;
  28.                         delay(1);

  29.                         P3=0X00;                       
  30.                         P2=DUAN[i/100%10];
  31.                         P3=0X04;
  32.                         delay(1);

  33.                         P3=0X00;                       
  34.                         P2=DUAN[i/1000%10];
  35.                         P3=0X08;
  36.                         delay(1);

  37.                         P3=0X00;
  38.                         P2=DUAN[i/10000%10];
  39.                         P3=0X10;
  40.                         delay(1);
  41.                        
  42.                         P3=0X00;
  43.                         P2=DUAN[i/100000%10];
  44.                         P3=0X20;
  45.                         delay(1);

  46.                         P3=0X00;
  47.                         P2=DUAN[i/1000000%10];
  48.                         P3=0X40;
  49.                         delay(1);

  50.                         P3=0X00;
  51.                         P2=DUAN[i/10000000%10];
  52.                         P3=0X80;
  53.                         delay(1);
  54.                 }
  55.         }
  56. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:287899 發(fā)表于 2020-11-1 22:29 | 顯示全部樓層
wulin 發(fā)表于 2020-11-1 16:40
仿真數(shù)碼管顯示亂碼的原因不是數(shù)組用錯(cuò)類型,而是顯示代碼順序有錯(cuò)和延時(shí)時(shí)間不當(dāng)。

感謝,
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表