📄 jp01.asm
字号:
; 2DH: 待发数据地址暂存判断
; 2EH: p2口取反 与原状态异或后暂存
; 2FH: 取反后 异或前p2口的新状态暂存 位=1表示键接通
; 30H~3FH: 16字节的发送缓冲区
; 50H~5FH: 键原状态暂存
; 40H: 延时 40微秒用
; 41H: 延时 50毫秒用
; 42H: 延时 50毫秒用
; 43H: 发送位数计数用
; 44H: 位(列位地址)扫循环计数
; 45H: 行扫循环计数
; 46H: 当前发送数据计数=1该发送47h的数据了 =2该发48h =3该发49h =0下一步
; 47H: 当前待发数据第5 3 2 1字节或只有这一个字节
; 48H: 当前待发数据第4 2 1 字节
; 49H: 当前待发数据第3 1 字节
; 4AH: 当前待发数据第2 字节
; 4BH: 当前待发数据第1 字节
; 4CH:
;
;
; 位地址 20H:奇校验位暂存
; 70H~77H:可位寻址字节 异或后A值暂存 键扫p2口新状态暂存
; 21H:键扫描时p1 p3口选择位 =1选择p3口
; 22H:PAUSE键判断位=1证明是按第二次
; 23H:读取的奇校验位暂存
; 24H:=1表示接收到了有效命令
; 25H:
;
; 0组寄存器 R0:键扫描 行地址原状态字节指针
; R1:待发数据的地址的存储单元字节指针
; R2:
; R3:正在被发送字节
; R4:键扫描当前列数
; R5:键扫描当前行数
; R6:
; R7:
; 1组寄存器 R0: 待发数据全部前移用指针
; R1
; R2: 待发数据全部前移次数计数
; R3
;
;
;
;
ORG 0000H
LJMP START
ORG 0030H
RETI
ORG 0034H
START:
CLR P0.2
CLR P0.3
CLR P0.4
MOV SP,#70H ;设置堆栈指针
MOV R1,#30H ;设置待发指针初始值
SETB 22H ;PAUSE键判断位=1证明是按第二次
MOV 46H,#00H
MOV A,#00H
MOV 5FH,#0FH
MOV R0,#50H
ST1:
MOV @R0,A
INC R0
DJNZ 5FH,ST1
MOV R0,#50D ;延时2.5秒
ST2: ;
CALL YS50MA ;
DJNZ R0,ST2 ;
SETB P0.3
SETB P0.4
CLR 24H ;24h清零 证明没接收到有效命令
MOV 4EH,#00H
;MAIN: ;发送自检成功字节aa
; MOV R3,#0AAH
; CALL FSB1
MAIN1:
CALL MAIN2 ;调用 查看端口是否需要读 如需要且读取
CALL MAIN3 ;调用 判断接收到的命令 并执行
CALL SCANKEY ;调用键扫描程序
MOV A,46H ;当前需发字节数送a
CJNE A,#00H,MAIN1_4 ;查看是否有要发字节 =0没有
MAIN1_3:
CJNE R1,#30H,MAIN1_2 ;查看是否有待发字节地址需要转换为数据的=30h没有
LJMP MAIN1
MAIN1_2:
CALL MAINFS ;调用地址转数据子程
MAIN1_4:
CALL MAIN1_1 ;调用 发送 转换后数据
LJMP MAIN1_3
MAIN1_1: ;发送 转换后数据
MOV A,46H ;待发字节数送a
CJNE A,#05H,MAIN1_11 ;发送第五字节
MOV R3,4BH
CALL FSB1 ;调用 发送一个字节(R3)至主机子程序
MOV 46H,#04H
CALL DDF
CALL YS50M
MAIN1_11:
CJNE A,#04H,MAIN1_12 ;发送第四字节
MOV R3,4AH
CALL FSB1
MOV 46H,#03H
CALL DDF
CALL YS50M
MAIN1_12:
CJNE A,#03H,MAIN1_13 ;发送第三字节
MOV R3,49H
CALL FSB1
MOV 46H,#02H
CALL DDF
CALL YS50M
MAIN1_13:
CJNE A,#02H,MAIN1_14 ;发送第二字节
MOV R3,48H
CALL FSB1
MOV 46H,#01H
CALL DDF
CALL YS50M
MAIN1_14:
CJNE A,#01H,MAIN1_15 ;发送第一字节
MOV R3,47H
CALL FSB1
MOV 46H,#00H
CALL DDF
CALL YS50M
MAIN1_15:
RET
MAIN2: ;(读端口 至少10ms检测一次)查看端口是否需要读 如需要且读取 子程序
SETB P0.0
SETB P0.1
JB P0.1,MA20
MOV 4CH,#08H
MAIN2_1:
CALL YS20
CLR P0.0 ;把时钟线拉低
CALL YS40
SETB P0.0 ;把时钟线拉高
CALL YS20
MOV C,P0.1 ;读取一位数据
RRC A
DJNZ 4CH,MAIN2_1
CALL YS20
CLR P0.0 ;把时钟线拉低
CALL YS40
SETB P0.0 ;把时钟线拉高
CALL YS20
MOV C,P0.1 ;读取一位数据
MOV 23H,C ;读取的奇校验位暂存
CALL YS20
CLR P0.0 ;把时钟线拉低
CALL YS40
SETB P0.0 ;把时钟线拉高
CALL YS20
CLR P0.1
MAIN2_2:
CALL YS20
CLR P0.0 ;把时钟线拉低
CALL YS40
SETB P0.0 ;把时钟线拉高
CALL YS20
SETB P0.1 ;释放数据线
NOP
NOP
JNB P0.1,MAIN2_2
CPL P0.4 ;;;;;;;;;;;;;;;;;;;;;;;;;;
; MOV R3,#0FAH ;发送应答字节0fa
; CALL FSB1
INC R6
CJNE R6,#01H,A01
MOV 4EH,A
A01:
CJNE R6,#02H,A02
MOV 4FH,A
A02:
CJNE R6,#03H,A03
MOV 60H,A
A03:
CJNE R6,#04H,A04
MOV 61H,A
A04:
CJNE R6,#05H,A05
MOV 62H,A
MOV R6,#00H
A05:
SETB 24H ;24h置1 证明接收到了有效命令
MA20:
RET
MAIN3: ;判断接收到的命令 并执行
JNB 24H,MA305 ;查看是否收到有效命令字节=1有命令继
CLR 24H ;清有效命令位
CJNE A,#0FFH,MA301 ;收到 键盘复位命令
LJMP START
MA301:
CJNE A,#0F2H,MA302 ;收到 键盘回应2个字节的ID 0xab 0x83 命令
MOV R3,#0ABH
CALL FSB1
MOV R3,#83H
CALL FSB1
LJMP MA305
MA302:
CJNE A,#0F0H,MA303 ;收到 回应使用哪套扫描码集 命令
MA303:
CJNE A,#0EDH,MA305 ;收到 键盘灯状态 命令
MOV R3,#0FAH ;发送应答字节0fa
CALL FSB1
MA303_1:
SETB P0.0
SETB P0.1
JB P0.1,MA303_1
CALL MAIN2
JNB 24H,MA305
CLR 24H
; CPL A ;更新指示灯状态
; RRC A ;
; MOV P0.4,C ;
; RRC A ;
; MOV P0.3,C ;
; RRC A ;
; MOV P0.2,C ;
MA305:
RET
MAINFS: ;将待发数据地址一字节转为数据 并刷新缓冲区 子程序
SETB RS0 ;用1组
MOV R0,#31H
MOV R2,#0FH
MAINFS1:
MOV A,@R0
DEC R0
MOV @R0,A
INC R0
INC R0
DJNZ R2,MAINFS1 ;缓冲区前移一字节
MOV R0,#30H
MOV A,@R0 ;读入待发数据地址
MOV 2DH,A ;待发数据地址暂存 准备判断用
ANL A,#01111111B
MOV DPTR,#0500H
MOVC A,@A+DPTR
CJNE A,#0E0H,MAINFS2
CALL EPD
LJMP MAINFS5
MAINFS2:
CJNE A,#0E1H,MAINFS3
CALL EPD
LJMP MAINFS5
MAINFS3:
CJNE A,#00H,MAINFS4
LJMP MAINFS5
MAINFS4:
MOV 47H,A
JB 2DH.7,MAINFS4_1
MOV 46H,#01H
LJMP MAINFS5
MAINFS4_1:
MOV 48H,#0F0H
MOV 46H,#02
MAINFS5:
CLR RS0 ;用0组
DEC R1 ;待发数据指针减1
RET
EPD: ;当数据是E0/E1时判断
MOV A,2DH
ANL A,#01111111B
CJNE A,#00000011B,EPD1 ;R CTRL
MOV 47H,#14H
LJMP EPD30
EPD1:
CJNE A,#00000100B,EPD2 ;SLEEP
MOV 47H,#3FH
LJMP EPD30
EPD2:
CJNE A,#00000101B,EPD3 ;R START
MOV 47H,#27H
LJMP EPD30
EPD3:
CJNE A,#00000110B,EPD4 ;POWER
MOV 47H,#37H
LJMP EPD30
EPD4:
CJNE A,#00000111B,EPD5 ;PAUSE
CPL 22H ;PAUSE键判断位=1证明是按第二次
JB 22H,EPD4_1
MOV 47H,#77H
MOV 48H,#14H
MOV 49H,#0E1H
MOV 46H,#03H
LJMP EPD32
EPD4_1:
MOV 47H,#77H
MOV 48H,#0F0H
MOV 49H,#14H
MOV 4AH,#0F0H
MOV 4BH,#0E1H
MOV 46H,#05H
LJMP EPD32
EPD5:
CJNE A,#00001000B,EPD6 ;PRINT
MOV 47H,#12H
LJMP EPD30
EPD6:
CJNE A,#00001010B,EPD7 ;R ALT
MOV 47H,#11H
LJMP EPD30
EPD7:
CJNE A,#00001110B,EPD8 ;L START
MOV 47H,#1FH
LJMP EPD30
EPD8:
CJNE A,#00101001B,EPD9 ;DEL
MOV 47H,#71H
LJMP EPD30
EPD9:
CJNE A,#00101010B,EPD10 ;DOWN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 4DH,#08H
MOV A,4FH
CPL A
CLR P0.2
CLR P0.3
CALL YS50M
CALL YS50M
CALL YS50M
CALL YS50M
MAINA3_12:
SETB P0.2
SETB P0.3
RLC A
MOV R7,#40D ;延时2.5秒
MAINA3_1: ;
CALL YS50M ;
DJNZ R7,MAINA3_1 ;
MOV P0.3,C
CLR P0.2
MOV R7,#40D ;延时2.5秒
MAINA3_11: ;
CALL YS50M ;
DJNZ R7,MAINA3_11 ;
DJNZ 4DH,MAINA3_12
SETB P0.2
SETB P0.3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 47H,#72H
LJMP EPD30
EPD10:
CJNE A,#01001010B,EPD11 ;APPR(文档)
MOV 47H,#2FH
LJMP EPD30
EPD11:
CJNE A,#00110001B,EPD12 ;INSERT
MOV 47H,#70H
LJMP EPD30
EPD12:
CJNE A,#00110010B,EPD13 ;RIGHT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 4DH,#08H
MOV A,61H
CPL A
CLR P0.2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -