本帖最后由 nicktf 于 2017-2-6 23:23 編輯
最后自己找到原因了。
換成XP用Keil uv2,去掉延時代碼,如下
- #include <STC89C5xRC.H>
- void main(void)
- {
- unsigned char i;
- B=0xFE;
- for(i=8;i>0;i--)
- {
- P1=B;
- B<<=1;
- B=B|0x1;
- }
- }
復(fù)制代碼
Debug后 匯編代碼如下:
- C:0x0003 75F0FE MOV B(0xF0),#0xFE
- C:0x0006 7F08 MOV R7,#0x08
- C:0x0008 85F090 MOV P1(0x90),B(0xF0)
- C:0x000B E5F0 MOV A,B(0xF0)
- C:0x000D 25E0 ADD A,ACC(0xE0)
- C:0x000F F5F0 MOV B(0xF0),A
- C:0x0011 43F001 ORL B(0xF0),#0x01
- C:0x0014 DFF2 DJNZ R7,C:0008
- C:0x0016 22 RET
- C:0x0017 787F MOV R0,#0x7F
- C:0x0019 E4 CLR A
- C:0x001A F6 MOV @R0,A
- C:0x001B D8FD DJNZ R0,C:001A
- C:0x001D 758107 MOV SP(0x81),#0x07
- C:0x0020 020003 LJMP main(C:0003)
復(fù)制代碼
注意看0x0017之后的代碼是編譯器自動加上的,不知道為啥,代碼如下:
- MOV R0,#0x7F
- CLR A
- MOV @R0,A
- DJNZ R0,C:001A
- MOV SP(0x81),#0x07
- LJMP main(C:0003)
復(fù)制代碼
R0為127
A置零
零傳送給地址為127的內(nèi)存單元
把上面重復(fù)127次
。。。
又跳回開頭的main函數(shù)入口繼續(xù)執(zhí)行(這里是死循環(huán)的更本原因)
最后改為匯編重新編寫,代碼如下:
- ORG 0
- START:MOV A,#0FEH
- MOV R3,#8
- LOOP:MOV P1,A
- CALL DELAY
- RL A
- DJNZ R3,LOOP
- DELAY:MOV R4,#20
- D1:MOV R5,#20
- D2:MOV R6,#248
- DJNZ R6,$
- DJNZ R5,D2
- DJNZ R4,D1
- RET
- END
復(fù)制代碼
然后燒錄程序,終于世界安靜了,只執(zhí)行了一次。8個燈從P1.0到P1.7依次點亮,目標達成。
使用12Mhz晶振,算了下延時為199660us,也就是0.199660s。
最后,弄不明白為什么編譯器會自動加上那些多余的匯編代碼
|