矩阵按键识别技术_第1页
矩阵按键识别技术_第2页
矩阵按键识别技术_第3页
矩阵按键识别技术_第4页
矩阵按键识别技术_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验7 矩阵按键识别技术          矩阵按键部份由16个轻触按键按照4行4列排列,连接到JP50端口。将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。相关原理:程序运行照片:接线方法:1、用一条8PIN数据排线,把矩阵按键部份的JP50,接到CPU部份的P1口JP44. 2、接8位数码管的数据线。将数码管部份的数据口 JP

2、5接到CPU部份的P0口JP51.3、接8位数码管的显示位线。将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.;本程序实现扫描按键显示功能.;分别按16个键盘显示分别显示数字123A456B789C*0#D;键盘口P1,数码管显示第二位p21, 数码管段位p0口  确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.程序流程图:     8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3设置为输入

3、线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。1、检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。2、去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。3、若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出:在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义

4、的键值。4、为了保证键每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。汇编语言参考程序:org 0000hajmp mainorg 0080hmain:mov dptr,#tab ;将表头放入DPTRlcall key ;调用键盘扫描程序movc a,a+dptr ;查表后将键值送入ACCmov p0,a ;将Acc值送入P0口CLR P2.1 ;开显示ljmp main ;返回反复循环显示KEY: LCALL KS ;调用检测按键子程序JNZ K1 ;有键按下继续LCALL DELAY2 ;无键按调用延时去抖AJMP KEY ;返回继续检测按键K1: LCALL DELAY2LCALL

5、 DELAY2 ;有键按下延时去抖动LCALL KS ;再调用检测按键程序JNZ K2 ;确认有按下进行下一步AJMP KEY ;无键按下返回继续检测K2: MOV R2,#0EFH ;将扫描值送入 R2暂存MOV R4,#00H ;将第一列值送入R4暂存K3: MOV P1,R2 ;将R2的值送入P1口L6: JB P1.0,L1 ;P1.0等于1跳转到L1MOV A,#00H ;将第一行值送入ACCAJMP LK ;跳转到键值处理程序L1: JB P1.1,L2 ;P1.1等于1跳转到L2MOV A,#04H ;将第二行的行值送入ACCAJMP LK ;跳转到键值理程序进行键值处理L2:

6、JB P1.2,L3 ;P1.2等于1跳转到L3MOV A,#08H ;将第三行的行值送入ACCAJMP LK ;跳转到键值处理程L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处MOV A,#0cH ;将第四行的行值送入ACCLK: ADD A,R4 ;行值与列值相加后的键值送入APUSH ACC ;将A中的值送入堆栈暂存K4: LCALL DELAY2 ;调用延时去抖动程序LCALL KS ;调用按键检测程序JNZ K4 ;按键没有松开继续返回检测POP ACC ;将堆栈的值送入ACCRETNEXT:INC R4 ;将列值加一MOV A,R2 ;将R2的值送入AJNB AC

7、C.7,KEY ;扫描完至KEY处进行下一扫描RL A ;扫描未完将A中的值右移一位进行下一列的扫描MOV R2,A ;将ACC的值送入R2暂存AJMP K3 ;跳转到K3继续KS: MOV P1,#0FH ;将P1口高四位置0低四位值1MOV A,P1 ;读P1口XRL A,#0FH ;将A中的值与A中的值相异或RET ;子程序返回DELAY2: ;40ms延时去抖动子程序MOV R5,#08HL7: MOV R6,#0FAHL8: DJNZ R6,L8DJNZ R5,L7RETtab:db 28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,3

8、0h,62h,0a2h,7eh;0h0hc9878654a321 轮流显示键盘因为无法表达*# 就用H表示,B用8表示endc语言参考程序:#include <reg52.h>#include <intrins.h>sbit BEEP = P3 7; /蜂鸣器驱动线unsigned char key;unsigned char code disp_code =/显示码数组0,C,8,A,H,9,6,3,0,8,5,2,H,7,4,10x28,0xa9,0x20,0x30,0x34,0x60,0x21,0x62,0x28,0x20,0x61,0xa2,0x34,0x7a,

9、0x74,0x7e;unsigned char code key_code =/键编码数组0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb,0xb7, 0x7e, 0x7d, 0x7b, 0x77;char code SST5163 _at_ 0x003b; /保留仿真器/*延时子函数*/void delayms(unsigned int ms)unsigned char t;while (ms-)for (t = 0; t < 114; t+);/*x*0.14MS 延时子函数*/void delayus(

10、unsigned char x)unsigned char i;while (x-)for (i = 0; i < 14; i+);/*蜂鸣器驱动子函数*/void beep()unsigned char i;for (i = 0; i < 250; i+)delayus(6);BEEP = !BEEP; /BEEP取反BEEP = 1; /关闭蜂鸣器delayms(150); /延时/*键盘扫描子函数*/unsigned char keyscan()unsigned char scan1, scan2, keycode, j;P1 = 0xf0;scan1 = P1;if (scan1 != 0xf0)/判键是否按下delayms(10); /延时10msscan1 = P1;if (scan1 != 0xf0)/二次判键是否按下P1 = 0x0f;scan2 = P1;keycode = scan1 | scan2; /组合成键扫描编码for (j = 0; j < 16; j+)if (keycode = key_codej)/查表得键值key = j;return (key); /返回有效键值elseP1 = 0xff;return (key = 16); /

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论