本人按照EDN-51实验板的线路,做了个4位八段数码管的十进制加计数仿真实验,程序采用汇编语言编写。此程序在仿真与EDN-51实验板上均通过。注:仿真程序与EDN实验板程序有个地方不一样,这是因为动态扫描的时间不能相同,在仿真上的时间要稍长点,EDN-51实验板上就要短一点,延时子程序STS00中的60H分别是#013H与#003H。仿真图中的数码管位驱动采用74HC04,如按EDN-51板上用想同的PNP三极管驱动,则无法正常显示。程序共分6块,STAR0为数据初始化,STAR1为0-9的数据处,STAR2为计数子程序,STAR3为动态显示子程序,STAR4为按键扫描子程序,最后一个为是延时子程序。由于EDN-51实验板上没装BCD译码器,所以编写程序比较烦琐。
程序如下:
ORG 0000H ;地址 0000H
LJMP STAR0 ;转 STAR0
ORG 0300H ;地址 0300H
STAR0: CLR 00 ;位 00 清 0
MOV P1,#0FFH ;#0FFH-->P1
MOV P2,#0FH ;#0FH-->P2
MOV P0,#0FFH ;#0FFH-->P0
MOV 30H,#0C0H ;#0C0H-->30H 0-->30H
MOV 31H,#0C0H ;#0C0H-->31H 0-->31H
MOV 32H,#0C0H ;0C0H-->32H 0-->32H
MOV 33H,#0C0H ;#0C0H-->33H 0-->33H
STAR1: MOV 40H,#0C0H ;#0C0H-->40H
MOV 41H,#0F9H ;#0F9H-->41H
MOV 42H,#0A4H ;#0A4H-->42H
MOV 43H,#0B0H ;#0B0H-->43H
MOV 44H,#99H ;#99H-->44H
MOV 45H,#92H ;#92H-->45H
MOV 46H,#82H ;#82H-->46H
MOV 47H,#0F8H ;#0F8H-->47H
MOV 48H,#80H ;#80H-->48H
MOV 49H,#90H ;#90H-->49H
MOV R1,#00H ;#00H-->R1
MOV R2,#00H ;#00H-->R2
MOV R3,#00H ;#00H-->R3
MOV R4,#00H ;#00H-->R4
LJMP STAR3 ;转 STAR3
NOP
STAR2: INC R1 ;R1+1
U300: CJNE R1,#00H,U301 ;R1 与 #00H 比较不等则转 U301
MOV 30H,40H ;41H-->30H
AJMP U3END ;转 U3END
U301: CJNE R1,#01H,U302 ;R1 与 #01H 比较不等则转 U302
MOV 30H,41H ;41H-->30H
AJMP U3END ;转 U3END
U302: CJNE R1,#02H,U303 ;R1 与 #02H 比较不等则转 U303
MOV 30H,42H ;42H-->30H
AJMP U3END ;转 U3END
U303: CJNE R1,#03H,U304 ;R1 与 #03H 比较不等则转 U304
MOV 30H,43H ;43H-->30H
AJMP U3END ;转 U3END
U304: CJNE R1,#04H,U305 ;R1 与 #04H 比较不等则转 U305
MOV 30H,44H ;44H-->30H
AJMP U3END ;转 U3END
U305: CJNE R1,#05H,U306 ;R1 与 #05H 比较不等则转 U306
MOV 30H,45H ;45H-->30H
AJMP U3END ;转 U3END
U306: CJNE R1,#06H,U307 ;R1 与 #06H 比较不等则转 U307
MOV 30H,46H ;46H-->30H
AJMP U3END ; 转 U3END
U307: CJNE R1,#07H,U308 ;R1 与 #07H 比较不等则转 U308
MOV 30H,47H ;47H-->30H
AJMP U3END ;转 U3END
U308: CJNE R1,#08H,U309 ;R1 与 #08H 比较不等则转 U309
MOV 30H,48H ;48H-->30H
AJMP U3END ;转 U3END
U309: CJNE R1,#09H,U30A ;R1 与 #09H 比较不等则转 U30A
MOV 30H,49H ;49H-->30H
AJMP U3END ;转 U3END
U30A: CJNE R1,#0AH,U310 ;R1 与 #0AH 比较不等则转 U310
U310: MOV 30H,40H ;40H-->30H
MOV R1,#00H ;#00H-->R1
INC R2 ;R2+1
CJNE R2,#00H,U311 ;R2 与 #00H 比较不等则转 U311
MOV 31H,40H ;40H-->31H
AJMP U3END ;转 U3END
U311: CJNE R2,#01H,U312 ;R2 与 #01H 比较不等则转 U312
MOV 31H,41H ;41H-->31H
AJMP U3END ;转 U3END
U312: CJNE R2,#02H,U313 ;R2 与 #02H 比较不等则转 U313
MOV 31H,42H ;42H-->31H
AJMP U3END ;转 U3END
U313: CJNE R2,#03H,U314 ;R2 与 #03H 比较不等则转 U314
MOV 31H,43H ;43H-->31H
AJMP U3END ;转 U3END
U314: CJNE R2,#04H,U315 ;R2 与 #04H 比较不等则转 U315
MOV 31H,44H ;44H-->31H
AJMP U3END ;转 U3END
U315: CJNE R2,#05H,U316 ;R2 与 #05H 比较不等则转 U316
MOV 31H,45H ;45H-->31H
AJMP U3END ;转 U3END
U316: CJNE R2,#06H,U317 ;R2 与 #06H 比较不等则转 U317
MOV 31H,46H ;46H-->31H
AJMP U3END ;转 U3END
U317: CJNE R2,#07H,U318 ;R2 与 #07H 比较不等则转 U318
MOV 31H,47H ;47H-->31H
AJMP U3END ;转 U3END
U318: CJNE R2,#08H,U319 ;R2 与 #08H 比较不等则转 U319
MOV 31H,48H ;48H-->31H
AJMP U3END ;转 U3END
U319: CJNE R2,#09H,U31A ;R2 与 #09H 比较不等则转 U31A
MOV 31H,49H ;49H-->31H
AJMP U3END ;转 U3END
U31A: CJNE R2,#0AH,U320 ;R2 与 #0AH 比较不等则转 U320
U320: MOV 31H,40H ;40H-->31H
MOV R2,#00H ;#00H-->R2
INC R3 ;R3+1
CJNE R3,#00H,U321 ;R3 与 #00H 比较不等则转 U321
MOV 32H,40H ;40H-->32H
AJMP U3END ;转 U3END
U321: CJNE R3,#01H,U322 ;R3 与 #01H 比较不等则转 U322
MOV 32H,41H ;41H-->32H
AJMP U3END ;转 U3END
U322: CJNE R3,#02H,U323 ;R3 与 #02H 比较不等则转 U323
MOV 32H,42H ;42H-->32H
AJMP U3END ;转 U3END
U323: CJNE R3,#03H,U324 ;R3 与 #03H 比较不等则转 U324
MOV 32H,43H ;43H-->32H
AJMP U3END ;转 U3END
U324: CJNE R3,#04H,U325 ;R3 与 #04H 比较不等则转 U325
MOV 32H,44H ;44H-->32H
AJMP U3END ;转 U3END
U325: CJNE R3,#05H,U326 ;R3 与 #05H 比较不等则转 U326
MOV 32H,45H ;45H-->32H
AJMP U3END ;转 U3END
U326: CJNE R3,#06H,U327 ;R3 与 #06H 比较不等则转 U327
MOV 32H,46H ;46H-->32H
AJMP U3END ;转 U3END
U327: CJNE R3,#07H,U328 ;R3 与 #07H 比较不等则转 U328
MOV 32H,47H ;47H-->32H
AJMP U3END ;转 U3END
U328: CJNE R3,#08H,U329 ;R3 与 #08H 比较不等则转 U329
MOV 32H,48H ;48H-->32H
AJMP U3END ;转 U3END
U329: CJNE R3,#09H,U32A ;R3 与 #09H 比较不等则转 U32A
MOV 32H,49H ;49H-->32H
AJMP U3END ;转 U3END
U32A: CJNE R3,#0AH,U330 ;R3 与 #0AH 比较不等则转 U330
U330: MOV 32H,40H ;40H-->32H
MOV R3,#00H ;#00H-->R3
INC R4 ;R4+1
CJNE R4,#00H,U331 ;R4 与 #00H 比较不等则转 U331
MOV 33H,40H ;40H-->33H
AJMP U3END ;转 U3END
U331: CJNE R4,#01H,U332 ;R4 与 #01H 比较不等则转 U332
MOV 33H,41H ;41H-->33H
AJMP U3END ;转 U3END
U332: CJNE R4,#02H,U333 ;R4 与 #02H 比较不等则转 U333
MOV 33H,42H ;42H-->33H
AJMP U3END ;转 U3END
U333: CJNE R4,#03H,U334 ;R4 与 #03H 比较不等则转 U334
MOV 33H,43H ;43H-->33H
AJMP U3END ;转 U3END
U334: CJNE R4,#04H,U335 ;R4 与 #04H 比较不等则转 U335
MOV 33H,44H ;44H-->33H
AJMP U3END ;转 U3END
U335: CJNE R4,#05H,U336 ;R4 与 #05H 比较不等则转 U336
MOV 33H,45H ;45H-->33H
AJMP U3END ;转 U3END
U336: CJNE R4,#06H,U337 ;R4 与 #06H 比较不等则转 U337
MOV 33H,46H ;46H-->33H
AJMP U3END ;转 U3END
U337: CJNE R4,#07H,U338 ;R4 与 #07H 比较不等则转 U338
MOV 33H,47H ;47H-->33H
AJMP U3END ;转 U3END
U338: CJNE R4,#08H,U339 ;R4 与 #08H 比较不等则转 U339
MOV 33H,48H ;48H-->33H
AJMP U3END ;转 U3END
U339: CJNE R4,#09H,U33A ;R4 与 #09H 比较不等则转 U33A
MOV 33H,49H ;49H-->33H
AJMP U3END ;转 U3END
U33A: CJNE R4,#0AH,U33B ;R4 与 #0AH 比较不等则转 U33B
U33B: MOV 33H,40H ;40H-->33H
MOV R4,#00H ;#00H-->R4
U3END: RET ;子程序调用返回
NOP
STAR3: MOV P1,#0FFH ;#0FFH-->P1
MOV P1,#0F7H ;#0F7H-->P1
MOV P0,30H ;30H-->P0
LCALL STAR4 ;调子程序 STAR4
LCALL STS00 ;调延时子程序 STS00
MOV P1,#0FFH ;#0FFH-->P1
MOV P1,#0FBH ;#0FBH-->P1
MOV P0,31H ;31H-->P0
LCALL STAR4 ;调子程序 STAR4
LCALL STS00 ;调延时子程序 STS00
MOV P1,#0FFH ;#0FFH-->P1
MOV P1,#0FDH ;#0FDH-->P1
MOV P0,32H ;32H-->P0
LCALL STAR4 ;调子程序 STAR4
LCALL STS00 ;调延时子程序 STS00
MOV P1,#0FFH ;#0FFH-->P1
MOV P1,#0FEH ;#0FEH-->P1
MOV P0,33H ;33H-->P0
LCALL STAR4 ;调子程序 STAR4
LCALL STS00 ;调延时子程序 STS00
SJMP STAR3 ;转 STAR3
NOP
STAR4: JNB P2.0,ST1 ;P2.0=0 转 ST1
CLR 00 ;位 00 清 0
SJMP ST3 ;转ST3
ST1: JNB 00,ST2 ;位 00=0 转 ST2
SJMP ST3 ;转 ST3
ST2: LCALL STAR2 ;调子程序 STAR2
SETB 00 ;位 00 置 1
ST3: RET ;子程序调用返回
NOP
ORG 0100H ;地址 0100H
STS00: MOV 60H,#013H ;#013H-->60H (211)
DE001: MOV 61H,#0FFH ;#0FFH-->61H (255)
DE002: DJNZ 61H,DE002 ;61H 减 1 不等于 0 转 DE002
DJNZ 60H,DE001 ;60H 减 1 不等于 0 转 DE001
RET ;子程序调用返回
NOP
STS01: MOV 62H,#0D3H ;#0D3H-->62H (211)
DE011: MOV 63H,#0FFH ;#0FFH-->63H (255)
DE012: DJNZ 63H,DE012 ;63H 减 1 不等于 0 转 DE012
DJNZ 62H,DE011 ;62H 减 1 不等于 0 转 DE011
RET ;子程序调用返回
NOP
STS02: MOV 64H,#0D3H ;#0D3H-->64H (211)
DE021: MOV 65H,#0FFH ;#0FFH-->65H (255)
DE022: DJNZ 65H,DE022 ;65H 减 1 不等于 0 转 DE022
DJNZ 64H,DE021 ;64H 减 1 不等于 0 转 DE021
RET ;子程序调用返回
NOP
STS03: MOV 66H,#0D3H ;#0D3H-->66H (211)
DE031: MOV 67H,#0FFH ;#0FFH-->67H (255)
DE032: DJNZ 67H,DE032 ;67H 减 1 不等于 0 转 DE032
DJNZ 66H,DE031 ;66H 减 1 不等于 0 转 DE031
RET ;子程序调用返回
NOP
STS04: MOV 68H,#0D3H ;#0D3H-->68H (211)
DE041: MOV 69H,#0FFH ;#0FFH-->69H (255)
DE042: DJNZ 69H,DE042 ;69H 减 1 不等于 0 转 DE042
DJNZ 68H,DE041 ;68H 减 1 不等于 0 转 DE041
RET ;子程序调用返回
NOP
STS05: MOV 6AH,#0D3H ;#0D3H-->6AH (211)
DE051: MOV 6BH,#0FFH ;#0FFH-->6BH (255)
DE052: DJNZ 6BH,DE052 ;6BH 减 1 不等于 0 转 DE052
DJNZ 6AH,DE051 ;6AH 减 1 不等于 0 转 DE051
RET ;子程序调用返回
NOP
STS06: MOV 6CH,#0D3H ;#0D3H-->6CH (211)
DE061: MOV 6DH,#0FFH ;#0FFH-->6DH (255)
DE062: DJNZ 6DH,DE062 ;6DH 减 1 不等于 0 转 DE062
DJNZ 6CH,DE061 ;6CH 减 1 不等于 0 转 DE061
RET ;子程序调用返回
NOP
STS07: MOV 6EH,#0D3H ;#0D3H-->6EH (211)
DE071: MOV 6FH,#0FFH ;#0FFH-->6FH (255)
DE072: DJNZ 6FH,DE072 ;6FH 减 1 不等于 0 转 DE072
DJNZ 6EH,DE071 ;6EH 减 1 不等于 0 转 DE071
RET ;子程序调用返回
NOP
STS08: MOV 70H,#0D3H ;#0D3H-->70H (211)
DE081: MOV 71H,#0FFH ;#0FFH-->71H (255)
DE082: DJNZ 71H,DE082 ;71H 减 1 不等于 0 转 DE082
DJNZ 70H,DE081 ;70H 减 1 不等于 0 转 DE081
RET ;子程序调用返回
NOP
STS09: MOV 72H,#0D3H ;#0D3H-->72H (211)
DE091: MOV 73H,#0FFH ;#0FFH-->73H (255)
DE092: DJNZ 73H,DE092 ;73H 减 1 不等于 0 转 DE092
DJNZ 72H,DE091 ;72H 减 1 不等于 0 转 DE091
RET ;子程序调用返回
NOP
STS0A: MOV 74H,#0D3H ;#0D3H-->74H (211)
DE0A1: MOV 75H,#0FFH ;#0FFH-->75H (255)
DE0A2: DJNZ 75H,DE0A2 ;75H 减 1 不等于 0 转 DE0A2
DJNZ 74H,DE0A1 ;74H 减 1 不等于 0 转 DE0A1
RET ;子程序调用返回
NOP
STS0B: MOV 76H,#0D3H ;#0D3H-->76H (211)
DE0B1: MOV 77H,#0FFH ;#0FFH-->77H (255)
DE0B2: DJNZ 77H,DE0B2 ;77H 减 1 不等于 0 转 DE0B2
DJNZ 76H,DE0B1 ;76H 减 1 不等于 0 转 DE0B1
RET ;子程序调用返回
NOP
STS0C: MOV 78H,#0D3H ;#0D3H-->78H (211)
DE0C1: MOV 79H,#0FFH ;#0FFH-->79H (255)
DE0C2: DJNZ 79H,DE0C2 ;79H 减 1 不等于 0 转 DE0C2
DJNZ 78H,DE0C1 ;78H 减 1 不等于 0 转 DE0C1
RET ;子程序调用返回
NOP
STS0D: MOV 7AH,#0D3H ;#0D3H-->7AH (211)
DE0D1: MOV 7BH,#0FFH ;#0FFH-->7BH (255)
DE0D2: DJNZ 7BH,DE0D2 ;7BH 减 1 不等于 0 转 DE0D2
DJNZ 7AH,DE0D1 ;7AH 减 1 不等于 0 转 DE0D1
RET ;子程序调用返回
NOP
STS0E: MOV 7CH,#0D3H ;#0D3H-->7CH (211)
DE0E1: MOV 7DH,#0FFH ;#0FFH-->7DH (255)
DE0E2: DJNZ 7DH,DE0E2 ;7DH 减 1 不等于 0 转 DE0E2
DJNZ 7CH,DE0E1 ;7CH 减 1 不等于 0 转 DE0E1
RET ;子程序调用返回
NOP
STS0F: MOV 7EH,#0D3H ;#0D3H-->7EH (211)
DE0F1: MOV 7FH,#0FFH ;#0FFH-->7FH (255)
DE0F2: DJNZ 7FH,DE0F2 ;7FH 减 1 不等于 0 转 DE0F2
DJNZ 7EH,DE0F1 ;7EH 减 1 不等于 0 转 DE0F1
RET ;子程序调用返回
NOP
END ;结束
程序共用293句,如有哪位更简练的编程方法请发表意见,共同学习。上传2个压缩包,一个是仿真上的,另一个是EDN-51板上的。
文章评论(0条评论)
登录后参与讨论