![]() |
發布時間: 2019-6-24 20:18
正文摘要:單片機源程序如下: #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit DE=P2^1; sbit WE=P2^2; uint m,m0,m1,m2,gew,shiw; ucha ... |
從現象反推出產生現象的原因是科學定律;這在程序調試中是最常用的分析方法,中醫也是這樣從病癥去反推產生病癥的原因從而對證治病,西醫何嘗不是從果究因去尋找各種病菌呢都一樣,從物理學上來說也是從果推因尋找現象背后的成因,如打雷閃電緣何產生去究其因,類推之化學界生物界等,又如破案從犯罪現場種種證據搜集去推導出犯罪的思想動機,總之從現象推導原因普遍存在于方方面面,因此是科學規律. |
其實寫法是正確的,只是延時和消隱的問題, 主要是調好延時,仿真并非實際,仿真調得最好,實際不一定OK。 WE=1; P1=xxxxxx; delay(xxx); P1=0xff; WE=0; delay(xxx); |
如論壇有人回復我的帖子說FOR循環不需要聲明變量,而我用WHILE需要聲明變量,這樣可笑荒謬的回復,他忘記了變量使用前需要聲明的基本原則了,試問變量不聲明FOR循環中如何使用?這就是典型的紙上談兵范. 至于鎖存具體如何工作鎖存數據脈沖上升沿下降沿等就不贅述,有興趣的自己去深究. |
紙上談兵編寫的教科書早該改了,P1=0xfe; WE=1; WE=0;我這樣寫的才是正確的,無論是從理論或仿真或實物都能正確無誤執行,準備好數據打開鎖存關閉鎖存送入的是的的確確想要的正確的值; 而教科書WE=1; P1=0xfe; WE=0;這寫在打開鎖存瞬間寫入的是上一個循環后存留的值,再送入想要的值就造成種種魅像,看不到某些數碼顯示或出現魅影(鬼影)或數碼顯示黯淡等等,如有的說使用CHAR寫延時比較節約內存,殊不知使用2個CHAR與使用1個INT是一樣的,因此教科書其實在紙上談兵的人編寫充斥種種誤人子弟的謬論. |
xianfajushi 發表于 2019-6-25 10:08 感謝幫助,這樣修改確實解決了這個問題。請問這是什么問題?這是仿真軟件的問題嗎,我看書中的格式都是先開鎖存輸入數據再關鎖存這種順序。。。為什么在proteus里要改成先送數據再開關鎖存? |
okwtony 發表于 2019-6-25 10:08 樓主的延時程序寫得不規范,是不是影響的因素不確定。 void delay(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=110;j>ms;j--); //通常寫法for(j=110;j>0;j--); } |
在仿真中確實存在修改一下代碼即可 P1=0xfe; WE=1; WE=0; |
wulin 發表于 2019-6-25 05:38 感謝幫助,我試了修改delay,比較低的情況確實不會有閃爍的問題,但是還是會丟失個別數字。。。如果延長delay到100或者200這樣,雖然顯示會閃爍,但是1和5會顯示出來,盡管1和5閃爍比其他數字更嚴重,反而因為閃爍才能看到這兩個數字。。。真是怪事。。 |
沒有發現樓主所述現象,程序也沒有嚴重問題。只是顯示程序中延時delay(20)太長,有可能在實物中數碼管會閃爍。建議延時不大于2ms。![]() |