矩阵键盘的接口与控制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STEP6: 松手检测
P3=0xf8; temp_key=P1; while(temp_key!=0xff) { temp_key=P1; }
P3.0
P3.1
“0” “0”
P3.2
“0”
等待按键抬起 P1.0 P1.1 P1.2 P1.3 P1.4 退出扫描程序 P1.5 P1.6 P1.7
“1” “1” “1” “1” “0” “1” “1” “1” “1”
矩阵式键盘的接口与控制
结束
单片机原理及应用
矩阵式键盘的接口与控制
矩阵式键盘的广泛应用
在单片机应用系统中,通常要使用键盘完 成人机对话,实现控制命令及数据的输入。
键盘分为非编码键盘和编码键盘,由软件
完成对按键闭合状态识别的称为非编码键 盘;由专用硬件实现按键闭合状态识别的 称为编码键盘;
单片机学习板上的矩阵式键盘
4*4矩阵键盘的结构
完整程序实例
#include <reg51.h> #define uchar unsigned char
void keyscan(void); void dlms(void); uchar keyvalue=0xff; void main(void) { while(1) { keyscan(); P2=~keyvalue; } } void dlms(void) { uchar i; for(i=200;i>0;i--); }
sccode=P1; recode=temp; temp=temp<<1|0x01; } else temp=temp<<1|0x01; } if(recode==0xfe) { switch(sccode) { case 0xfe: keyvalue=0;break; case 0xfd:keyvalue=1;break; case 0xfb:keyvalue=2;break; case 0xf7:keyvalue=3;break; case 0xef:keyvalue=4;break; case 0xdf:keyvalue=5;break; case 0xbf:keyvalue=6;break; case 0x7f:keyvalue=7;break; } }
STEP1: 检测是否有键按下 void keyscan( ) 向单片机的行扫描口输出全0,检测列输出口的状态是否全为“ 1” { unsigned char temp_key; P1=0xff; P3=0xf8; temp_key=P1; if(temp_key!=0xff) { … P3.0 } } “0”
if(recode==0xfd) { switch(sccode) { case 0xfe: keyvalue=8;break; case 0xfd:keyvalue=9;break; case 0xfb:keyvalue=10;break; case 0xf7:keyvalue=11;break; case 0xef:keyvalue=12;break; case 0xdf:keyvalue=13;break; case 0xbf:keyvalue=14;break; case 0x7f:keyvalue=15;break; default:break; } } if(recode==0xfb) { switch(sccode) { case 0xfe:keyvalue=16;break; case 0xfd:keyvalue=17;break; case 0xfb:keyvalue=18;break; case 0xf7:keyvalue=19;break; case 0xef:keyvalue=20;break;
STEP5:将得到的行号和列号进行译码,得到键值
P3.0 ) if(recode==0xfb { switch(sccode) { P3.1 case 0xfe: keyvalue=16;break; case 0xfd:keyvalue=17;break; case 0xfb:keyvalue=18;break; P3.2 case 0xf7:keyvalue=19;break; case 0xef:keyvalue=20;break; case 0xdf:keyvalue=21;break; case 0xbf:keyvalue=22;break; case 0x7f:keyvalue=23;break; P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 default:break; } }
第0行
第1行
第2行
第3行 第0列 Fra Baidu bibliotek1列 第2列 第3列
4*4矩阵键盘的结构
第0行
“0”
第1行
第2行
第3行 第0列 第1列 第2列 第3列
4*4矩阵键盘与51单片机的接口
P1口的高四位连接键盘的列线,低四位连接键盘的行线
实验箱上的键盘
列 线 接 口 插 孔
行 线 接 口 插 孔
实验箱上的键盘原理图
void keyscan(void) { uchar i,temp,sccode; uchar recode,temp_key; P1=0xff; P3=0xf8; temp=0xfe; temp_key=P1; if(temp_key!=0xff) { dlms(); temp_key=P1; if(temp_key!=0xff) { for(i=0;i<3;i++) { P3=temp; temp_key=P1; if(temp_key!=0xff) {
if(recode==0xfe) { switch(sccode) { case 0xfe: keyvalue=0;break; case 0xfd:keyvalue=1;break; case 0xfb:keyvalue=2;break; case 0xf7:keyvalue=3;break; case 0xef:keyvalue=4;break; case 0xdf:keyvalue=5;break; case 0xbf:keyvalue=6;break; case 0x7f:keyvalue=7;break; default:break; } }
STEP1:检测是否有键按下; STEP2:若有键按下,延时去抖动; 若没有键按下,退出扫描程序; STEP3:再次检测是否有键按下,若此时没有检 测到有键按下,退出扫描程序; STEP4:逐行扫描,判断按下的按键所在的行线 与列线; STEP5:将得到的行线与列线的值进行转换,得 到按下的按键所代表的键值; STEP6:松手检测;
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
STEP3:再次检测是否有键按下
P3.0
P3.1
P3.2
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
void dlms(void) { unsigned char i; for(i=200;i>0;i--); } void keyscan( ) { unsigned char temp_key; P1=0xff; P3=0xf8; temp_key=P1; if(temp_key!=0xff) { dlms(); temp_key=P1; if(temp_key!=0xff) { …… } } }
“0”
键盘与单片机的接口
3条行线连接P3口的低三位 8条列线连接P1口
键盘输入信息的处理过程
1. CPU判断是否有键按下。 2. 确定按下的是哪一个键。 3. 把此键代表的信息转换成单片机所能识 别的代码,如ASCII或其它特征码。
常用的按键识别方法有扫描法和反转法。其中扫描法比较常见。
矩阵键盘扫描法的基本过程
作业与思考
根据矩阵键盘扫描法的基本思路,完成单 片机学习板的键盘扫描程序设计。 在扫描法中,CPU的空闲时间必须扫描键 盘,否则有键按下时CPU将无法获知,但 多数时间CPU处于空扫描状态,不利于程 序的优化,因此常采用定时扫描或中断扫 描的方式,请尝试结合定时器或外部中断 来完成程序设计。
case 0xdf:keyvalue=21;break; case 0xbf:keyvalue=22;break; case 0x7f:keyvalue=23;break; default:break; } } P3=0xf8; temp_key=P1; while(temp_key!=0xff) { temp_key=P1; } } } }
STEP4:逐行扫描
P3.0
P3.1
“0” “1” “0” “1”
P3.2
“1” “0”
void keyscan( ) { uchar temp_key; uchar i,temp,recode,sccode; P1=0xff; P3=0xf8; temp_key=P1; if(temp_key!=0xff) { dlms(); temp_key=P1; if(temp_key!=0xff) { temp=0xfe; for(i=0;i<3;i++) { P3=temp; temp_key=P1; if(temp_key!=0xff) { sccode=P1; recode=temp; temp=temp<<1|0x01; } else temp=temp<<1|0x01; P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 } } “1” “1” “1” “1” “1” “1” “0” “1” “1” }
if(recode==0xfd) { switch(sccode) { case 0xfe: keyvalue=8;break; case 0xfd:keyvalue=9;break; case 0xfb:keyvalue=10;break; case 0xf7:keyvalue=11;break; case 0xef:keyvalue=12;break; case 0xdf:keyvalue=13;break; case 0xbf:keyvalue=14;break; case 0x7f:keyvalue=15;break; default:break; } }
P3.1
“0”
P3.2
“0” 若不全为1,继 续执行;否则, 退出扫描;
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
“1”
“1” “1” “0” “1” “1” “1”
“1”
STEP2: 若有键按下,延时去抖动
P3.0
P3.1
P3.2
void dlms(void) { unsigned char i; for(i=200;i>0;i--); } void keyscan( ) { 按键按下 按键是一种机械开关,其触点在闭合或断开瞬间, unsigned char temp_key; 会出现电压抖动现象,为了保证按键识别的准确 P1=0xff; P3=0xf8; 性,常采用硬件或软件两种方法进行消抖处理。 temp_key=P1; 硬件方法采用RS触发器等消抖电路;软件方法则 if(temp_key!=0xff) 是采用时间延迟(10ms),待信号稳定再判别键 { dlms(); 盘状态,若仍有按键闭合,则确认有键按下,否 前沿抖动 键稳定 后沿抖动 … … 则认为是按键的抖动。 } }