大家看一下这个程序,我想让单片机显示RIGHT,但是一直显示ERROR:
显示子程序DISPLAY是正确的,大家不用看了,就是比较密码子程序TEST的问题?
我测试时把最后三行改为 :R: SETB MMRE RET END 显示RIGHT,这时程序的执行流程与原先相同(不关程序逻辑正误问题)。
程序: MMRE EQU 00H ;密码正确与否标志,用位寻址区第一位为标志
ORG 0050H TABLE0: DB 79H,77H,77H,3FH,77H ;显示:ERROR TABLE1: DB 77H,30H,7DH,76H,02H ;显示:RIGHT TABLE2: DB 07H,0BH,0FH,13H,17H,1BH,1FH,23H ;密码:1 2 3 4 5 6 7 8
;-------------------------------主程序入口------------------------------------- ORG 0000H LJMP MAIN
ORG 0100H MAIN: MOV 30H,#07H ;用八字节存储正确的密码 MOV 31H,#0BH MOV 32H,#0FH MOV 33H,#13H MOV 34H,#17H MOV 35H,#1BH MOV 36H,#1FH MOV 37H,#23H
LCALL TEST ;就这个比较密码子程序的问题?
MOV C,MMRE ;根据标志位选择不同的显示内容 JC M2 MOV DPTR,#TABLE0 ;显示:ERROR SJMP M3 M2: MOV DPTR,#TABLE1 ;显示:RIGHT M3: MOV R3,#5 LCALL DISPLAY ;调用显示子程序,循环 LJMP MAIN
;--------------------------------显示子程序------------------------------------ DISPLAY: MOV P2,#0 ;清0复位 ANL P1,#0F8H ;用与保护P1口高5位不受影响,将低三位清0, ;选择第一个数码管 MOV R4,#0 L2: MOV A,R4 MOVC A,@A+DPTR ;用查表法得到A对应在表中的段值 MOV P2,A ;输出显示 LCALL DELAY0 ;加入延时,使每位显示保持一段时间 MOV P2,#0 ;延时过后,清0,为下一位显示做准备 INC R4 ;移到下一个数据 DJNZ R3,L3 ;显示完指定个数返回,否则进入下一个显示 RET L3: INC P1 ;选择下一位数码管 SJMP L2
;---------------------------------延时子程序----------------------------------- DELAY0: MOV R5,#20 DJNZ R5,$ RET ;----------------------------测试密码正确与否子程序---------------------------- TEST: MOV R0,#30H MOV DPTR,#TABLE2 MOV R2,#0 COMP: MOV A,R2 MOVC A,@A+DPTR MOV 0FFH,A MOV A,@R0 CJNE A,0FFH,R INC R0 INC R2 CJNE R0,#38H,COMP SETB MMRE R: RET
END
/********************************** END OF FILE ******************************/
|