📄 newfx.asm
字号:
LCALL H_YUAN
RET
;************************************** 状态查询指令 *******************************
STA_QRY:
CLR ES
MOV A,#0DDH ;状态发送命令
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#00H
JNB DSP_FLG1,S_SND1
MOV A,#01H ;"1"车型显示
S_SND1: JNB DSP_FLG2,S_SND2
ADD A,#02H ;"2"金额显示,"3"车型、金额显示
S_SND2: MOV SBUF,A
JNB TI,$
CLR TI
XRL A,#0DDH
MOV SBUF,A
JNB TI,$
CLR TI
SETB ES
RET
;************************************ 以下为子程序 *********************************
;放音程序
SND_PLY:
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
MOV R0,#PLY_BUF
MOV A,@R0
INC R0
MOV PLY_ADD,R0
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;查找播放语音地址
MOV P0,#0FFH ;输出ISD地址信号
LCALL DELAY1MS
MOV P0,A ;输出ISD地址信号
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
CLR PLAYL ;开始播放
SETB PLY_FLG ;放音标志置'1'
SETB EX0
RET
;外部INT0中断EOM放音结束信号
PLY_OVR1:LJMP PLY_OVR
I0_INT:
PUSH DPL
PUSH DPH
PUSH ACC
MOV A,R0
PUSH ACC
MOV A,R1
PUSH ACC
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
JNB PLY_FLG,PLY_OVR1;放音标志无效,则不继续放音
SETB PLAYL
MOV R0,PLY_ADD
MOV A,@R0
CJNE A,#0FFH,PLY_GO
LJMP PLY_OVR
PLY_GO: INC R0
MOV PLY_ADD,R0
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;查找播放语音地址
MOV P0,A ;输出ISD地址信号
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
CLR PLAYL ;开始播放
SETB PLY_FLG
POP ACC
MOV R1,A
POP ACC
MOV R0,A
POP ACC
POP DPH
POP DPL
AJMP THE_OVR
PLY_OVR:CLR PLY_FLG ;放音标志置'0'
CLR EX0
SETB PLAYL
POP ACC
MOV R1,A
POP ACC
MOV R0,A
POP ACC
POP DPH
POP DPL
THE_OVR:RETI
;串行中断接收部分
RECIVE:
PUSH DPL
PUSH DPH
PUSH ACC
MOV A,R0
PUSH ACC
MOV A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV R0,CHK_ADD
MOV A,SBUF
MOV @R0,A
INC R0
MOV CHK_ADD,R0
INC BYT_NUM
MOV R2,BYT_NUM
CJNE R2,#05H,RETURN
LJMP ONE_CMD
RETURN: CLR RI
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
POP ACC
POP DPH
POP DPL
RETI
ONE_CMD:MOV BYT_NUM,#00H
LCALL CHECK
MOV CHK_ADD,#CHK_BUF
LJMP RETURN
;定时器0中断50MS一次,看门狗复位
T0_INT:
LCALL RST_WDOG
MOV TL0,#0B0H ;定时常数3CB0H=15536D,50MS定时中断
MOV TH0,#3CH ;
SETB TR0 ;启动定时器0
RETI
;串行上报信息程序
SEND:
MOV A,#0BBH
MOV SBUF,A
JNB TI,$
CLR TI
MOV R0,#CHK_BUF
INC R0
MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
XRL A,#0BBH
MOV SBUF,A
JNB TI,$
CLR TI
RET
;命令校验程序
CHECK:
MOV A,#CHK_BUF
MOV R0,A ;第四字节为前三字节的异或和
MOV A,@R0
INC R0
XRL A,@R0
INC R0
XRL A,@R0
INC R0
XRL A,@R0
INC R0
XRL A,@R0
JNZ ERROR
LCALL SEND ;上报成功接收信息
MOV A,#CHK_BUF ;将正确命令送到命令缓冲区
MOV R0,A
MOV R1,ANA_ADD
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A
INC R1
MOV ANA_ADD,R1
SETB CMD_FLG
INC CMD_NUM
MOV A,CMD_NUM
CJNE A,#6,MYRET
MOV ANA_ADD,#CMD_BUF
AJMP BACK
MYRET: CJNE A,#7,BACK
MOV CMD_NUM,#1
BACK: RET
;接收错误处理
ERROR:
MOV A,#0CCH ;错误接受命令
MOV SBUF,A
JNB TI,$
CLR TI
MOV R0,#CHK_BUF
INC R0
MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
XRL A,#0CCH
MOV SBUF,A
JNB TI,$
CLR TI
RET
CHG_OUT:
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV P0,A
RET
; 显示程序
DISPLAY_0:
MOV A,#DSP_BUF
MOV R0,A
MOV A,@R0
PUSH DPH
PUSH DPL
DISP: LCALL CHG_OUT
SETB LED_0 ;锁存车型数据
LCALL DLY
CLR LED_0
LCALL DLY
SETB DSP_FLG1 ;车型显示标志,供状态查询用
DISP_OVR0:
POP DPL
POP DPH
RET
DISPLAY_1:
PUSH DPH
PUSH DPL
LCALL H_YUAN ;关闭金额显示
CLR DSP_HIG
MOV R0,#DSP_BUF
MOV A,@R0
CJNE A,#0H,DISP_Q
LED_BAI:INC R0
MOV A,@R0
CJNE A,#0,DISP_B
JB DSP_HIG,DISP_B ;千位有数据,百位0要显示
LED_SHI:INC R0
MOV A,@R0
CJNE A,#0,DISP_S
JB DSP_HIG,DISP_S ;千/百位有数据,十位0要显示
LED_GE: INC R0
MOV A,@R0
LJMP DISP_G
DISP_Q: LCALL CHG_OUT
SETB LED_1 ;锁存千位数据
CALL DLY
CLR LED_1
CALL DLY
SETB DSP_HIG
LJMP LED_BAI
DISP_B: LCALL CHG_OUT
SETB LED_2 ;锁存百位数据
CALL DLY
CLR LED_2
CALL DLY
SETB DSP_HIG
LJMP LED_SHI
DISP_S: LCALL CHG_OUT
SETB LED_3 ;锁存十位数据
CALL DLY
CLR LED_3
CALL DLY
LJMP LED_GE
DISP_G: LCALL CHG_OUT
SETB LED_4 ;锁存个位数据
CALL DLY
CLR LED_4
CALL DLY
SETB DSP_FLG2 ;金额显示标志,供状态查询用
DISP_OVR1:
POP DPL
POP DPH
RET
DLY:
NOP
NOP
NOP
NOP
NOP
RET
;********************************** X25045操作命令 ************************************
;X25045写使能命令
WREN_CMD:
CLR SCK
CLR CS
MOV A,#WREN_INST
LCALL OUTBYT
CLR SCK
SETB CS
RET
;X25045复位写使能命令
WRDI_CMD:
CLR SCK
CLR CS
MOV A,#WRDI_INST
LCALL OUTBYT
CLR SCK
SETB CS
RET
;X25045写状态寄存器命令(写看门狗定时)
WRSR_CMD:
CLR SCK
CLR CS
MOV A,#WRSR_INST
LCALL OUTBYT
MOV A,#STATUS_REG
LCALL OUTBYT
CLR SCK
SETB CS
LCALL WIP_POLL
RET
;X25045读状态寄存器命令(写看门狗600MS定时)
RDSR_CMD:
CLR SCK
CLR CS
MOV A,#RDSR_INST
LCALL OUTBYT
LCALL INBYT
CLR SCK
SETB CS
RET
;X25045单字节写命令
BYTE_WRITE:
MOV DPTR,#BYTE_ADDR
CLR SCK
CLR CS
MOV A,#WRITE_INST
MOV B,DPH
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT
MOV A,DPL
LCALL OUTBYT
MOV A,#BYTE_DATA
LCALL OUTBYT
CLR SCK
SETB CS
LCALL WIP_POLL
RET
;X25045复位看门狗命令
RST_WDOG:
CLR CS
SETB CS
RETI
;X25045写处理检测命令
WIP_POLL:
MOV R1,#MAX_POLL
WIP_POLL1:
LCALL RDSR_CMD
JNB ACC.0,WIP_POLL2
DJNZ R1,WIP_POLL1
WIP_POLL2:
RET
;X25045字节输出命令
OUTBYT:
MOV R0,#08H
OUTBYT1:CLR SCK
RLC A
MOV SI,C
NOP
NOP
NOP
NOP
NOP
SETB SCK
DJNZ R0,OUTBYT1
CLR SI
RET
;X25045字节输入命令
INBYT:
MOV R0,#08H
INBYT1: SETB SCK
CLR SCK
MOV C,SO
RLC A
DJNZ R0,INBYT1
RET
DELAY1MS:
MOV R7,#05H
DLY0: MOV R6,#0F7H
DJNZ R6,$
DJNZ R7,DLY0
RET
DELAY1S:MOV R7,#14H
DLY01: MOV R6,#0C8H
DLY00: MOV R5,#0F7H
DJNZ R5,$
DJNZ R6,DLY00
DJNZ R7,DLY01
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -