本帖最后由 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;
- }
- }
复制代码
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)
复制代码
注意看0x0017之后的代码是编译器自动加上的,不知道为啥,代码如下:
- MOV R0,#0x7F
- CLR A
- MOV @R0,A
- DJNZ R0,C:001A
- MOV SP(0x81),#0x07
- LJMP main(C:0003)
复制代码
R0为127
A置零
零传送给地址为127的内存单元
把上面重复127次
。。。
又跳回开头的main函数入口继续执行(这里是死循环的更本原因)
最后改为汇编重新编写,代码如下:
- 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
复制代码
然后烧录程序,终于世界安静了,只执行了一次。8个灯从P1.0到P1.7依次点亮,目标达成。
使用12Mhz晶振,算了下延时为199660us,也就是0.199660s。
最后,弄不明白为什么编译器会自动加上那些多余的汇编代码
|