📄 keyboard.asm
字号:
.include "F2407REGS.H" ;引用头部文件
.def _c_int0
.sect ".text"
.data
DTABLE: .word 00c0h, 00f9h, 00a4h, 00b0h, 0099h, 0092h, 0082h, 00f8h
.word 0080h, 0090h, 0088h, 0083h, 00c6h, 00a1h, 0086h, 008eh
ScanBits: .word 00e0h,00d0h,00b0h,0070h
ScanTable0: .word 00h, 07h, 04h, 01h
ScanTable1: .word 0Ah, 08h, 05h, 02h
ScanTable2: .word 0Bh, 09h, 06h, 03h
ScanTable3: .word 0Ch, 0Dh, 0Eh, 0Fh
TEMP .word 0H
RESULT .word 0H
.text
IO_LED .set 8000H
IO_KEYS .set 800BH ;低4比特
IO_KEYV .set 800AH ;低4比特
IO_ST .set 800BH
IO_SEG0 .set 8002H
IO_SEG1 .set 8003H
IO_SEG2 .set 8004H
IO_SEG3 .set 8005H
IO_SEG4 .set 8006H
IO_SEG5 .set 8007H
IO_SEGD .set 8001H
_c_int0 ;相当于主程序的入口
CALL SYSINIT ;调系统初始化程序
CALL KEYBOARD_INIT
LOOP:
CALL SCAN_KEYBOARD
CALL DISP_KEY
B LOOP
KEYBOARD_INIT:
LDP #DP_B01
LACC #0FFFFH
SACL TEMP
OUT TEMP, IO_SEGD
OUT TEMP, IO_SEG0
OUT TEMP, IO_SEG1
OUT TEMP, IO_SEG2
OUT TEMP, IO_SEG3
OUT TEMP, IO_SEG4
LACC #0000H
SACL TEMP
OUT TEMP, IO_SEG0
OUT TEMP, IO_SEG1
OUT TEMP, IO_SEG2
OUT TEMP, IO_SEG3
OUT TEMP, IO_SEG4
OUT TEMP, IO_SEG5
LACC #0FFFFH
SACL TEMP
OUT TEMP, IO_KEYS
IN RESULT, IO_KEYV
RET
SCAN_KEYBOARD:
LDP #DP_B01 ;init keyboard
LACC #0FFFFH
SACL RESULT
LAR AR1, #ScanBits
LAR AR2, #0
NEXT:
LACC #0FFFFH
SACL TEMP
OUT TEMP, IO_KEYS
CALL DELAY
MAR *, AR1
OUT *+,IO_KEYS
CALL DELAY
IN TEMP, IO_KEYV
MAR *, AR2
LACC TEMP
AND #000FH
XOR #000FH
BCND PRESSED, NEQ ; 有键按下
;MAR *, AR2
LAR AR0, #4
ADRK #1
CMPR 00
BCND NEXT, NTC
LACC #0FFFFH
SACL TEMP
PRESSED:
;SBRK #1
;SAR AR2, TEMP
BIT TEMP, BIT0
BCND ZERO_BIT0, NTC
BIT TEMP, BIT1
BCND ZERO_BIT1, NTC
BIT TEMP, BIT2
BCND ZERO_BIT2, NTC
BIT TEMP, BIT3
BCND ZERO_BIT3, NTC
B QUIT
ZERO_BIT0:
LAR AR0, #0
;LAR AR2, #ScanTable0
B TRANS
ZERO_BIT1:
LAR AR0, #1
;LAR AR2, #ScanTable1
B TRANS
ZERO_BIT2:
LAR AR0, #2
;LAR AR2, #ScanTable2
B TRANS
ZERO_BIT3:
LAR AR0, #3
;LAR AR2, #ScanTable3
B TRANS
TRANS:
;SBRK #1
SAR AR2, TEMP
LACC TEMP, 2
ADD #ScanTable0
SACL TEMP
LAR AR2, TEMP
MAR *0+
LACC *
SACL RESULT
QUIT:
RET
;****************************************************************************
;数码管显示函数,要求显示前将待显示数据的保存在RESULT中
;****************************************************************************
DISP_KEY:
LDP #DP_B01
MAR *, AR1
LAR AR1,RESULT
LAR AR0,#0FFFFH
CMPR 00
BCND NOTHING, TC
LAR AR0, #DTABLE
MAR *0+
OUT *, IO_SEGD
NOTHING:
RET
*系统初始化程序*
SYSINIT:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF ;B0 被配置为数据存储空间
LDP #0E0H
SPLK #81FEH, SCSR1 ;CLKIN=6 M, CLKOUT=24 M
SPLK #0E8H, WDCR ;不使能WDT
LDP #0
SPLK #0000H, IMR ;不使能
SPLK #0FFFFH, IFR ;清全部中断标志
RET
*软件延时程序*
DELAY:
MAR *, AR4
LAR AR4, #0800H
LAR AR0, #00H
DELAY1: SBRK #1
NOP
CMPR 00
BCND DELAY1, NTC
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -