📄 key.asm
字号:
;;;;;;;---------------------------------按键程序参考-------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;****编程状态****;;;;;;;;;;;;;;;;;;;;;;;;;;
SYSTEM09: MOV R0,KEYCODE ;散转指令根据KEYCODE的值来转到相应的程序执行
CJNE R0,#0BH,BCKEYGO1;判断按键码是否大于现有按键码
BCKEYGO1: JC BCKEYGO2
LJMP KEYEND
BCKEYGO2: MOV DPTR,#DEALTAB09 ;取表头地址
MOV A,R0
MOV B,#03H ;长跳转指令占3个字节
MUL AB ;R0的内容乘以3
XCH A,B ;高低位互换
ADD A,DPH ;计算高地址
MOV DPH,A ;高地址给DPH
XCH A,B
JMP @A+DPTR ;跳到散转表中相应位置
DEALTAB09: LJMP BCKEY1 ;"调格"
LJMP BCKEY2 ;"班产"
LJMP BCKEY3 ;"换箱"
LJMP BCKEY4 ;"班组"
LJMP BCKEY0 ;"+"
LJMP BCKEY6 ;"调纬"
LJMP BCKEY7 ;"盘长"
LJMP BCKEY8 ;"设定"
LJMP BCKEY9 ;"RST"
LJMP BCKEY5 ;"-"
LJMP KEYEND ;自检
LJMP BCKEYB ;编程
BCKEY0: MOV A,EFDATA
ANL A,#0FH ;取出地址内容2
CJNE A,#0FH,BCNUMGO1 ;判断地址内容2是否到最大F
MOV A,EFDATA
ANL A,#0F0H ;将地址内容2的值复位成0
MOV EFDATA,A ;存回
SJMP BCOUT ;送出
BCNUMGO1: MOV A,#01H ;地址内容2的值+1
ADD A,EFDATA
MOV EFDATA,A ;存回
BCOUT: LCALL BCDTDIS ;调用编程数据显示程序
LJMP KEYEND
BCKEY1: MOV A,EFDATA
ANL A,#0F0H ;取出地址内容1
SWAP A ;高低字节交换
CJNE A,#0FH,BCNUMGO2 ;判断地址内容2是否到最大F
MOV A,EFDATA
ANL A,#0FH ;将地址内容1的值复位成0
MOV EFDATA,A ;存回
SJMP BCOUT1 ;送出
BCNUMGO2: MOV A,#10H ;地址内容1的值+1
ADD A,EFDATA
MOV EFDATA,A ;存回
BCOUT1: LCALL BCDTDIS ;调用编程数据显示程序
LJMP KEYEND
BCKEY2: JB ADSUFLAG,BCSUBB ;如果为减模式则转到减功能
AINCNEXT: MOV A,ADDESS1 ;判断地址是否到达最大1FFFH
CJNE A,#1FH,BCKEY2GO1
MOV A,ADDESS2
CJNE A,#0FFH,BCKEY2GO1
MOV ADDESS1,#00H
MOV ADDESS2,#00H ;如果地址到达最大,则复位成0000H
MOV DPH,ADDESS1
MOV DPL,ADDESS2
SJMP BCDAOUT
BCKEY2GO1: MOV DPH,ADDESS1
MOV DPL,ADDESS2
INC DPTR ;地址+1
MOV ADDESS1,DPH
MOV ADDESS2,DPL
BCDAOUT: MOVX A,@DPTR ;读出地址内容
MOV EFDATA,A
LCALL BCDTDIS ;调用编程数据显示程序
LJMP KEYEND
BCSUBB: MOV A,ADDESS2
ANL A,#0FH ;取出地址2
CJNE A,#00H,BCNUMGO3 ;判断地址2是否到最小0
MOV A,ADDESS2
ORL A,#0FH ;将地址2复位成F
MOV ADDESS2,A ;存回
SJMP BCOUT2 ;送出
BCNUMGO3: MOV A,ADDESS2 ;地址2-1
CLR C
SUBB A,#01H
MOV ADDESS2,A ;存回
BCOUT2: MOV DPH,ADDESS1
MOV DPL,ADDESS2
SJMP BCDAOUT
LJMP KEYEND
BCKEY3: JB ADSUFLAG,BCSUBB1 ;如果为减模式则转到减功能
MOV A,ADDESS2
ANL A,#0F0H ;取出地址1
SWAP A
CJNE A,#0FH,BCNUMGO4 ;判断地址1是否到最大F
MOV A,ADDESS2
ANL A,#0FH ;将地址1的值复位成0
MOV ADDESS2,A ;存回
SJMP BCOUT3 ;送出
BCNUMGO4: MOV A,#10H ;地址内容2的值+1
ADD A,ADDESS2
MOV ADDESS2,A ;存回
BCOUT3: MOV DPH,ADDESS1
MOV DPL,ADDESS2
SJMP BCDAOUT
LJMP KEYEND
BCSUBB1: MOV A,ADDESS2
ANL A,#0F0H ;取出地址1
CJNE A,#00H,BCNUMGO5 ;判断地址1是否到最小0
MOV A,ADDESS2
ORL A,#0F0H ;将地址1复位成F
MOV ADDESS2,A ;存回
SJMP BCOUT4 ;送出
BCNUMGO5: MOV A,ADDESS2 ;地址1-1
CLR C
SUBB A,#10H
MOV ADDESS2,A ;存回
BCOUT4: MOV DPH,ADDESS1
MOV DPL,ADDESS2
SJMP BCDAOUT
LJMP KEYEND
BCKEY4: JB ADSUFLAG,BCSUBB2 ;如果为减模式则转到减功能
MOV A,ADDESS1
CJNE A,#01FH,BCNUMGO6 ;判断地址1是否到最大F
MOV ADDESS1,#00H ;到最大,恢复到00H
SJMP BCOUT5 ;送出
BCNUMGO6: INC ADDESS1 ;地址1+1
BCOUT5: MOV DPH,ADDESS1
MOV DPL,ADDESS2
LJMP BCDAOUT
BCSUBB2: MOV A,ADDESS1
CJNE A,#00H,BCNUMGO7 ;判断地址1是否到最小00
MOV ADDESS1,#1FH ;到最小,恢复到1FH
SJMP BCOUT6 ;送出
BCNUMGO7: DEC ADDESS1 ;地址1+1
BCOUT6: MOV DPH,ADDESS1
MOV DPL,ADDESS2
LJMP BCDAOUT
BCKEY5: MOV A,EFDATA
ANL A,#0FH ;取出地址内容2
CJNE A,#00H,BCNUMGO8 ;判断地址内容2是否到最小0
MOV A,EFDATA
ORL A,#0FH ;将地址内容2的值复位成F
MOV EFDATA,A ;存回
SJMP BCOUT7 ;送出
BCNUMGO8: MOV A,EFDATA ;地址内容2的值-1
CLR C
SUBB A,#01H
MOV EFDATA,A ;存回
BCOUT7: LCALL BCDTDIS ;调用编程数据显示程序
LJMP KEYEND
BCKEY6: MOV A,EFDATA
ANL A,#0F0H ;取出地址内容1
CJNE A,#00H,BCNUMGO9 ;判断地址内容1是否到最小0
MOV A,EFDATA
ORL A,#0F0H ;将地址内容1的值复位成F
MOV EFDATA,A ;存回
SJMP BCOUT8 ;送出
BCNUMGO9: MOV A,EFDATA ;地址内容2的值-1
CLR C
SUBB A,#10H
MOV EFDATA,A ;存回
BCOUT8: LCALL BCDTDIS ;调用编程数据显示程序
LJMP KEYEND
BCKEY7: LCALL KEYOVER ;等待抬起
MOV DPH,ADDESS1
MOV DPL,ADDESS2
MOV A,EFDATA ;将EFDATA的值写入指定的地址中
CLR P1.3
MOVX @DPTR,A ;写入
SETB P1.3
LCALL WRDEALY ;调用12.5MS的延时程序,等待28C64B数据写入完毕
LJMP AINCNEXT ;数据写入以后指向下一个地址
LJMP KEYEND
BCKEY8: LCALL KEYOVER ;等待按键抬起(KEYOVER只有按键抬起后才返回)
CPL ADSUFLAG ;将+/-状态翻转
LJMP KEYEND
BCKEY9: LJMP STARTGO4
BCKEYB: LJMP STARTGO4 ;在编程状态下再次按下编程键,直接复位
;;;;;;;;;;;;;;;;;;;;;;;;编程数据显示程序;;;;;;;;;;;;;;;;;;;;;;;;
;;函数名: BCDTDIS
;;功能: 编程数据显示
;;操作的变量:ADDESS1,编程地址高两位数据
;; ADDESS2,编程地址低两位数据
;; EFDATA,地址内容
;;调用的程序:DISPLAY,显示程序
;;堆栈使用:
;;注意:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCDTDIS: MOV A,ADDESS1 ;编程地址高两位数据显示在前两位
ANL A,#0FH ;屏蔽掉1地址值
MOV DISBUF2,A ;送2地址值到显示缓冲区2
MOV A,ADDESS1
ANL A,#0F0H ;屏蔽掉2地址值
SWAP A
MOV DISBUF1,A ;送1地址值到显示缓冲区1
MOV A,ADDESS2 ;编程地址高两位数据显示在中间两位
ANL A,#0FH ;屏蔽掉3地址值
MOV DISBUF4,A ;送4地址值到显示缓冲区4
MOV A,ADDESS2
ANL A,#0F0H ;屏蔽掉4地址值
SWAP A
MOV DISBUF3,A ;送3地址值到显示缓冲区3
MOV A,EFDATA ;地址内容数据显示在最后两位
ANL A,#0FH ;屏蔽掉1内容值
MOV DISBUF6,A ;送2内容值到显示缓冲区6
MOV A,EFDATA
ANL A,#0F0H ;屏蔽掉2内容值
SWAP A
MOV DISBUF5,A ;送1内容值到显示缓冲区5
ACALL DISPLAY ;送出显示
RET
;;;;;;------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -