![]() |
發布時間: 2017-9-10 21:30
正文摘要:我是想讓8個數碼管同時顯示1到F的連續變化,即顯示123456789abcdef,可是總是顯示不出來,要不就全亮不顯示,要不就亮第一個或者最后一個。難受,就是寫不出來;勞請大神幫忙;我寫的代碼如圖,共陰數碼管,鎖存器控 ... |
共陰共陽沒有搞混吧 |
路過看回復 |
GOD丿小男孩 發表于 2017-9-11 08:40 我是說你的switch語句錯了,需要你自己查一下語法,自己改正,這樣才能真正掌握知識。 |
延時時間控制好試試 |
mengzhixinheng 發表于 2017-9-11 15:28 啊!弄懂了之后才看到你這句話的意思,謝謝了 |
ahshmj 發表于 2017-9-11 21:33 是的,不過是同時依次顯示,問題已經解決了,感謝 |
“想讓8個數碼管同時顯示1到F的連續變化,即顯示123456789abcdef”, 你敘述的文字看不明白。8個數碼管,“同時顯示”16個字符? |
mengzhixinheng 發表于 2017-9-11 20:50 后面那個又加了一個for語句的確實可以了,謝謝大神,我想想是為什么,萬分感謝 |
mengzhixinheng 發表于 2017-9-11 20:41 確實不行,出來的結果是最后一個燈正常,其他的燈一閃而過,然而我把最后的延時函數去掉之后,就正常了,每個燈顯示的數字一樣,同步變化,但是速度太快,不美觀,于是我把加在table后面的延時函數變成30,于是又不正常了,燈不同時亮 |
端口你自己改就行 |
這個還有問題的話就見鬼了 |
#include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit A1=P1^2; sbit B1=P1^3; sbit C1=P1^4; 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 main() { while(1) { display(); } } |
#include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit A1=P1^2; sbit B1=P1^3; sbit C1=P1^4; 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; for(X=0;X<16;X++) { 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); delayms(2000); } } void main() { while(1) { display(); } } |
GOD丿小男孩 發表于 2017-9-11 17:17 不可能 |
看一下這個芯片的詳細介紹 |
mengzhixinheng 發表于 2017-9-11 15:28 但那樣還是沒用啊 |
gaozhaohong 發表于 2017-9-11 15:19 謝謝,大家互相幫助,互相進步。沒有誰是一步登天的,都是慢慢來的 |
漫步經心 發表于 2017-9-11 14:00 發下面了,謝謝 |
硬件電路發出來看看唄 |
不倒翁.WZT 發表于 2017-9-11 06:59 額,最大的問題是我這個是由138譯碼器控制數碼管亮的,也就是說不能控制全亮。必須通過循環控制每一個亮,然而這樣的話時間必須足夠小人眼才能分辨不出來。 |
學習了,謝謝 |
gaochang000000 發表于 2017-9-11 02:05 是控制哪個數碼管亮,我這個數碼管是由138譯碼器控制的,就是由p22,p23,p24三個管腳控制 |
闊愛的釗釗 發表于 2017-9-10 23:49 嗯,完整的,switch中是控制哪個數碼管亮,table是控制顯示什么 |
yzwzfyz 發表于 2017-9-10 23:12 ?什么意思呢 |
本帖最后由 zl2168 于 2017-9-11 21:47 編輯 關鍵是要弄清動態顯示的基本原理,弄清后,你要怎么顯示就怎么顯示。盲目實踐,事倍功半。 給你介紹2本書,張志良編著的:《80C51單片機實用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學習51單片機原理,程序(雙解c和匯編)語句條條有注解,便于閱讀理解,便于自學。《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行,可演示,可觀測,程序語句條條有注解。 與其他書比較一下,有比較才能有鑒別!絕不忽悠你! 其中,有7個案例是動態顯示: 實例56 PNP晶體管選通3位共陽LED數碼管動態顯示; 實例57 74LS139選通4位LED數碼管動態顯示; ![]() ![]() 實例58 74LS138選通8位LED數碼管動態顯示; ![]() ![]() 實例59 74LS595串行選通8位LED數碼管動態顯示; 實例60 8255A擴展8位LED數碼管動態顯示; 實例63 8155擴展8位LED數碼管動態顯示; 實例64 MAX7221控制8位LED數碼管動態顯示。 ![]() ![]() ![]() ![]() ![]() ![]() |
學習不能閉門造車,應借鑒他人成功的例子。找來一個類似的程序,將其看懂,再試探著進行修改,當你修改成功了,類似的程序你也都懂了。下面給你一個你需要的成功的程序,請參考。 /*--頭文件--*/ #include<reg51.h> //包含特殊功能寄存器頭文件 /*--宏定義--*/ #define uint unsigned int //定義uint=unsigned int #define uchar unsigned char //定義uchar=unsigned char /*--定義全局變量--*/ uint code Table_P0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; //段碼表0-7 uint code Table_P0AF[]={0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段碼表8-F /*--延時子程序*/ void delay(uint xms) //延時子程序 { uint i,j; //設定i、j為無符號16位整型數據 for(i=xms; i>0; i--) //第一級延時循環 for(j=110; j>0; j--); //第二級延時循環 } /*--主程序*/ void main(void) //主函數,一個程序中必須有一個且只能有一個主程序。這是一個無返回值無參數函數 { while(1) //大循環,沒有這個大循環程序只運行一次就停止了 { uchar i,j; //設定i為無符號8位字符型數據 for(i=0; i<8; i++) //選擇段碼值 { P1=0x00; //將8位數碼管全顯示數據送位選-P1 P0=Table_P0[i]; //根據for選擇段碼i值,送段選-P0 delay(800); //調用延時子程序 } for(j=0; j<8; j++) //選擇段碼值 { P0=Table_P0AF[j]; //根據for選擇段碼i值,送段選-P0 delay(800); //調用延時子程序 } } } |
額。。。。代碼是完整的嗎? |
換個專業試試 |