📄 fasong.asm
字号:
Z8279 EQU 0FF82H;
D8279 EQU 0FF80H;
Z8255 EQU 8502H;
A8255 EQU 8500H;
W8255 EQU 10H;控制字,A口方式0输出
LEDCLS EQU 0D1H;
LEDWRO EQU 90H;
LEDFEQ EQU 34H;
LEDMOD EQU 10H;
;---------------------------
ORG 0000H
AJMP START
ORG 000BH
LJMP BREAK
ORG 0050H
START:
MOV SP,#60H; 8279的初始化
LCALL INIT8279
LCALL INIT_CPU
MOV TMOD,#21H ;把定时器1设置在模式2,定时器0工作在模式1
MOV SCON,#70H ;串行口工作在方式1
MOV PCON,#80H
MOV TH1,#0FDH ;波特率为9.6kbs
MOV TL1,#0FDH
SETB TR1
;-----------------------------------------------------
;取功能键
KEYBOAR:
MOV A,#17H;显示欢迎界面hello
MOV 37H,A
MOV A,#18H
MOV 36H,A
MOV A,#19H
MOV 35H,A
MOV A,#19H
MOV 34H,A
MOV A,#1AH
MOV 33H,A
MOV A,#00H
MOV 32H,A
MOV A,#00H
MOV 31H,A
MOV A,#12H
MOV 30H,A
LCALL DISP_NUM
;----------------------------------------------------------
;输入命令:1 2 3 4 5
FOR: MOV DPTR,#Z8279;中断返回就在这里
MOVX A,@DPTR
ANL A,#0FH
JZ KEYBOAR
MOV DPTR,#D8279
MOVX A,@DPTR
CJNE A,#02H,GOON;若A=2,则转到二号功能区接收+回复
MOV 30H,#02H;显示选择的是二号
LCALL DISP_NUM
AJMP GOOON
GOON: CJNE A,#01H,KEYBOAR1;
MOV 30H,#01H;显示选择的是一号
LCALL DISP_NUM
AJMP KEYBOARD;若是1,跳到一号功能区
KEYBOAR1: CJNE A,#03H,KEYBOAR2;
MOV 30H,#03H;显示选择的是三号
LCALL DISP_NUM
AJMP LO
KEYBOAR2: CJNE A,#04H,KEYBOAR3;若是4,跳到四号功能区
MOV 30H,#04H;显示选择的是四号
LCALL DISP_NUM
AJMP NUM4
KEYBOAR3: CJNE A,#05H,KEYBOAR;若是5,进入五号功能区
;----------------------------------------------------------
;五号功能区
MOV 30H,#05H;显示选择的是五号
LCALL DISP_NUM
NUM5: MOV 37H,#13H;初始化显示区域
MOV 36H,#13H
MOV 34H,#13H
MOV 35H,#13H
MOV 33H,#13H
MOV 32H,#13H
MOV 31H,#13H
MOV 30H,#13H
MOV DPTR,#Z8279;输入秒数
MOVX A,@DPTR
ANL A,#0FH
JZ NUM5
MOV DPTR,#D8279
MOVX A,@DPTR
MOV R3,A;保存秒数
MOV R6,#14H;1秒的中断次数
MOV 30H,A
LCALL DISP_NUM
MOV R1,#30H
MOV R4,R1
MOV R0,#00H
NNN: MOV DPTR,#Z8279;输入数据
MOVX A,@DPTR
ANL A,#0FH
JZ NNN
MOV DPTR,#D8279
MOVX A,@DPTR
CJNE A,#05H,MM;若A=5则启动发送
MOV A,#03H;先发送标志位,来控制接收端的状态(与3号功能是同一段程序)
MOV SBUF,A
JNB TI,$
CLR TI
MOV 47H,37H
MOV 46H,36H
MOV 45H,35H
MOV 44H,34H
MOV 43H,33H
MOV 42H,32H
MOV 41H,31H
MOV 40H,30H
MOV TH0,#9CH;计数初值
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0;启动定时器
LJMP FOR;返回等待中断
MM:
MOV @R1,A;把数据存入显示单元
INC R1
INC R0
LCALL DISP_NUM
AJMP NNN
;中断处理程序
BREAK: MOV 37H,#13H
MOV 36H,#13H
MOV 34H,#13H
MOV 35H,#13H
MOV 33H,#13H
MOV 32H,#13H
MOV 31H,#13H
MOV 30H,R3
DEC R6
CJNE R6,#00H,RETURN;
DEC R3;秒数减一
CJNE R3,#00H,FF
CLR TR0
MOV A,R0
MOV SBUF,A;先发送数据个数
JNB TI,$
CLR TI
MOV R1,#40H
LOO3:
MOV A,@R1
MOV SBUF,A
JNB TI,$
CLR TI
INC R1
DJNZ R0,LOO3
AJMP RETURN
FF:
LCALL DISP_NUM;显示倒计时
RETURN:
MOV TH0,#3CH;
MOV TL0,#0B0H;
RETI
;---------------------------------------------------------
;四号功能区,成组发送,第二次按4则启动发送
NUM4: MOV 37H,#13H
MOV 36H,#13H
MOV 34H,#13H
MOV 35H,#13H
MOV 33H,#13H
MOV 32H,#13H
MOV 31H,#13H
MOV 30H,#13H
MOV R1,#30H
MOV R4,R1
MOV R0,#00H
LOOOO: MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ LOOOO
MOV DPTR,#D8279
MOVX A,@DPTR
CJNE A,#04H,NEE;若A=4则启动发送
MOV A,#03H;先发送标志位,来控制接收端的状态(与3号功能是同一段程序)
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,R0
MOV SBUF,A;先发送数据个数
JNB TI,$
CLR TI
MOV R1,R4
LOO1:
MOV A,@R1
MOV SBUF,A
JNB TI,$
CLR TI
INC R1
DJNZ R0,LOO1
AJMP KEYBOAR
NEE:
MOV @R1,A;把数据存入显示单元
INC R1
INC R0
LCALL DISP_NUM
AJMP LOOOO
;-------------------------------------------------------
;3号功能区,指定地址个数
LO: MOV A,#03H;先发送一个数字3,作为接收端的标志
MOV SBUF,A
JNB TI,$
CLR TI
MOV 37H,#13H
MOV 36H,#13H
MOV 34H,#13H
MOV 35H,#13H
MOV 33H,#13H
MOV 32H,#13H
MOV 31H,#13H
MOV 30H,#13H
MOV R1,#33H
LOO: MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ LOO
MOV DPTR,#D8279
MOVX A,@DPTR
MOV @R1,A;把数据存入显示单元
LCALL DISP_NUM
MOV A,R1
DEC R1
CJNE A,#30H,LOO;要输入四个数字:首址+个数
MOV A,31H
SWAP A;左移四位与30H相加得到个数
ADD A,30H
MOV R0,A
MOV A,33H
SWAP A;33H左移四位与32H相加得到首址(限于内部数据区)
ADD A,32H
MOV R1,A
MOV R4,A
LCALL SEND;启动发送
LJMP KEYBOAR
;--------------------------------------------------------------
;1号功能区
KEYBOARD:
MOV 37H,#13H
MOV 36H,#13H
MOV 34H,#13H
MOV 35H,#13H
MOV 33H,#13H
MOV 32H,#13H
MOV 31H,#13H
MOV 30H,#13H
MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ KEYBOARD
MOV DPTR,#D8279
MOVX A,@DPTR
CJNE A,#01H,NEXT111;若第二次按下1键,则停止该模式的发送
AJMP KEYBOAR
NEXT111:
MOV 37H,36H
MOV 36H,35H
MOV 35H,34H
MOV 34H,33H
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,A
MOV SBUF,A
JNB TI,$ ;等待发送结束
CLR TI
LCALL DISP_NUM
KKK:AJMP KEYBOARD
;-------------------------------------------------
;2号功能区,接受+回复
GOOON:
MOV A,#02H;先发送一个控制接收方式的的标志位
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#23H;先发送一个允许继续发送的标志
MOV SBUF,A
JNB TI,$
CLR TI
SENDD:
MOV 37H,#13H
MOV 36H,#13H
MOV 34H,#13H
MOV 35H,#13H
MOV 33H,#13H
MOV 32H,#13H
MOV 31H,#13H
MOV 30H,#13H
MOV R1,#30H
MOV R4,R1;R4保存首址
MOV R0,#00H
LOOOOO: MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ LOOOOO
MOV DPTR,#D8279
MOVX A,@DPTR
CJNE A,#02H,NET;若A=2则启动发送
LCALL SEND;发送完自动转入接收状态
AJMP RELOOP
NET:
MOV @R1,A;把数据存入显示单元
INC R1
INC R0
LCALL DISP_NUM
AJMP LOOOOO
RELOOP: JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#23H,KKK;若不是23则返回初始状态
JNB RI,$
CLR RI
MOV A,SBUF
MOV R0,A;数据个数存在R0
MOV R1,#30H
MOV 37H,#13H
MOV 36H,#13H
MOV 34H,#13H
MOV 35H,#13H
MOV 33H,#13H
MOV 32H,#13H
MOV 31H,#13H
MOV 30H,#13H
L0: NOP
JNB RI,$
CLR RI
MOV A,SBUF
MOV @R1,A
INC R1
DJNZ R0,L0
LCALL DISP_NUM
CH1: MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ CH1
MOV DPTR,#D8279
MOVX A,@DPTR
CJNE A,#02H,CH2;若A=2则启动回复
MOV A,#23H
MOV SBUF,A
JNB TI,$
CLR TI
AJMP SENDD
CH2: MOV A,#22H
MOV SBUF,A
JNB TI,$
CLR TI
AJMP KEYBOAR;若输入的不是2,发送22,转入初始状态
;---------------------------------------------
SEND: MOV A,R0
MOV SBUF,A;先发送数据个数
JNB TI,$
CLR TI
MOV R1,R4;首地址送R1
LOOO:
MOV A,@R1
MOV SBUF,A
JNB TI,$
CLR TI
INC R1
DJNZ R0,LOOO
RET
;--------------------------------------------
INIT_CPU:
MOV A,#00H;
MOV R0,#30H
MOV R2,#08H
INIT_CPU1:
MOV @R0,A
INC R0
DJNZ R2,INIT_CPU1
RET
;---------------------------------------------
INIT8279:
MOV DPTR,#Z8279
MOV A,#LEDCLS
MOVX @DPTR,A
INIT82791:
MOVX A,@DPTR
JB ACC.7,INIT82791
MOV A,#LEDMOD
MOVX @DPTR,A
MOV A,#LEDFEQ
MOVX @DPTR,A
MOV A,#LEDWRO
MOVX @DPTR,A
RET
;-------------------------------------------------
;SHOW
;ENTRANCE 30H-37H FROM THE RIGHT SIDE TO THE LEFT SIDE
DISP_NUM:
MOV DPTR,#D8279
MOV R0,#30H
MOV R2,#08H
DISP_NUM1:
MOV A,@R0
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
INC R0
DJNZ R2,DISP_NUM1
RET
;-------------------------------------------------
;SHOWSEG LIST
LEDSEG: DB 3FH,06H,5BH,4FH,66H;0,1,2,3,4
DB 6DH,7DH,07H,7FH,6FH,77h;5,6,7,8,9
DB 7CH,39H,5EH,79H,71H;A--F
DB 3EH,40H,08H,00H,30H,3FH,73H;10H~16H
DB 0F6H,0F9H,38H,3FH;HEL0 17H~~1AH
END
;-----------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -