📄 ht48 keyboardscan.asm
字号:
;HT48单片机
#include ht48r70a-1.INC
DataBus EQU PA
DataBus_c EQU PAC
variable .section 'data'
scanNum db ? ;用于记录扫描线编号
count1 db ? ;循环延时计数
count2 db ? ;循环延时计数
code .section 'code'
org 000h
jmp main
org 008h
call T0_Isp
org 010h
main:
mov a, 000h
mov tmr0l, a
mov a, 0d8h ;10ms
mov tmr0h, a ;初始化
set emi
set et0i ;开中断
mov a, 10010000b
mov tmr0c, a ;设置T0工作模式,启动定时
jmp $
T0_Isp proc
clr tmr0c ;关闭计数器0
mov a, 0fh
orm a, pdc
mov a, 8fh
andm a, pdc ;将pd的低四位设为输入,4,5,6位设为输出
clr DataBus_c
clr DataBus ;数据线上放0
call Delay10ms
call Delay10ms ;软件去抖
clr scanNum
Scan:
swap scanNum
mov a, 08fh
and a, pd
or a, scanNum
mov pd, a
swap scanNum
inc scanNum ;设置扫描线号
mov a, pd
and a, 07h
xor a, 07h
snz z ;不为全1
jmp FindKey ;如果不为全1,则有键按下,输入确定按键
mov a, 4
sub a, scanNum
snz z ;是否已扫描完
jmp Scan
jmp EndScan
FindKey:
dec scanNum ;恢复扫描线号
snz pd0
jmp Pd0_Press
snz pd1
jmp Pd1_Press
snz pd2
jmp Pd2_Press
jmp Error
Pd0_Press:
mov a, scanNum
sub a, 0
sz z
jmp Pd0_0
mov a, scanNum
sub a, 1
sz z
jmp Pd0_1
mov a, scanNum
sub a, 2
sz z
jmp Pd0_2
jmp Pd0_3
Pd0_0:
mov a, 0ch
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd0_1:
mov a, 09h
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd0_2:
mov a, 6
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd0_3:
mov a, 03h
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd1_Press:
mov a, scanNum
sub a, 0
sz z
jmp Pd1_0
mov a, scanNum
sub a, 1
sz z
jmp Pd1_1
mov a, scanNum
sub a, 2
sz z
jmp Pd1_2
jmp Pd1_3
Pd1_0:
mov a, 0ah
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd1_1:
mov a, 7
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd1_2:
mov a, 4
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd1_3:
mov a, 1
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd2_Press:
mov a, scanNum
sub a, 0
sz z
jmp Pd2_0
mov a, scanNum
sub a, 1
sz z
jmp Pd2_1
mov a, scanNum
sub a, 2
sz z
jmp Pd2_2
jmp Pd2_3
Pd2_0:
mov a, 0bh
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd2_1:
mov a, 08h
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd2_2:
mov a, 5
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
Pd2_3:
mov a, 02h
mov tblp, a
tabrdl DataBus
jmp ReScan ;继续读键盘
ReScan:
mov a, pd
and a, 07h
xor a, 07h
snz z
jmp ReScan
jmp EndScan ;继续摸摸直到松开键盘
Error:
set pa ;出错,LED全亮
EndScan:
clr pa
mov a, 10010000b
mov tmr0c, a ;设置T0工作模式,启动定时
reti
T0_Isp endp
Delay10ms proc
mov a, 10
mov count1, a
loop:
mov a, 20
mov count2, a
sdz count2
jmp $ - 1
sdz count1
jmp loop
ret
Delay10ms endp
;数字的LED编码表
org lastpage
SegmentTable:
DC 00111111b ;0
DC 00000110b ;1
DC 01011011b ;2
DC 01001111b ;3
DC 01100110b ;4
DC 01101101b ;5
DC 01111101b ;6
DC 00000111b ;7
DC 01111111b ;8
DC 01101111b ;9
DC 01110111b ;a
DC 01111100b ;b
DC 00111001b ;c
DC 01011110b ;d
DC 01111011b ;e
DC 01110001b ;f
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -