汇编和硬件关系很大的,跟C不一样的 T_0:PUSH PSW PUSH ACC LJMP MAIN POP ACC POP PSW RETI 像你这个中断程序,进入中断之后, LJMP MAIN就跳到别的地方去了,都不知道跑哪里去了 你这个程序一般人改不了,跳来跳去的,跟不上你的思路 这并不是一个很大程序,你最好是重新写一个,把每个子程序的功能写上,子程序之间加上分割线分好 这样也好找问题 |
不会上传图片。。。我自己来阐述一下什么问题吧,在倒计时那段程序显示的时候刚开始因为我只做了个位数的循环,没有把十位和更高位一起放进去循环,所以就会出现只有一个数字稳定显示的问题,其他的要么一秒闪一次,要么闪的频率眼睛看得到,所以我给两个数字放在一起套了一层循环,这样就都能稳定显示了。我师傅也和上面的大佬说了一样的话,说我程序写的太乱了。。。原谅我没学过汇编语言就直接上单片机。。。 |
Y_G_G 发表于 2019-12-23 22:26 好吧好吧,以后写程序会记得加的 ![]() |
注释,注释呀,人家写C语言都要有注释的,更不用说汇编了,没有注释,没有分清标号的,哪怕是只有几十行代码,别人看起来也是很难理解的 如果你是复制了别人的代码,最好也是自己给加上注释,关键部分加完注释,你基本上就知道这程序是怎么跑的了 CLR p2.7 CLR P2.6 CLR P2.5 CLR P2.4 CLR P2.3 CLR P2.2 CLR P2.1 CLR P2.0 LJMP START1 START1:SETB P1.5 你看一下这一段,这用不着那么多的CLR指令的, MOV P2,#000H就可以了 LJMP START1 LJMP START1这个标号就在下一条指令了,那LJMP指令就没有存在的意义了 LJMP WAIT WAIT: JNB TF0,WAIT这个地方也是一样的 这程序写这太随意了,一旦有什么问题,想找原因要找半天,如果是刚刚入门就更难了 |
这里是正确的代码,给后面来的人留条可能存在的活路,等我过两天实验报告写完会连图一起发上来 SECOND EQU 30H TCOUNT EQU 31H ORG 0000H LJMP START ORG 0013H LJMP T_0 ORG 0040H START:MOV SP,#60H SETB EX1 SETB IT1 SETB EA MOV R0,#00H MOV R1,#00H MOV R2,#00H MOV R3,#00H MOV DPTR,#TABLE LCALL DISP1 DISP1:MOV A,R0 ORL P2,#00001110B ANL P2,#11111110B MOVC A,@A+DPTR MOV P0,A LCALL DELAY MOV A,R1 ORL P2,#00001101B ANL P2,#11111101B MOVC A,@A+DPTR MOV P0,A LCALL DELAY MOV A,R2 ORL P2,#00001011B ANL P2,#11111011B MOVC A,@A+DPTR MOV P0,A LCALL DELAY MOV A,R3 ORL P2,#00000111B ANL P2,#11110111B MOVC A,@A+DPTR MOV P0,A LCALL DELAY RET DONE: SJMP DONE MAIN: MOV SECOND,#10 MOV TCOUNT,#00 MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 DISP: MOV A,SECOND MOV B,#10 DIV AB MOV R0,A MOV R1,B MOV DPTR,#TABLE MOV R4,#1 DISP2: MOV R3,#100 DISP3: MOV A,R0 ORL P2,#11110101B ANL P2,#11111101B MOVC A,@A+DPTR MOV P0,A LCALL DELAY2 MOV A,R1 ORL P2,#11111011B ANL P2,#11111011B MOVC A,@A+DPTR MOV P0,A LCALL DELAY2 DJNZ R3,DISP3 LJMP WAIT WAIT: JNB TF0,WAIT CLR TF0 MOV TH0,#3CH MOV TL0,#0B0H DEC SECOND MOV A,SECOND CJNE A,#00,DISP MOV SECOND,#10 CLR p2.7 CLR P2.6 CLR P2.5 CLR P2.4 CLR P2.3 CLR P2.2 CLR P2.1 CLR P2.0 LJMP START1 START1:SETB P1.5 LCALL DELAY1 CLR P1.5 LCALL DELAY1 LJMP START1 T_0:PUSH PSW PUSH ACC LCALL MAIN POP ACC POP PSW RETI DELAY:MOV R5,#25 D1:MOV R4,#25 D2:DJNZ R4,D2 DJNZ R5,D1 RET DELAY1:MOV R6,#15 D3:MOV R7,#15 D4:DJNZ R7,D4 DJNZ R6,D3 RET DELAY2:MOV R5,#75 D5:MOV R4,#200 D6:DJNZ R4,D2 DJNZ R5,D1 RET TABLE: DB 03FH,006H,05BH,04FH,066H DB 06DH,07DH,007H,07FH,06FH END |
代码在整齐 主要的指令后面要加注释,你整个程序下来,一条注释都没有,不说别人,就是你自己过几天再来看都不一定知道你写了什么呀参考一下我的,自己改动一下吧,自己是可以慢慢找到问题的 ![]() |