![]() |
發(fā)布時間: 2022-10-22 15:49
正文摘要:利用動態(tài)掃描的方式在6個數(shù)碼管上顯示出穩(wěn)定的654321; 但是如圖6個數(shù)碼管顯示出錯了; 單片機代碼如下,請問是哪里的問題 #include<reg52.h> #include<intrins.h> #define uint unsigned int #define ... |
86爆缸 發(fā)表于 2022-10-23 12:15 試了下還是不行,我想我這個應該是定義的變量多了,掃描時間又短,段選位選多個變量造成的亂碼? |
wulin 發(fā)表于 2022-10-23 08:22 我找到我代碼的問題了,位選賦值那的if語句用錯了,輸出結果就是6個數(shù)碼管流水燈亮,然后同時每個數(shù)碼管都賦值6,5,4,3,2,1;難怪我這都是亂碼了 |
wulin 發(fā)表于 2022-10-23 08:22 大佬你的代碼我能看懂沒問題,但我自己的代碼試了下延長掃描周期,但就是沒法顯示和你一樣的效果; 找不到我的代碼錯在哪里了 |
wulin 發(fā)表于 2022-10-23 08:22 謝謝大佬,你的代碼寫的很漂亮,我定義的變量還是多了; 不過消影應該是P0=0xff,我這個是共陰極數(shù)碼管; 同時我試了下用不用消影的區(qū)別,數(shù)碼管顯示都正常,沒有亂碼 |
zhxiufan 發(fā)表于 2022-10-23 09:06 先位碼后段碼的話,段碼未賦初值,當dula=1的時候,P0還是位選的數(shù)據(jù),會先出現(xiàn)亂碼吧,所以我才先段碼后位碼的 |
定時器定時時間太短,將500改為2000到5000之間。另外顯示應該先位碼再段碼 |
86爆缸 發(fā)表于 2022-10-22 22:15 用位消隱和段消隱都一樣有效,樓主用500us周期掃描速度太快,削弱了消隱效果。通常掃描一輪不低于20ms不會看出閃爍。一般每個數(shù)碼管顯示1ms,6ms完成一輪掃描為宜。 ![]() 代碼修改如下:
|
lkc8210 發(fā)表于 2022-10-22 20:29 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個數(shù)碼管輪流顯示 wela=0; if(numwe==0xbf) numwe=0xfe; |
P0=0xFF;消影消了個寂 正確寫法該是 wela=1 P0=0xff wela=0 dula=1 P0=table dula=0 wela=1 P0=numwe wela=0 |
上面是郭天祥老師的解法 |
/*******************************************************************/ /* TX-1C單片機實驗板實驗例程 */ /*******************************************************************/ /* 利用動態(tài)掃描方法在六位數(shù)碼管上顯示出穩(wěn)定的654321. 時鐘頻率為11.0592M */ /*********************************************************/ #include<reg52.h> //52單片機頭文件 #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ù)前關閉所有顯示,防止打開位選鎖存后段選數(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ù) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } |
一事無成 發(fā)表于 2022-10-22 18:52 芯片是89C52RC;P0=table[numdu]這我就是想不明白哪里出錯了;中斷程序設置的是5ms,來達到數(shù)碼管動態(tài)顯示的目的; 這個是郭天祥10天入門單片機里的例題,這個出錯的是我的解法 |
講真看不懂你的中斷程序,這個num有啥用?還有P0=table[numdu];中的numdu確定是在1-6之間循環(huán)?另外把驅(qū)動芯片型號發(fā)一下。 |
Powered by 單片機教程網(wǎng)