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 + -
显示快捷键?