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