笔者在实际制作中采用另外一种结构的按键输入方式,可使键的数量增加不少。例如同样使用8数据位总线可以将键增加到28个,最多可达36个,读键程序比矩阵式还简单,不知其他读者是否也用过类似形式的键盘电路。所以本文就电路原理和相关程序作些简述,目的是与读者共同探讨电路的实用性。
电路如图所示,这里假设硬件使用的是MCS-51系列的P1口。读键程序流程图如图所示,读入键值前先向P1口写数据,即扫描值,使该端口始终有一位清0,其它位均为1,然后将P1 口数据读入累加器A。如果无键按下则读入的数据扫描值相等,即八位二进制数中仅有一位为0,此时标志寄存器的奇偶位P为1,程序按无键按下处理。如果有键按下则读入的数据必然有两位为0。此时奇偶位P为0,程序将键值临时存入B寄存器中,经延时去抖动后再读P1口数据,A与B寄存器比较是否相等,是则按有键闭合处理,否则按无键闭合处理。每完成一次键扫描无论有无键按下扫描值都左环移一位再写入P1口,循环判断所有的输入键。按键闭合确认后键值仍保存在A中,主程序进入判断转向程序寻找与键值对应的目标。
为了便于程序阅读和少出差错。编程时使用与按键排列一致的二进制数。程序中的Q1至Q28表示的是要执行的程序,根据设计者的需要可用转移、调用指令。但执行完子程序后必须能够返回原处或主程序入口处。
本电路用于AT89C2051芯片时应注意P1.0和P1.1内部无上拉电阻,需在外面分别对正电源连接10K左右的电阻,否程序无法正常工作。
如果需要更多的按键可用GND分别对P1口每个I/O端连接一个按键,这样总共是36个键,主程序在判断 完上述的28个键后将P1口全部置位,逐位判断是否为零即可,程序简单,这里不再赘述,读者可自己编写,键扫描程序如下。
IN EQU P1
STORE EQU R5
TEMPl EQU R6
TEMP2 EQU R7
ORG 0000H
AJMP SETUP
ORG 0020H
SETUP:MOV STORE.#11111110B:
:键扫描主程序
MAINl:MOV lN,STORE:扫描值送定义的端口
MOV A,IN:端口数据读入A
JB P,MAIN2:奇偶标志是否为1
MOV B,A :否则键值送B暂存
ACALL DELAY:延时去抖动
MOV A.1N :再读端口数据送A
CJNE A,B,MAIN2:键值是否与第一次相等
AJMP LOOKl:是则确定有键闭合
MAIN2:MOV A,sTORE;当前扫描值送A
RL A:A左环移1位
MOV STORE,A:送回扫描值存储器
AJMP MAIN1 :转主程序入口
:键值判断执行程序
LOOKl:CJNE A.#11111100B.LOOK2
LCALL Q1
AJMP MAIN2
LOOK2:CJNE A.#11111010B.LOOK3
LCALL Q2
AJMP MAIN2
LOOK26:CJNE A.#10011111B.LOOK27
LCAI—L Q26
AJMP MAIN2
LOOK27:CJNE A.#01011111B.LOOK28
LCALL Q27
AJMP MAIN2
LOOK28:CJNE A.#00111111B.LOOK29
LCALL Q28
LOOK29:AJMP MAIN2
:延时程序
DELAY: MOV TEMPl.#01FH
DELAYl:MOV TEMP2.#0FFH
DINZ R7.$
DJNZ R6,DELAYl
RET
END
|
|