📄 510.asm
字号:
lcall SHORT_DELAY
lcall SHORT_DELAY
MOV A,TH0
MOV SBUF,A
WAIT6: JNB TI,WAIT6
CLR TI
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
lcall SHORT_DELAY
MOV A,TL0
MOV SBUF,A
WAIT7: JNB TI,WAIT7
CLR TI
MOV TH0 ,#00H
MOV TL0 ,#00H
SETB RS0
CLR RS1
MOV R2,#00H ;R2 R3计时单元清零
MOV R3,#00H
SETB TR0
HER1: JNB RI,HER2
AJMP RECE
HER2: SETB RS0
CLR RS1
CJNE R3,#0FFH,HER1
AJMP SLEE
RECE: MOV A,SBUF ;接受停止码
CLR RI
CJNE A,#01H,HER1
HER11: JNB RI,HER12
AJMP ANSER2
HER12: SETB RS0
CLR RS1
CJNE R3,#0FFH,HER11
AJMP SLEE
ANSER2:
MOV A,SBUF
CLR RI
CJNE A,#0FBH,ANSER3
AJMP RIGHT
ANSER3: CJNE A,#0FAH,HER11
AJMP WRONG
RIGHT:
LCALL SETUP ;液晶显示 ;显示答题正确信息
CLR A
MOV A,#90H ;;;;;第二行
LCALL WRITE_COM
MOV DPTR,#CHINESE7
LCALL WRITE_HZ
HERE11: JNB RI,HERE21
AJMP SENT1
HERE21: SETB RS0
CLR RS1
CJNE R3,#0FFH,HERE11 ;;时间过长,自动休眠
AJMP SLEE
SENT1: MOV A,SBUF
CLR RI
CJNE A,#0FDH,HERE11 ;回答下一个题前,有清零信号 没有接到清零信号且时间在规定范围内
;显示答题正确或错误信息
AJMP SLEE ;答题前,上位机把手持器的寄存器清零
WRONG:
LCALL SETUP ;液晶显示
CLR A
MOV A,#90H ;;;;;第二行
LCALL WRITE_COM
MOV DPTR,#CHINESE8
LCALL WRITE_HZ
HERE12: JNB RI,HERE22
AJMP SENT2
HERE22: SETB RS0
CLR RS1
CJNE R3,#0FFH,HERE12 ;;显示上位机的返回信息
AJMP SLEE
SENT2: MOV A,SBUF ;接受停止码
CLR RI
CJNE A,#0FDH,HERE12 ;回答下一个题前,有清零信号 没有接到清零信号且时间在规定范围内
;显示答题正确或错误信息
AJMP SLEE ;答题前,上位机把手持器的寄存器清零
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 休眠子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SLEE: CLR K
CLR DEL
CLR ENTER
MOV A,#01H
LCALL WRITE_COM
MOV A,#08H
LCALL WRITE_COM
MOV TH0,#00H ;定时器中断从初始化
MOV TL0,#00H
MOV P1,#0C0H ;p1口0-5为低电平 6,7为高电平
SETB EA
SETB EX0
SETB EX1
SETB P3.5
SETB RS0
CLR RS1
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H ;R2 R3计时单元清零
MOV R3,#00H
MOV R4,#00H ;R4 R5计时单元清零
MOV R5,#00H
MOV R6,#00H
MOV R7,#00H ;按键值暂存在R7
MOV P0,#00H
MOV P2,#00H
CLR P3.4
MOV PCON,#82H ;深度休眠,晶振停振
LJMP KEY1 ;LJMP SLEE时,外部中断0正常工作,但是外1只相应1,2次中断,不知道为什么
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;中断子程序
SERVEINT0:
CLR EX0 ;关外部中断0,保存答案
CLR EX1 ;关外部中断0,保存答案
SETB RS0
CLR RS1
SETB K
KEY00: MOV P1,#0FEH ;判断键值
JB P1.7,KEY01
MOV R7,#00H
AJMP PASS0
KEY01: MOV P1,#0FDH
JB P1.7,KEY02
MOV R7,#01H
AJMP PASS0
KEY02: MOV P1,#0FBH
JB P1.7,KEY03
MOV R7,#02H
AJMP PASS0
KEY03: MOV P1,#0F7H
JB P1.7,KEY04
MOV R7,#03H
AJMP PASS0
KEY04: MOV P1,#0EFH
JB P1.7,KEY05
MOV R7,#04H
AJMP PASS0
KEY05: MOV P1,#0DFH
JB P1.7,KEY0D
SETB ENTER
AJMP PASS0
KEY0D: CLR K
PASS0: MOV P1,#0C0H ;p0口0-5为低电平 6,7为高电平
SETB EX0
SETB EX1
RETI
SERVEINT1: CLR EX0
CLR EX1
SETB RS0
CLR RS1
SETB K
KEY06: MOV P1,#0FEH ;判断键值
JB P1.6,KEY07
MOV R7,#05H
AJMP PASS1
KEY07: MOV P1,#0FDH
JB P1.6,KEY08
MOV R7,#06H
AJMP PASS1
KEY08: MOV P1,#0FBH
JB P1.6,KEY09
MOV R7,#07H
AJMP PASS1
KEY09: MOV P1,#0F7H
JB P1.6,KEY0A
MOV R7,#08H
AJMP PASS1
KEY0A: MOV P1,#0EFH
JB P1.6,KEY0B
MOV R7,#09H
AJMP PASS1
KEY0B: MOV P1,#0DFH
JB P1.6,KEY0C
SETB DEL
AJMP PASS1
KEY0C: CLR K
PASS1: MOV P1,#0C0H ;p0口0-5为低电平 6,7为高电平
SETB EX0
SETB EX1
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;定时器中断子程序
T0INT:
CLR EA ;关中断
PUSH PSW ;保护现场
PUSH ACC
SETB RS0
CLR RS1
INC R2
CJNE R2,#0FFH,FULL
INC R3
;CJNE R3,#0FFH,FULL
;INC R4
FULL: MOV TH0,#00H
MOV TL0,#00H
POP ACC
POP PSW
SETB EA ;CPU开中断
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;延时子程序
SHORT_DELAY:
MOV DELAY_NUM,#04H ;设定延时时间为约8us
SHORT_LP:
DJNZ DELAY_NUM,SHORT_LP
RET
SETUP:
MOV A,#01H
LCALL WRITE_COM
MOV A,#00110000B
LCALL WRITE_COM
MOV A,#00000010B
LCALL WRITE_COM
MOV A,#00000100B
LCALL WRITE_COM
MOV A,#00001110B
LCALL WRITE_COM
MOV A,#00000001B
LCALL WRITE_COM
MOV A,#10000000B
LCALL WRITE_COM
RET
WRITE_COM:
PUSH DPL
PUSH DPH
LCALL DELAY1
MOV DPTR,#0000H
MOV DPTR,#0000H
MOVX @DPTR,A
MOVX @DPTR,A
LCALL DELAY1
POP DPH
POP DPL
RET
WRITE_DAT:
PUSH DPL
PUSH DPH
LCALL DELAY1
MOV DPTR,#0002H
MOV DPTR,#0002H
MOVX @DPTR,A
MOVX @DPTR,A
POP DPH
POP DPL
RET
DELAY1:
SETB RS0
CLR RS1
MOV R4,#10H
D11: MOV R5,#10H
DJNZ R5,$
DJNZ R4,D11
RET
WRITE_ASCII:
SETB RS0
CLR RS1
PUSH DPL
PUSH DPH
DDDD:
CLR A
;MOVC A,@A+DPTR
SETB RS0
CLR RS1
MOV A,@R0
LCALL WRITE_DAT
SETB RS0
CLR RS1
INC R0
DJNZ R6,DDDD ;;;;;;;;使用R0-7需要换个工作区
POP DPH
POP DPL
RET
WRITE_HZ: PUSH DPL
PUSH DPH
SETB RS0
CLR RS1
MOV R6,#08h ;;;;;;;;使用R0-7需要换个工作区
DD: CLR A
MOVC A,@A+DPTR
LCALL WRITE_DAT
INC DPTR
CLR A
MOVC A,@A+DPTR
LCALL WRITE_DAT
INC DPTR
SETB RS0
CLR RS1
DJNZ R6,DD
POP DPH
POP DPL
RET
TABLE1:
CGRAM1:DB 02H,12H
CGRAM2:DB 22H,32H
CGRAM3:DB 42H,52H
CGRAM4:DB 62H,72H
SHOW1: DB
SHOW2: DB
SHOW3: DB 00H
SHOW4: DB 00H
SHOW5: DB
SHOW6: DB
SHOW7: DB
SHOW8: DB
CHINESE1:DB 0D2H,0BBH,0CEH,0BBH,0CAH,0FDH,0A3H,0ACH,0C8H,0B7H,0B6H,0A8H,0C2H,0F0H,0A3H,0BFH ;;;一位数,确定吗?
CHINESE2:DB 0B6H,0FEH,0CEH,0BBH,0CAH,0FDH,0A3H,0ACH,0C8H,0B7H,0B6H,0A8H,0C2H,0F0H,0A3H,0BFH ;;;二位数,确定吗?
CHINESE3:DB 0C8H,0FDH,0CEH,0BBH,0CAH,0FDH,0A3H,0ACH,0C8H,0B7H,0B6H,0A8H,0C2H,0F0H,0A3H,0BFH ;;;三位数,确定吗?
CHINESE4:DB 0CBH,0C4H,0CEH,0BBH,0CAH,0FDH,0A3H,0ACH,0C8H,0B7H,0B6H,0A8H,0C2H,0F0H,0A3H,0BFH ;;;四位数,确定吗?
CHINESE5:DB 0C9H,0BEH,0B6H,0FDH,0D2H,0BBH,0CEH,0BBH,0A3H,0A1H,0A1H,0A0H,0A1H,0A0H,0A1H,0A0H ;;;删除一位
CHINESE6:DB 0C8H,0B7H,0B6H,0A8H,0A3H,0A1H,0B5H,0C8H,0B4H,0FDH,0D6H,0D0H,0A9H,0A8H,0A9H,0A8H ;;;确认!等待中....
CHINESE7:DB 0D5H,0FDH,0C8H,0B7H,0A3H,0ACH,0BAH,0C3H,0B0H,0F4H,0B0H,0A1H,0A3H,0A1H,0A3H,0A1H ;;;正确,好棒啊!
CHINESE8:DB 0B4H,0EDH,0CEH,0F3H,0A3H,0ACH,0BCH,0CCH,0D0H,0F8H,0C5H,0ACH,0C1H,0A6H ,0A3H,0A1H;;;错误,继续努力!
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -