📄 newfx.asm
字号:
;费显程序《单片机89C51,晶振11.0592MHZ》
ORG 0000H
LJMP MAIN
ORG 0003H ;INT0中断,EOM放音结束信号
LJMP I0_INT
ORG 000BH ;定时器0中断,看门狗复位
LJMP T0_INT
ORG 0023H ;串行中断
LJMP RECIVE
ORG 0100H
CMD_ADD EQU 10H ;命令缓冲区指针
PLY_ADD EQU 11H ;放音缓冲区指针
DSP_ADD EQU 12H ;显示缓冲区指针
CHK_ADD EQU 13H ;命令校验地址指针
ANA_ADD EQU 14H ;命令处理地址指针
BYT_NUM EQU 15H ;命令字节计数器
CMD_NUM EQU 16H ;命令条数计数器
CMD_CUR EQU 17H ;当前命令条数计数器
DSP_BUF EQU 18H ;显示缓冲区,内部RAM
PLY_BUF EQU 21H ;放音缓冲区,内部RAM
CHK_BUF EQU 30H ;命令校验缓冲区,内部RAM
CMD_BUF EQU 40H ;命令缓冲区,内部RAM
PLY_FLG EQU 00H ;放音标志,内部位寻址区
CMD_FLG EQU 01H ;命令缓冲区标志
DSP_HIG EQU 02H ;高位显示标志
HIG_FLG EQU 03H ;金额高位标志
ZER_FLG EQU 04H ;金额高位零标志
DSP_FLG1 EQU 05H ;车型显示状态标志
DSP_FLG2 EQU 06H ;金额显示状态标志
PSW0 EQU 00H ;寄存器区0
PSW1 EQU 08H ;寄存器区1
WREN_INST EQU 06H ;X25045操作指令定义
WRDI_INST EQU 04H
WRSR_INST EQU 01H
RDSR_INST EQU 05H
WRITE_INST EQU 02H
READ_INST EQU 03H
BYTE_ADDR EQU 55H
BYTE_DATA EQU 11H
INIT_INST EQU 09H
STATUS_REG EQU 20H ;状态寄存器 D7 D6 D5 D4 D3 D2 D1 D0
;看门狗定时200MS ;状态位标志 X X WD1 WD0 BL1 BL0 WEL WIP
;看门狗时间(WD1,WD0) 0 0 ------1.4 S
MAX_POLL EQU 99H ; 0 1 ------600 MS
INIT_STATE EQU 09H ; 1 0 ------200 MS
; 1 1 ------DISABLE
LED_0 BIT P2.0 ;车型位选
LED_1 BIT P2.3 ;千位选
LED_2 BIT P2.4 ;百位选
LED_3 BIT P2.5 ;十位选
LED_4 BIT P2.6 ;个位选
PLAYL BIT P2.7 ;电平播放信号
EOM BIT P3.3 ;播放结束信号
CS BIT P1.0 ;X25045功能定义
SI BIT P1.1
SCK BIT P1.2
SO BIT P1.3
;放音段各段起始地址表
TABLE1:
DB 4 ;"零" ----------------- 0
DB 9 ;"一" 1
DB 14 ;"二" ----------------- 2
DB 19 ;"三" 3
DB 24 ;"四" ----------------- 4
DB 29 ;"五" 5
DB 34 ;"六" ----------------- 6
DB 39 ;"七" 7
DB 44 ;"八" ----------------- 8
DB 49 ;"九" 9
DB 54 ;"十" ----------------- 10
DB 59 ;"百" 11
DB 64 ;"千" ----------------- 12
DB 69 ;"元" 13
DB 76 ;"型车"---------------- 14
DB 74 ;"一型车" 15
DB 82 ;"二型车" ------------- 16
DB 90 ;"三型车" 17
DB 98 ;"四型车" ------------- 18
DB 106 ;"五型车" 19
DB 114 ;"六型车" ------------- 20
DB 122 ;"请交" 21
DB 129 ;"您好" --------------- 22
DB 135 ;再见,欢迎下次光临" 23
;七段显示码表
TABLE2:
;0 1 2 3 4 5 6 7 8 9
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;89C51主程序
MAIN:
MOV 8EH,#0FFH
MOV SP,#60H
MOV PSW,#PSW0 ;状态字寄存器,工作寄存器组0
MOV PCON,#00H ;电源控制寄存器
MOV SCON,#50H ;串行方式1,波特率可变
MOV TMOD,#21H ;定时器1,方式2,8位自动装入;定时器0,方式1,16位定时
MOV TL1,#0FDH ;波特率9600 BIT/S
MOV TH1,#0FDH ;
SETB TR1 ;启动定时器1
MOV TL0,#0B0H ;定时常数3CB0H=15536D,50MS定时中断
MOV TH0,#3CH ;
SETB TR0 ;启动定时器0
CLR RI ;清中断接收标志
CLR EX0 ;请外部中断0
MOV IP,#10H ;串行口高优先级中断
MOV IE,#93H ;中断允许寄存器,允许串行口、定时器0、外部0中断
MOV R0,#10H
MOV R7,#70H
MOV A,#00H
CLEAR: MOV @R0,A ;清标志寄存器,计数器
INC R0
DJNZ R7,CLEAR
MOV R0,#00H ;放音段号寄存器
MOV R1,#00H ;命令校验地址寄存器
MOV A,#CMD_BUF ;指针初始化
MOV CMD_ADD,A
MOV ANA_ADD,A
MOV A,#PLY_BUF
MOV PLY_ADD,A
MOV A,#DSP_BUF
MOV DSP_ADD,A
MOV A,#CHK_BUF
MOV CHK_ADD,A
MOV P1,#INIT_INST ;初始化看门狗电路
LCALL WREN_CMD
LCALL WRSR_CMD
MOV P0,#00H ;关闭显示
CLR LED_0
CLR LED_1
CLR LED_2
CLR LED_3
CLR LED_4
;命令处理程序
CMD_ANA:
JNB CMD_FLG,$
MOV A,CMD_CUR
CJNE A,CMD_NUM,NEXT
MOV CMD_CUR,#0
MOV CMD_NUM,#0
CLR CMD_FLG
MOV CMD_ADD,#CMD_BUF
MOV ANA_ADD,#CMD_BUF
LJMP CMD_ANA
NEXT: INC CMD_CUR
MOV R0,#CMD_BUF
MOV A,CMD_CUR
CJNE A,#7,GO_ANA
MOV A,#1
MOV CMD_CUR,A
GO_ANA: DEC A
MOV B,#5
MUL AB
ADD A,R0
MOV R0,A
INC R0 ;命令的第二字节为命令类型
MOV CMD_ADD,R0
MOV A,@R0
CJNE A,#01H,NEXT1
LCALL D_TYPE ;带头显示车型指令
LJMP CMD_ANA
NEXT1: CJNE A,#02H,NEXT2
LCALL O_TYPE ;纯显示车型指令
LJMP CMD_ANA
NEXT2: CJNE A,#03H,NEXT3
LCALL H_TYPE ;消隐车型显示指令
LJMP CMD_ANA
NEXT3: CJNE A,#04H,NEXT4
LCALL D_YUAN ;显示金额指令
LJMP CMD_ANA
NEXT4: CJNE A,#05H,NEXT5
LCALL H_YUAN ;消隐显示金额指令
LJMP CMD_ANA
NEXT5: CJNE A,#06H,NEXT6
LCALL CAR_PASS ;过车指令
LJMP CMD_ANA
NEXT6: CJNE A,#07H,NEXT7
LCALL STA_CHK ;状态自检指令
LJMP CMD_ANA
NEXT7: CJNE A,#08H,NO_CMD
LCALL STA_QRY ;状态查询指令
LJMP CMD_ANA
NO_CMD: MOV CMD_CUR,#0
MOV CMD_NUM,#0
CLR CMD_FLG
MOV CMD_ADD,#CMD_BUF
MOV ANA_ADD,#CMD_BUF
LJMP CMD_ANA
;******************************* 带头显示车型指令 *********************
D_TYPE:
CLR PLY_FLG
SETB PLAYL ;停止所有前面放音
MOV A,#PLY_BUF
MOV R0,A ;R0放音缓冲区指针
MOV A,#22 ;"您好"
MOV @R0,A
INC R0
MOV R1,CMD_ADD ;R1命令缓冲区指针
INC R1 ;取车型字节
MOV A,@R1 ;R1命令缓冲区指针可以释放
SUBB A,#30H
MOV R1,#DSP_BUF ;R1显示缓冲区区指针
MOV @R1,A ;车型送显示缓冲区
CJNE A,#07,N07
MOV @R0,A ;车型号(7)
INC R0
MOV A,#14
MOV @R0,A ;型车
INC R0
AJMP DOVR
N07: CJNE A,#08,N08
MOV @R0,A ;车型号(8)
INC R0
MOV A,#14
MOV @R0,A ;型车
INC R0
AJMP DOVR
N08: ADD A,#14 ;计算型车的位置
MOV @R0,A ;车型号(1-6)
INC R0
DOVR: MOV A,#0FFH ;语音结束标记
MOV @R0,A
LCALL SND_PLY
LCALL DISPLAY_0
RET
;*********************************** 纯显示车型指令 **************************
O_TYPE:
MOV A,#DSP_BUF
MOV DSP_ADD,A
MOV A,#PLY_BUF
MOV R0,A
MOV R1,CMD_ADD
INC R1 ;取车型字节
MOV A,@R1
SUBB A,#30H
MOV R1,#DSP_BUF
MOV @R1,A ;车型送显示缓冲区
CJNE A,#07,ON07
MOV @R0,A ;车型号(7)
INC R0
MOV A,#14
MOV @R0,A ;型车
INC R0
AJMP OOVR
ON07: CJNE A,#08,ON08
MOV @R0,A ;车型号(8)
INC R0
MOV A,#14
MOV @R0,A ;型车
INC R0
AJMP OOVR
ON08: ADD A,#14 ;计算型车的位置
MOV @R0,A ;车型号(1-6)
INC R0
OOVR: MOV A,#0FFH ;语音结束标记
MOV @R0,A
LCALL DISPLAY_0
LCALL SND_PLY
RET
;********************************* 消隐显示车型指令 ***************************
H_TYPE:
MOV P0,#00h
SETB LED_0
CALL DLY
CLR LED_0
CALL DLY
CLR PLY_FLG
SETB PLAYL ;停止放音
CLR DSP_FLG1 ;车型显示标志,供状态查询用
RET
;********************************* 显示金额指令 ********************************
D_YUAN:
JB PLY_FLG,$
CLR HIG_FLG
CLR ZER_FLG
MOV A,#PLY_BUF
MOV R0,A
MOV A,#21 ;"请交"
MOV @R0,A
INC R0
MOV R1,CMD_ADD
INC R1 ;取金额除以一百的整数
MOV CMD_ADD,R1
MOV A,@R1
MOV B,#10
DIV AB
DA A
PUSH ACC
MOV R1,#DSP_BUF
MOV @R1,A ;千位数据送显示缓冲区
INC R1
MOV A,B
DA A
MOV B,A
MOV @R1,A ;百位数据送显示缓冲区
INC R1
MOV DSP_ADD,R1
POP ACC
MOV R2,A
CJNE R2,#0,QIAN
LJMP BAI_ANA ;千位为零转百位处理
QIAN: MOV @R0,A ;千位不为零
INC R0
MOV A,#12 ;"千"
MOV @R0,A
INC R0
SETB HIG_FLG ;表示千位有数据
BAI_ANA:MOV A,B
CJNE A,#0,BAI
JNB HIG_FLG,GET_MOD ;千位为零,百位为零转其余处理
MOV @R0,A ;千位不为零,百位为零
INC R0
SETB ZER_FLG ;表示有百位零数据
LJMP GET_MOD
BAI: MOV @R0,A ;百位不为零
INC R0
MOV A,#11 ;"百"
MOV @R0,A
INC R0
SETB HIG_FLG ;表示百位有数据
GET_MOD:MOV R1,CMD_ADD
INC R1 ;取金额除以一百的余数
MOV A,@R1
MOV B,#10
DIV AB
DA A
PUSH ACC
MOV R1,DSP_ADD
MOV @R1,A ;十位数据送显示缓冲区
INC R1
MOV A,B
DA A
MOV B,A
MOV @R1,B ;个位数据送显示缓冲区
POP ACC
CJNE A,#0,SHI
JB ZER_FLG,GE_ANA ;百位已经有过零
JNB HIG_FLG,GE_ANA ;百位没有过零,高位也没有数据
MOV @R0,A ;百位没有过零,但高位有数据
INC R0
LJMP GE_ANA
SHI: CJNE A,#1,GOGO
LJMP NO_YI
GOGO: MOV @R0,A ;十位不为零
INC R0
NO_YI: MOV A,#10 ;"十"
MOV @R0,A
INC R0
GE_ANA: MOV A,B
CJNE A,#0,SET_GE
DEC R0
MOV A,@R0
CJNE A,#0,FUK
LJMP FUKUAN
FUK: INC R0
LJMP FUKUAN
SET_GE: MOV @R0,A ;个位不为零
INC R0
FUKUAN: MOV A,#13 ;"元"
MOV @R0,A
INC R0
MOV A,#0FFH ;结束标记
MOV @R0,A
LCALL DISPLAY_1
LCALL SND_PLY
RET
;************************************* 消隐显示进金额指令 *************************
H_YUAN:
MOV A,#0
MOV P0,A
SETB LED_1
CALL DLY
CLR LED_1
CALL DLY
SETB LED_2
CALL DLY
CLR LED_2
CALL DLY
SETB LED_3
CALL DLY
CLR LED_3
CALL DLY
SETB LED_4
CALL DLY
CLR LED_4
CALL DLY
CLR PLY_FLG
SETB PLAYL ;停止放音
CLR DSP_FLG2 ;金额显示标志,供状态查询用
RET
;************************************** 过车指令 **********************************
CAR_PASS:
JB PLY_FLG,$
MOV A,#PLY_BUF
MOV R0,A
MOV A,#23 ;"再见"
MOV @R0,A
INC R0
MOV @R0,#0FFH
LCALL H_TYPE
LCALL H_YUAN
LCALL SND_PLY
RET
;************************************** 状态自检指令 *******************************
STA_CHK:
JB PLY_FLG,$
MOV R4,#10
MOV R0,#0
NEXT_DISP:
MOV A,R0
LCALL CHG_OUT
SETB LED_0
CALL DLY
CLR LED_0
CALL DLY
SETB LED_1
CALL DLY
CLR LED_1
CALL DLY
SETB LED_2
CALL DLY
CLR LED_2
CALL DLY
SETB LED_3
CALL DLY
CLR LED_3
CALL DLY
SETB LED_4
CALL DLY
CLR LED_4
CALL DLY
LCALL DELAY1S
INC R0
DJNZ R4,NEXT_DISP
LCALL H_TYPE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -