![]() |
發布時間: 2019-5-25 10:58
正文摘要:在keil中生成HEX文件后,用proteus仿真時, P1=0xfe;可以正常輸出; 而 j=0; if(j==0) { P1=0xfe; } 卻不能正常輸出???? |
51單片機,我用自制的試驗板,搭好外圍元件,插上仿真頭,硬件仿真,一般寫十幾行代碼,我就要仿真通過,無非就是設置斷點、單步執行、全速執行,只要有錯誤,很快就發現,AVR單片機用自制的JTAG仿真器仿真,雖然難用一些,也總比沒有要好,沒有硬件仿真器 |
不管是什么單片機,編程查錯效率最高的是硬件仿真,我從來沒有用過proteus,像51單片機,我用自制的試驗板,搭好外圍元件,插上仿真頭,硬件仿真,一般寫十幾行代碼,我就要仿真通過,無非就是設置斷點、單步執行、全速執行,只要有錯誤,很快就發現,AVR單片機用自制的JTAG仿真器仿真,雖然難用一些,也總比沒有要好,沒有硬件仿真器,我寧愿不編程序,查錯效率實在是太低了。 |
覺得是你P1=a[n]; 這里出了問題了吧 P1=a[n];這里的話數據只顯示了一瞬間就被P0=c[x-1];取代 這兩行之間插入一個延時就可以了。 if(j==0) { P1=a[n]; delay5ms(x); } P0=c[x-1]; delay5ms(x); |
既然j=0,那么肯定j==0,被C編譯器優化掉不執行這條語句,這是廢話語句,C編譯器不是傻瓜。你硬要執行,把優化等級降到最低,或者用 volatile定義j。 |
可能是單片機的驅動壞了 |
可能j==0這個條件不符合? |
zhanghyg 發表于 2019-5-25 15:17 這是源程序: #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code KEY_TABLE[]={0x11,0x21,0x12,0x22}; uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uchar code c[]={0xfe,0xfd,0xfb,0xf7,0xef}; void delay5ms(uint x) { uchar t,ms; ms=25*x; while(ms--) for(t=0;t<120;t++); } void delays() { uint s=10000;while(s--); } void main() { uchar n,x,temp,key,num,i,j; n=0; x=5; j=0; for(;;) { if(j==0) { P1=a[n]; } P0=c[x-1]; delay5ms(x); n=n+1; if(n==8) n=0; P3=0xf0; if(P3!=0xf0) { delays();P3=0xf0; if(P3!=0xf0) { temp=P3; P3=0x0f; key=temp|P3; key=0xff-key; for(i=0;i<4;i++) { if(key==KEY_TABLE) { num=i; break; } } if(num==0) j=0; if(num==1) j=n; if(num==2) x=x-1; if(num==3) x=x+1; } } } } 為什么這時的P1不能正常輸出??? |
f是不是溢出了 |
有可能是變量類型問題。。你試試把變量改成int型。或者改成:j=0x00;if(0x00==j){ P1=0xfe;}。當然,有用到P1,include單片機頭文件。 |
這要結合完整程序來看 |