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

標題: 各位大神,我又來求助數碼管了,感謝 [打印本頁]

作者: GOD丿小男孩    時間: 2017-9-12 21:44
標題: 各位大神,我又來求助數碼管了,感謝
數碼管的原理我都懂,另外,重點強調,我這個是用138譯碼器控制數碼管顯示的,不是P1口;謝謝;
準備用8個數碼管顯示二進制累加的過程的,結果程序寫下來提示控制數碼管顯示的代碼沒意義;不知道問題出在哪了。請大家多多指教,萬分感謝;

譯碼器.png (26.94 KB, 下載次數: 54)

譯碼器.png

數碼管.png (66.92 KB, 下載次數: 55)

數碼管.png

代碼.png (40.55 KB, 下載次數: 79)

代碼.png

代碼1.png (10.24 KB, 下載次數: 67)

代碼1.png

錯誤.png (7.25 KB, 下載次數: 65)

錯誤.png

作者: GOD丿小男孩    時間: 2017-9-12 21:47
中間的代碼,漏發了;

代碼0.png (51 KB, 下載次數: 70)

代碼0.png

作者: mengzhixinheng    時間: 2017-9-13 01:24
#include<reg51.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit A1=P1^4;
sbit B1=P1^3;
sbit C1=P1^2;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uchar x)
{
  uint i,j;
  for(i=x;i>0;i--)
          for(j=120;j>0;j--);
}
/*void display()
{
     uchar X,Y;
     for(X=0;X<16;X++)
             for(Y=0;Y<100;Y++)
             {
     
                     A1=0;B1=0;C1=0;P2=table[X];delayms(3);
                     A1=0;B1=0;C1=1;P2=table[X];delayms(3);
                     A1=0;B1=1;C1=0;P2=table[X];delayms(3);
                     A1=0;B1=1;C1=1;P2=table[X];delayms(3);
                     A1=1;B1=0;C1=0;P2=table[X];delayms(3);
                     A1=1;B1=0;C1=1;P2=table[X];delayms(3);
                     A1=1;B1=1;C1=0;P2=table[X];delayms(3);
                     A1=1;B1=1;C1=1;P2=table[X];delayms(3);
     
             }
} */
void hex()
{
        uchar m,su;
        for(m=0x00;m<0xff;m++)
                for(su=0;su<50;su++)
                {
                        A1=1;B1=1;C1=1;
                                if(m&0x01)P2=table[1];else P2=table[0];delayms(3);
                        A1=1;B1=1;C1=0;
                                if(m&0x02)P2=table[1];else P2=table[0];delayms(3);
                    A1=1;B1=0;C1=1;
                                if(m&0x04)P2=table[1];else P2=table[0];delayms(3);
                    A1=1;B1=0;C1=0;
                                 if(m&0x08)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=1;C1=1;
                                 if(m&0x10)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=1;C1=0;
                                 if(m&0x20)P2=table[1];else P2=table[0];delayms(3);
                    A1=0;B1=0;C1=1;
                                  if(m&0x40)P2=table[1];else P2=table[0];delayms(3);
                        A1=0;B1=0;C1=0;
                                if(m&0x80)P2=table[1];else P2=table[0];delayms(3);
                }
}
void main()
{
     while(1)
     {   
            // display();
                           hex();
     }            
}
16進制輸出到一個完整的端口用led亮滅直接就可以表示出二進制狀態。你要用數碼管0和1表示,只需要判斷哪個數碼管該顯示什么就行。這個由你的累加數決定
作者: mengzhixinheng    時間: 2017-9-13 01:25
自己改程序匹配你的電路
作者: mengzhixinheng    時間: 2017-9-13 01:34
注意138的輸入端一定要搞對,這個錯了真值表就不能按次序排列,數碼管顯示就亂了。細心!!!
作者: 漫步經心    時間: 2017-9-13 08:54
我個人建議你先讓數碼管顯示一個數字,然后再動態刷新。循序漸進這樣比較穩妥。一次性寫那么多,出錯了你都找不到北。否則也就沒有那么多人說模塊化了。
作者: GOD丿小男孩    時間: 2017-9-13 15:20
mengzhixinheng 發表于 2017-9-13 01:24
#include
typedef unsigned int uint;
typedef unsigned char uchar;

非常感謝你的幫助,不過你這個代碼出來后是不顯示1的,只有0或者不顯示,應該是該顯示1的時候數碼管沒點亮。看了你的代碼才知道我錯在哪了,是每一行的table沒有賦值給P0;顯示才沒有意義,現在已經改過來了,并且稍作修改后能正常顯示,待會我會放下面,謝謝你了,你這個比較高端一點,我的代碼就是最簡單的邏輯來寫的
作者: GOD丿小男孩    時間: 2017-9-13 15:23
mengzhixinheng 發表于 2017-9-13 01:25
自己改程序匹配你的電路

感謝的你幫助,不是電路問題,犯了一個最基本的錯誤
作者: GOD丿小男孩    時間: 2017-9-13 15:32
mengzhixinheng 發表于 2017-9-13 01:34
注意138的輸入端一定要搞對,這個錯了真值表就不能按次序排列,數碼管顯示就亂了。細心!!!

嗯,多謝提醒。我寫的時候是對照真值表寫的,所以不會出錯
作者: GOD丿小男孩    時間: 2017-9-13 15:35
漫步經心 發表于 2017-9-13 08:54
我個人建議你先讓數碼管顯示一個數字,然后再動態刷新。循序漸進這樣比較穩妥。一次性寫那么多,出錯了你都 ...

那樣是好一點,不過我前面按照你這種方式寫了一個十進制累加的,發現其實都一樣的,因為后面是相同的,錯誤都是一樣的,很方便改
作者: GOD丿小男孩    時間: 2017-9-13 15:41
犯了一個基本錯誤。每一行的table沒有賦值給P0端,只是寫出來而已;另外if語句中應該是等于2時為真,還有最后一個if語句內容也稍作修改,才能加滿后循環,感謝大家的幫助;下面把代碼附上,親測可用;
#include<reg52.h>
sbit A=P2^2;   //定義控制數碼管管腳
sbit C=P2^3;
sbit D=P2^4;
typedef unsigned char u16;
typedef unsigned int u8;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                                                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
                                                        0x79,0x71,0x00};
void delay(u16 z)           //延時函數
{
        u16 x,y;
        for(x=z;x>0;x--)
                for(y=100;y>0;y--);
}
void main()                //數碼管顯示二進制累加函數
{
        u16 k,j,i,g;
        u16 h,f,m,a,l;   //定義變量
        j=0;i=0;g=0;h=0;f=0;m=0;l=0;
        while(1)                //大循環
         { for(k=0;k<3;k++)         //控制1數碼管顯示
                {
                        for(a=50;a>0;a--)  //使數碼管顯示時間足夠人眼識別
                        {       
                                A=0;C=0;D=0;P0=table[k];delay(3);        //1數碼管顯示0或1
                                if(k==2){j++;k=0;}                                //當1數碼管顯示1后,使二數碼管顯示1;
                                A=1;C=0;D=0;P0=table[j];delay(3);        //控制2數碼管顯示0或1;
                                if(j==2){i++;j=0;}                                //以下相同;
                                A=0;C=1;D=0;P0=table[i];delay(3);
                                if(i==2){g++;i=0;}
                                A=1;C=1;D=0;P0=table[g];delay(3);
                                if(g==2){h++;g=0;}
                                A=0;C=0;D=1;P0=table[h];delay(3);
                                if(h==2){f++;h=0;}
                                A=1;C=0;D=1;P0=table[f];delay(3);
                                if(f==2){m++;f=0;}
                                A=0;C=1;D=1;P0=table[m];delay(3);
                                if(m==2){l++;m=0;}
                                A=1;C=1;D=1;P0=table[l];delay(3);
                                if(l==2){k=3;l=0;}                                 //退出循環
                        }
                }
        }
}


作者: 呵呵噠1578    時間: 2017-9-13 16:58
不會啊
作者: GOD丿小男孩    時間: 2017-9-13 18:41
呵呵噠1578 發表于 2017-9-13 16:58
不會啊

我現在會了,代碼發在上面,有什么不懂的盡管問
作者: 18707072428    時間: 2017-9-13 21:00
138譯碼器對應的程序有問題,數字顯示錯亂
作者: acceracer    時間: 2017-9-13 22:28
看來被人解決了啊
作者: GOD丿小男孩    時間: 2017-9-13 22:36
18707072428 發表于 2017-9-13 21:00
138譯碼器對應的程序有問題,數字顯示錯亂

沒有問題的!對照真值表寫的。
作者: mengzhixinheng    時間: 2017-9-14 00:43
GOD丿小男孩 發表于 2017-9-13 15:20
非常感謝你的幫助,不過你這個代碼出來后是不顯示1的,只有0或者不顯示,應該是該顯示1的時候數碼管沒點 ...

我仿真了下沒問題呀,很完美。可能仿真電路有些差別
作者: mengzhixinheng    時間: 2017-9-14 00:46
GOD丿小男孩 發表于 2017-9-13 15:20
非常感謝你的幫助,不過你這個代碼出來后是不顯示1的,只有0或者不顯示,應該是該顯示1的時候數碼管沒點 ...

也可能是軟件差別,我用protues8.6,keil3.8a沒問題
作者: 偉大的科長    時間: 2017-9-17 21:05
樓主為什么要用delay呢??這樣寫的額程序很容易出問題,特別是對時序要求高的地方,建議用查詢的方法來控制時序動作。
作者: zl2168    時間: 2017-9-18 19:36
主要問題是沒理解138譯碼原理,從上述文字來看,現在可能還理解得不夠!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲综合色视频在线观看 | 成人黄色网址大全 | 精品欧美一区二区在线观看欧美熟 | 亚洲精品视频在线播放 | av黄色在线| 日韩av在线一区二区 | 久久网站免费视频 | www.国产视频 | 在线观看成人 | 亚洲色综合 | 精品亚洲一区二区三区四区五区高 | 成人精品一区 | 欧美日韩在线观看一区 | 日本一区精品 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 国产视频精品免费 | 天天色影视综合 | 国产日韩精品一区二区三区 | 成人超碰 | 久久久久亚洲国产| 国产免费一区二区三区 | 人人天天操 | 国产成人精品999在线观看 | 欧美日韩大片 | 91精品国产92| 懂色av色香蕉一区二区蜜桃 | 亚洲最大av网站 | 久久精品屋| caoporn国产精品免费公开 | 久久国产区 | 国产成人精品免高潮在线观看 | 精品美女视频在线观看免费软件 | 久久久久久网站 | 国产精品完整版 | av黄色免费在线观看 | 日韩三级一区 | 日韩亚洲一区二区 | 狠狠爱视频| 亚洲一区不卡在线 | 久久久999免费视频 999久久久久久久久6666 | 伊人久久国产 |