简洁实用的键盘接口及其译码结构(下)

🏠 首页 《无线电》杂志 1989年 🔗 第3期 🔗 第31页 分类:技术市场 🔗 周振安 🔗

键译码参考子程序如下:
\

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。(周振安)