📄 510.asm
字号:
K BIT 00H ;按键标志位 一位数显示程序
DEL BIT 01H ;删除标志位
ENTER BIT 02H ;确定标志位
NUM_H EQU 21H ;答案高两位
NUM_L EQU 22H ;答案低两位
KEY_1 EQU 23H ;第一次按键值
KEY_2 EQU 24H ;第二次按键值
KEY_3 EQU 25H ;第三次按键值
KEY_4 EQU 26H ;第四次按键值
KEY_01 EQU 27H ;第一次按键值液晶用
KEY_02 EQU 28H ;第二次按键值液晶用
KEY_03 EQU 29H ;第三次按键值 液晶用
KEY_04 EQU 2AH ;第四次按键值液晶用
DELAY_NUM EQU 2BH ;DEFINED DELAY TIME
ORG 0000H
LJMP MAIN ;转到主程序初始化
ORG 0003H
LJMP SERVEINT0
ORG 000BH
LJMP T0INT
ORG 0013H ;;转到外部中断1
LJMP SERVEINT1
ORG 0100H
;;;;;;;;;;;;;;;
;;;;初始化程序
MAIN: MOV SP,#50H ;堆栈初值
CLR P3.4
SETB P3.5 ;模块开始休眠
; SETB P3.7 ;模块开始休眠
MOV P2,#00H
MOV P0,#00H
MOV SCON,#50H ;串口初始化,方式1
MOV PCON,#80H ;smod=1,波特率19200
MOV TMOD,#21H ;定时器T1方式2,T0方式1初始化
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV TH0,#00H ;定时器中断从初始化
MOV TL0,#00H
SETB PT0 ;定时器T0高优先级
SETB TR1 ;打开串口中断
SETB IT0 ;外部中断0边沿触发
SETB IT1 ;外部中断1边沿触发
MOV P1,#0C0H ;p1口0-5为低电平 6,7为高电平
SETB EA
SETB RS0
CLR RS1
SETB EX0
SETB EX1
CLR K
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;按键处理子程序
KEY1:
JNB K,TIM20 ;防止区间过长,加了中转 TIME50和slee相同,即 休眠子程序
SETB P3.4 ;;电源管理电路
CPL K
JB DEL,TIM20 ;防止区间过长,加了中转
JB ENTER,RECEIV
SETB RS0
CLR RS1
MOV NUM_L,R7 ;答案为一位数的情况
MOV NUM_H,#00h
MOV KEY_1,R7
CLR A
MOV A,#30H
ADD A,R7
MOV KEY_01,A
SETB ET0 ;允许定时器T0中断
SETB TR0
K1: ;液晶显示
LCALL SETUP
MOV A,#80H ;;;;;第一行
LCALL WRITE_COM
SETB RS0
CLR RS1
MOV R0,#27H
MOV R6,#1
LCALL WRITE_ASCII
CLR A
MOV A,#90H ;;;;;第二行
LCALL WRITE_COM
MOV DPTR,#CHINESE1
LCALL WRITE_HZ
LCALL DELAY1 ;;;;;;;;;;可加延时,字常亮
KEY2:
JNB K,TIME2 ;计时过长,自动休眠
AJMP KEY20
TIME2: SETB RS0
CLR RS1
CJNE R3,#0FFH,KEY2
TIM20: AJMP TIM30 ;防止区间过长,加了中转 TIME和slee相同,即 休眠子程序
RECEIV: AJMP RECEIVEEND01
KEY20: CLR K
JB DEL,DELETE01
JB ENTER,RECEIVEEND01
SETB RS0
CLR RS1
MOV KEY_2,R7
MOV B,#10H ;答案为两位数的情况
MOV A,KEY_1
MUL AB
ADD A,R7
MOV NUM_L,A
MOV NUM_H,#00h
CLR A
MOV A,#30H
ADD A,R7
MOV KEY_02,A
K2: LCALL SETUP ;液晶显示
MOV A,#80H ;;;;;第一行
LCALL WRITE_COM
SETB RS0
CLR RS1
MOV R0,#27H
MOV R6,#2
LCALL WRITE_ASCII
CLR A
MOV A,#90H ;;;;;第二行
LCALL WRITE_COM
MOV DPTR,#CHINESE2
LCALL WRITE_HZ
LCALL DELAY1
KEY3: JNB K,TIME3
AJMP KEY30
TIME3: SETB RS0
CLR RS1
CJNE R3,#0FFH,KEY3
TIM30: AJMP TIM40 ;防止区间过长,加了中转 TIME和slee相同,即 休眠子程序
DELETE01: AJMP DELETE1
RECEIVEEND01:
AJMP RECEIVEEND0
KEY30: CLR K
JB DEL,DELETE02
JB ENTER,RECEIVEEND02
SETB RS0
CLR RS1
MOV KEY_3,R7
MOV NUM_H,KEY_1
MOV B,#10H ;答案为3位数的情况
MOV A,KEY_2
MUL AB
ADD A,KEY_3
MOV NUM_L,A
CLR A
MOV A,#30H
ADD A,R7
MOV KEY_03,A
K3: LCALL SETUP ;液晶显示
MOV A,#80H ;;;;;第一行
LCALL WRITE_COM
SETB RS0
CLR RS1
MOV R0,#27H
MOV R6,#3
LCALL WRITE_ASCII
CLR A
MOV A,#90H ;;;;;第二行
LCALL WRITE_COM
MOV DPTR,#CHINESE3
LCALL WRITE_HZ
LCALL DELAY1
KEY4: JNB K,TIME4
AJMP KEY40
TIME4: SETB RS0
CLR RS1
CJNE R3,#0FFH,KEY4
TIM40: AJMP TIM50 ;防止区间过长,加了中转 TIME和slee相同,即 休眠子程序
DELETE02: AJMP DELETE2
RECEIVEEND02:
AJMP RECEIVEEND0
KEY40: CLR K
JB DEL,DELETE03
JB ENTER,RECEIVEEND0
SETB RS0
CLR RS1
MOV KEY_4,R7
MOV B,#10H ;答案为4位数的情况
MOV A,KEY_1
MUL AB
ADD A,KEY_2
MOV NUM_H,A
MOV B,#10H ;
MOV A,KEY_3
MUL AB
ADD A,KEY_4
MOV NUM_L,A
CLR A
MOV A,#30H
ADD A,R7
MOV KEY_04,A
K4: LCALL SETUP ;液晶显示
MOV A,#80H ;;;;;第一行
LCALL WRITE_COM
SETB RS0
CLR RS1
MOV R0,#27H
MOV R6,#4
LCALL WRITE_ASCII
CLR A
MOV A,#90H ;;;;;第二行
LCALL WRITE_COM
MOV DPTR,#CHINESE4
LCALL WRITE_HZ
LCALL DELAY1
KEY5: JNB K,TIME5
AJMP KEY50
TIME5: SETB RS0
CLR RS1
CJNE R3,#0FFH,KEY5
TIM50: AJMP SLEE
DELETE03: AJMP DELETE3
KEY50: CLR K
JB DEL,DELETE4
JB ENTER,RECEIVEEND0
AJMP KEY5
RECEIVEEND0:
AJMP RECEIVEEND
DELETE1: ;;;第一次按删除键
MOV NUM_L,#00H
MOV KEY_1,#00H
CLR DEL ;;;清除删除标志位
LJMP KEY1 ;;加显示
DELETE2: CLR DEL ;;;清除删除标志位
MOV NUM_L, KEY_1
MOV KEY_2,#00H
LJMP K1
DELETE3: CLR DEL ;;;清除删除标志位
MOV NUM_H,#00H
MOV B,#10H
MOV A,KEY_1
MUL AB
ADD A,KEY_2
MOV NUM_L,A
LJMP K2
DELETE4: CLR DEL ;;;清除删除标志位
MOV NUM_H,KEY_1
MOV B,#10H ;
MOV A,KEY_2
MUL AB
ADD A,KEY_3
MOV NUM_L,A
MOV NUM_H,KEY_1
LJMP K3
RECEIVEEND:
SETB P3.4
CLR P3.5 ;模块停止休眠
CLR TR0 ;停止计数
MOV TH0,#00H ;定时器从初始化
MOV TL0,#00H
SETB RS0
CLR RS1
MOV R2,#00H ;R2 R3计时单元清零
MOV R3,#00H
SETB TR0 ;允许定时器T0计时,记录答题时间
LCALL SETUP ;;;;液晶显示等待
CLR A
MOV A,#90H ;;;;;第二行
LCALL WRITE_COM
MOV DPTR,#CHINESE6
LCALL WRITE_HZ
HERE1: JNB RI,HERE2
AJMP REC
HERE2: SETB RS0
CLR RS1
CJNE R3,#0FFH,HERE1
AJMP SLEE1
REC: MOV A,SBUF ;接受停止码
CLR RI
CJNE A,#0FDH,HERE3
SLEE1: AJMP SLEE ;答题前,上位机把手持器的寄存器清零
;防止有人在两题间按键,抢答
HERE3: CJNE A,#0FFH,HERE1
CLR TR0
HERE0: JNB RI,HERE0
MOV A,SBUF ;接受地址码
CLR RI
CJNE A,#01H,HERE0
NOP
MOV A,#01H ;发送答案 GAO位
MOV SBUF,A
WAIT1: JNB TI,WAIT1
CLR TI
lcall SHORT_DELAY ;;;应该尽量去掉这段延时
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
MOV A,NUM_H ;发送答案 GAO位
MOV SBUF,A
WAIT2: JNB TI,WAIT2
CLR TI
lcall SHORT_DELAY ;;;应该尽量去掉这段延时
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
MOV A,NUM_L ;发送答案 DI 位
MOV SBUF,A
WAIT3: JNB TI,WAIT3
CLR TI
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
SETB RS0
CLR RS1
MOV A,R3
MOV SBUF,A
WAIT4: JNB TI,WAIT4
CLR TI
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
SETB RS0
CLR RS1
MOV A,R2
MOV SBUF,A
WAIT5: JNB TI,WAIT5
CLR TI
lcall SHORT_DELAY
lcall SHORT_DELAY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -