📄 1547.asm
字号:
;定义MAX7219的引用
DIN BIT P2.6
CLK BIT P2.4
LOAD BIT P2.5
;定义93C46 的引脚
CS BIT P2.3
SK BIT P2.2
DI BIT P2.1
D0 BIT P2.0
DATSEND DATA 1FH
; --------按键-----------
KEY BIT P1.2 ;当KEY='0'时,93C46清零
;--------------------------
TEMP EQU 1FH
DATA1 EQU 0EH ;LED显示的地址
DATA2 EQU 0FH ;LED显示的数值
;中断表
ORG 0000H
JMP MAIN
ORG 0003H
JMP MAIN
ORG 000BH
JMP NO_0
ORG 0013H
JMP MAIN
ORG 001BH
JMP MAIN
ORG 0023H
JMP MAIN
;主程序
MAIN: CLR EA
MOV SP, #70H
MOV R5, #04H
MOV TMOD, #66H
MOV TH0, #0FEH
MOV TL0, #0FEH
MOV TCON, #50H
; 读93C46的数据到R1=08H指定的地址,一共读R2=12个字节
MOV R2, #6
MOV R1, #08H
MOV DATSEND,#08H
READ_ALL:
CALL READ
MOV @R1, A ;
INC R1
INC DATSEND
DJNZ R2, READ_ALL
;开中断
MOV IP, #00H
MOV IE, #8AH
;6位LED
MOV DATA1, #0bH
MOV DATA2, #05H
CALL PLAY
;亮度
MOV DATA1, #0AH
MOV DATA2, #0FH
CALL PLAY
;BCD码
MOV DATA1, #09H
MOV DATA2, #0FFH
CALL PLAY
mov 08, #0
mov 09, #0
mov 0ah, #0
mov 0bh, #0
mov 0ch, #0
mov 0dh, #0
;显示器正常工作
MOV DATA1, #0CH
MOV DATA2, #01H
CALL PLAY
;显示进币数;
LOOP: MOV DATA1, #06H
MOV R1, #0DH
MOV R7, #06H
LOOP3:MOV DATA2, @R1
CALL PLAY
DEC DATA1
DEC R1
DJNZ R7, LOOP3
;测试key值
JB KEY, LOOP
MOV R0, #0FFH
CALL LATER
JB KEY, LOOP
CALL EWEN_93C46
CALL WRAL_93C46
CALL EWDS_93C46
JMP LOOP
;-------计算器0中断,加1-----
NO_0:
PUSH 08H
PUSH 09H
PUSH 0AH
PUSH 0BH
MOV R0, #08H
CJNE @R0, #09H, LOOP5
MOV @R0, #00H
JMP NEXT1
LOOP5: INC @R0
CALL writ_IN
POP 00H
RETI
NEXT1: INC R0
CJNE @R0, #09H, LOOP6
MOV @R0, #00H
JMP NEXT2
LOOP6: INC @R0
CALL writ_in
POP 00H
RETI
NEXT2: INC R0
CJNE @R0, #09H, LOOP7
MOV @R0, #00H
JMP NEXT3
LOOP7: INC @R0
CALL writ_in
POP 00H
RETI
NEXT3: INC R0
CJNE @R0, #09H, LOOP8
MOV @R0, #00H
JMP NEXT4
LOOP8: INC @R0
CALL writ_in
POP 00H
RETI
NEXT4: INC R0
CJNE @R0, #09H, LOOP9
MOV @R0, #00H
JMP NEXT5
LOOP9: INC @R0
NEXT5: CALL writ_in
POP 03H
POP 02H
POP 01H
POP 00H ;
RETI
;-------延时10毫秒子程序------
LATER:
NOP
NOP
DJNZ R0, LATER
NOP
RET
;-------显示子程序------
PLAY:
PUSH 00H
PUSH A
PUSH PSW
CLR C
MOV R0, #DATA1
MOV R3, #2
CLR LOAD
LOOP1: MOV TEMP, @R0
MOV R2, #8
LOOP2: CLR CLK
MOV A, TEMP
RLC A
MOV TEMP,A
MOV DIN,C
NOP
SETB CLK
DJNZ R2, LOOP2
INC R0
DJNZ R3, LOOP1
SETB LOAD
POP PSW
POP A
POP 00H
RET
writ_in:
;--------写93C46-------
PUSH 00H
PUSH A
MOV A, R0
ORL A, #80H
MOV R0, A
CALL EWEN_93C46
write_1:
MOV DATSEND, R0
CALL START_93C46
CLR SK
CLR DI
NOP
SETB SK
CALL SEND_DATA
CLR SK
MOV DATSEND,@R0
CALL START_93C46
CLR SK
CLR DI
NOP
SETB SK
CALL SEND_DATA
CLR SK
CALL EWDS_93C46
POP A
POP 00H
RET
;----------------------
;-----子程序名称 功能
;-------READ 把R7指向地址的内容读入R6(H),R5(L)
;-------WRITE 把R6(H),R5(L)的内容写到R7指向地址上
;-------WRAL 把R(H),R5(L)的内容写到全部存储器上
;-------ERAL 把全部存储器的内容擦除
READ:
PUSH 03H
PUSH A
CALL start_93c46
CLR SK
SETB DI
NOP
SETB SK
CALL SEND_DATA
CLR SK
; JNB D0,$
MOV R3, #08H
SETB SK
NOP
READ1: CLR SK
MOV C, D0
RLC A
SETB SK
DJNZ R3, READ1
CLR SK
POP A
POP 03H
RET
EWEN_93C46: ;擦/写允许
CALL start_93c46
CLR SK
CLR DI
NOP
SETB SK
MOV DATSEND,#60H
CALL SEND_DATA
RET
ERAL_93C46: ;擦除芯片
CALL start_93c46
CLR SK
CLR DI
NOP
SETB SK
MOV DATSEND,#40H
CALL SEND_DATA
RET
EWDS_93C46: ;擦/写禁止
CALL start_93c46
CLR SK
CLR DI
NOP
SETB SK
MOV DATSEND,#00H
CALL SEND_DATA
RET
WRAL_93C46: ;写芯片为'0'
CALL START_93C46
CLR SK ;
CLR DI
NOP
SETB SK
MOV DATSEND, #20H
CALL SEND_DATA
MOV DATSEND, #00H
CALL SEND_DATA
RET
start_93c46: ;写串行输入首位'1'
CLR CS
NOP
SETB CS
; JNB D0, $
CLR SK
SETB DI
NOP
SETB SK
RET
SEND_DATA: ;写串行8位数据
PUSH 03H
PUSH A
PUSH PSW
CLR C
MOV R3, #08H
MOV A, DATSEND
SEND1: CLR SK
RLC A
MOV DI, C
SETB SK
DJNZ R3, SEND1
POP PSW
POP A
POP 03H
RET ;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -