}
unsigned char GetKey2(void) {
P1=0xF0;
CheckValue=P1^0xF0; if(CheckValue==0x00) return 0x00;
else if(CheckValue==0x10) Row=CheckValue; else if(CheckValue==0x20) Row=CheckValue; else if(CheckValue==0x40) Row=CheckValue; else if(CheckValue==0x80) Row=CheckValue; delay1();
KeyTemp = P1^0xF0; if(KeyTemp==CheckValue) return 0x00; Key2=0xF0; return Key2; }
void main() {
unsigned char Key1,Key2; InitialCPU(); InitialTimer0(); while(1) {
Key1=GetKey1(); Key2=GetKey2();
if(Key1!=0x00&&Key2!=0x00) {
Dispose(); P3=0x00; } } }
一、实验目的
1.掌握4×4矩阵式键盘程序识别原理 2.掌握4×4矩阵式键盘按键的设计方法
二、设计原理
(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键 “0-F”的序号 (2)键盘中对应按键的序号排列如图14.1所示 三、参考电路
740)this.width=740\
border=undefined>
图14.2 4×4矩阵式键盘识别电路原理图
740)this.width=74
border=undefined>
图14.1 4×4键盘0-F显示
740)this.width=74
border=undefined>
图14.3 4×4矩阵式键盘识别程序流程图 四、电路硬件说明
(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键区域中的M1-M4,N1-N4端口上
(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h
五、程序设计内容
(1)4×4矩阵键盘识别处理
(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码矩阵的行线和列线分别过两并行接口和CPU通信键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的键盘理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共形成键编码而识别按键,通过软件查表,查出该键的功能 六、程序流程图(如图14.3所示) 七、汇编源程序 ;;;;;;;;;;定义单元;;;;;;;;;; COUNT EQU 30H ;;;;;;;;;;入口地址;;;;;;;;;; ORG 0000H LJMP START ORG 0003H RETI
ORG 000BH RETI
ORG 0013H RETI
ORG 001BH RETI
ORG 0023H RETI
ORG 002BH RETI
;;;;;;;;;;主程序入口;;;;;;;;;; ORG 0100H
START: LCALL CHUSHIHUA
LCALL PANDUAN LCALL XIANSHI LJMP START
;;;;;;;;;;初始化程序;;;;;;;;;;
CHUSHIHUA: MOV COUNT#00H RET
;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN: MOV P3#0FFH CLR P3.4 MOV AP3 ANL A#0FH XRL A#0FH JZ SW1
LCALL DELAY10MS JZ SW1 MOV AP3 ANL A#0FH
CJNE A#0EHK1 MOV COUNT#0 LJMP DK
K1: CJNE A#0DHK2 MOV COUNT#4 LJMP DK
K2: CJNE A#0BHK3 MOV COUNT#8 LJMP DK
K3: CJNE A#07HK4 MOV COUNT#12 K4: NOP LJMP DK
SW1: MOV P3#0FFH CLR P3.5 MOV AP3 ANL A#0FH XRL A#0FH JZ SW2
LCALL DELAY10MS JZ SW2 MOV AP3 ANL A#0FH
CJNE A#0EHK5 MOV COUNT#1 LJMP DK
K5: CJNE A#0DHK6