111.asm
来自「简单自动售货机」· 汇编 代码 · 共 297 行
ASM
297 行
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP SALE
ORG 001BH
LJMP BACK
ORG 0030H
MAIN:
;开始初始化
SETB EA ;开中断
MOV TMOD,#66H ;计数器1都工作于方式2
MOV TL1,#0FFH
MOV TH1,#0FFH
SETB TR1
SETB ET1
MOV TL0,#0FFH
MOV TH0,#0FFH
SETB TR0
SETB ET0
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
MOV R0,#40H ;给以40H为开始地址的连续三个字节里存放10
MOV R5,#03H
LOOP1:
MOV A,#0AH
INC R0
MOV @R0,A
DJNZ R5, LOOP1
MOV R0,#43H ;给以43H为开始地址的连续三个字节里存放15
MOV R5,#03H
LOOP2:
MOV A,#0FH
INC R0
MOV @R0,A
DJNZ R5 ,LOOP2
MOV R0,#46H ;给以46H为开始地址的连续三个字节里存放50
MOV R5,#03H
LOOP3:
MOV A,#50
INC R0
MOV @R0,A
DJNZ R5, LOOP3
MOV R0,#49H ;给以49H为开始地址的连续三个字节里存放65
MOV R5,#03H
LOOP6:
MOV A,#65
INC R0
MOV @R0,A
DJNZ R5, LOOP6 ;以上四段程序是给4*3的扫描键盘赋值,使用时候可以更改
;;;;;;;初始化完毕,
;输入钱数
READ:
MOV A,#50
MOV 60H,A
MOV B,#100
DIV AB ;此段程序用于模拟用户投币的数额,这里设为5元
JNZ DIS
ACALL DISPL1
LJMP DIS2
DIS:
ACALL DISPL2
DIS2:
MOV A,60H
JNZ SCAN
SJMP READ
BACK:
MOV A,60H
ACALL CHANGE
RETI
SCAN: ;扫描键盘程序
LCALL KS1
JZ SCAN ;无键按下跳转
LK2:
MOV R2,#0FEH
MOV R4,#00H
LK4:
MOV A,R2
MOV C,ACC.0
MOV P2.0,C
MOV C,ACC.1
MOV P2.1,C
MOV C,ACC.2
MOV P2.2,C
MOV A,P0
JB ACC.0,LONE ;检查第一行,不为0则转移
MOV A,#00H
LJMP LKP
LONE:
JB ACC.1,LTW0 ;检查第二行,不为0则转移
MOV A,#03H
LJMP LKP
LTW0: ;检查第三行,不为0则转移
JB ACC.2,LTHR
MOV A,#06H
LJMP LKP
LTHR:
JB ACC.3,NEXT
MOV A,#09H
LKP: ;计算按下的键盘号码
ADD A,R4
PUSH ACC
ADD A,#01H
MOV 59H,A
LK3: ;判断键是否释放
LCALL DELAY
LCALL KS1
JNZ LK3
POP ACC
SJMP PRICE
NEXT: ;准备下一列扫描
INC R4
MOV A,R2
JNB ACC.3,KND
RL A
MOV R2,A
AJMP LK4
KND:
AJMP LK2
KS1: ;判断是否有键按下
MOV A,#00H
MOV P2,A
MOV A,P0
CPL A
ANL A,#0FH
RET
PRICE: ;输入商品价格的读取
MOV A,59H
ADD A,#40H
MOV R0,A
MOV A,@R0
MOV B,#100
DIV AB
JNZ PR1
ACALL DISPL1 ;对所输入价格的显示
SJMP $
PR1:
ACALL DISPL2
SJMP $
SALE: ;购物子程序
PUSH ACC
MOV A,59H
ADD A,#40H
MOV R1,A
MOV A,@R1
MOV 61H,A
MOV A,60H
SUBB A,61H
JC DEF
SETB P2.4 ;出货 L1亮
DEC @R0
ACALL CHANGE
DEF:
SETB P2.5 ;资金不足 L2亮
MOV A,60H
ACALL CHANGE
CHANGE: ;找零钱子程序
MOV 62H,A
MOV B,#100
DIV AB ;判断是否足额,如果不足额则退还
JNZ CH1
MOV A,B
MOV B,#10
DIV AB
MOV 63H,A
MOV DPTR,#0300H
MOVC A,@A+DPTR
MOV P1,A
MOV A,B
ORL A,#30H
MOV P3,A
MOV A,B
JZ CH2
SETB P2.6 ;所找硬币中有五角 L3亮
CH2: ;判断是否需要找五角面额硬币
MOV A,63H
JZ CH3
MOV R6,A
LOOP4:
SETB P2.7 ;所找硬币中有一元 L4亮
DJNZ R6,LOOP4
CH3:
AJMP OUT
CH1: ;判断是否需要找一元面额硬币
ACALL DISPL2
MOV A,62H
MOV B,#10
DIV AB
MOV R6,A
LOOP5:
SETB P2.7
DJNZ R6,LOOP5
AJMP OUT
RET
DELAY: ;延时子程序
MOV R5,#200
DEL1:MOV R4,#125
DEL2:DJNZ R4,DEL2
DJNZ R5,DEL1
RET
DELAY1: ;延时子程序
MOV R7,#40
DEL3:MOV R6,#200
DEL4:MOV R5,#200
DEL5:
DJNZ R5,DEL5
DJNZ R6,DEL4
DJNZ R7,DEL3
RET
DISPL1: ;显示子程序
CLR P1.7
MOV A,B
MOV B,#10
DIV AB
MOV DPTR,#0300H
MOVC A,@A+DPTR
MOV P1,A
MOV A,B
ORL A,#0F0H
MOV P3,A
RET
DISPL2: ;显示子程序
MOV DPTR,#0300H
MOVC A,@A+DPTR
ORL A,#80H
MOV P1,A
MOV A,B
ORL A,#30H
MOV P3,A
RET
ORG 0300H
TAB:
DB 01H,4FH,12H,06H,4CH,24H,20H,0FH,00H,04H ;7段数码显示管的表值
OUT:
POP ACC
ACALL DELAY1
RETI
SJMP $
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?