键译码参考子程序如下:
\
KEY: PUSH HL ;①
PUSH BC
PUSH AF
PUSH DE
LD A,(BFo);②
CP O
JPNZ, M ;③
JP END
M: DEC A ;④
LD(BFo),A
LD A,OOH; ;⑤
CALL CAP ;⑥
JPNZ,KEYo ;⑦
LD A,01H ;⑧
CALL CAP
JPNA,KEYo
LD A,02H ;⑨
CALL CAP
JPNZ,KEYo
LD A,03H ;⑩
CALL CAP
JPNZ,KEYo
LD A,04H ;
CALL CAP
JPNZ,KEY0
LD A,05H ;
CALL CAP
JPNZ,KEY0
LD A 06H ;
CALL CAP
JPNZ,KEY0
LD A,07H ;
CALL CAP
JPNZ,KEY0
LD D,00H ;
JP VALo
KEY0:OR D ;
LD D,A
LD A(BFo+1) ;
CP D ;
JP Z,VAL1 ;
LD B,00H
LD A,D
LD(BFo+1),A
JP END
VALV:INC B
VAL0:LD A, D ;
CP 00H
JP Z
JP END
VAL2:LD A,B ;
CP 04H
JPNC
JP END
VAL3:LD B,00H ;
LD A,(BFo+1);
SUB 08H ;
LD HL,BFo+2 ;
BIT 0,(HL)
JP Z,VAL4
ADD 10H ;
LD C,A
ADD A,C
ADD A,C
LD(HL),00H ;
JP VAL6
VAL4:LD C,A ;
ADD A,C
ADD A,C
VAL6:LD B,0 ;
LD C,A
LD HL,TAB ;
ADD HL,BC
JP(HL) ;
JTAB:JP KEY1 ;
JP KEY2
JP KEY24
KEYl:………………… ;
KEY24:……………
END:POP DE ;
POP AF
POP BC
POP HL
RET
CAP:OUT(PORTBD),
A ;
LD D,A ;
IN A,(PORTAD)
;
AND 18H ;
CP 18H ;
RET
注①:保护现场。②取中断计数器内容。③若(BF\(_{0}\))=0则跳出,返回主程序;否则转至M。④中断计数器减1。⑤扫描第一行。⑥调用比较子程序。⑦判断行有无键按下。⑧扫描第2行。⑨~分别为扫描第3行~第8行。D清零。将键的行、列值并成一个字节。@取上次健代码。当前键代码比较。不相同则B清零,键值→(BF0+1),然后返回主程序。断D是否为零。再判断B是否大于4,若两者都满足,则继续下去,否则返回主程序。B清零。取键代码。去08得到键值。断上次是否按过功能键。过功能键,修正键值,即(16+键值)×3→A。除功能键标志位。按过功能键,则键值为(键值×3)→A。值→BC。令转移首地址JTAB送HL。转移指针跳转。令转移表。编的键功能模块。原现场。行值输出到B口。值保存。A口的列值。蔽掉无用位。断列值是否为011000。(周振安)