《2022年2022年经典的矩阵键盘扫描程序 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年经典的矩阵键盘扫描程序 .pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、经典的矩阵键盘扫描程序查找哪个按键被按下的方法为:一个一个地查找。先第一行输出 0,检查列线是否非全高;否则第二行输出 0,检查列线是否非全高;否则第三行输出 0,检查列线是否非全高;如果某行输出 0 时,查到列线非全高,则该行有按键按下;根据第几行线输出 0 与第几列线读入为0,即可判断在具体什么位置的按键按下。下面是具体程序:void Check_Key(void)unsigned char row,col,tmp1,tmp2;tmp1=0 x10;/tmp1用来设置 P1口的输出,取反后使P1.4P1.7 中有一个为 0 for(row=0;row4;row+)/行检测 P1=0 x0f
2、;/先将 p1.4P1.7 置高 P1=tmp1;/使 P1.4p1.7 中有一个为 0 tmp1*=2;/tmp1左移一位 if(P1&0 x0f)0 x0f)/检测 P1.0P1.3 中是否有一位为 0,只要有,则说明此行有键按下,进入列检测 tmp2=0 x01;/tmp2用于检测出哪一列为0 for(col=0;col4;col+)/列检测名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 18 页 -if(P1&tmp2)=0 x00)/该列如果为低电平则可以判定为该列 key_val=key_Map row*4+col;/获取键值,识别按键;key_Map为按键的定义表
3、return;/退出循环 tmp2*=2;/tmp2左移一位 /结束这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。4*4 矩阵键盘扫描程序/*设置行线为输入线,列线为输出线*/uchar KeyScan();/按键扫描子程序void delay10ms();/延时程序uchar key_free();/等待按键释放程序void key_deal();/键处理程序/主程序void main()while(1)KeyScan();key_free();key_deal();/按键扫描子程序uchar KyeScan()unsigned char key,temp;P1=0 x
4、F0;if(P1&0 xF0!=0 xF0)delay10ms();/延时去抖动if(P1&0 xF0!=0 xF0)P1=0 xFE;/扫描第一列名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 18 页 -temp=P1;temp=temp&0 xF0;if(temp!=0 xF0)/如果本列有键按下 switch(temp)case 0 xE0:/第一行有键按下key=0;break;case 0 xD0:/第二行有键按下key=4;break;case 0 xB0:/第三行有键按下key=8;break;case 0 x70:/第四行有键按下key=12;break;P1=
5、0 xFD;/扫描第二列temp=P1;temp&=0 xF0;if(temp!=0 xF0)switch(temp)case 0 xE0:/第一行有键按下key=1;break;case 0 xD0:/第二行有键按下key=5;break;case 0 xB0:/第三行有键按下key=9;break;case 0 x70:/第四行有键按下key=13;break;P1=0 xFb;/扫描第三列temp=P1;temp&=0 xF0;if(temp!=0 xF0)switch(temp)case 0 xE0:/第一行有键按下key=2;break;case 0 xD0:/第二行有键按下key=
6、6;break;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 18 页 -case 0 xB0:/第三行有键按下key=10;break;case 0 x70:/第四行有键按下key=14;break;P1=0 xF7;/扫描第四列temp=P1;temp&=0 xF0;if(temp!=0 xF0)switch(temp)case 0 xE0:/第一行有键按下key=3;break;case 0 xD0:/第二行有键按下key=7;break;case 0 xB0:/第三行有键按下key=11;break;case 0 x70:/第四行有键按下key=15;break;ret
7、urn(key);/延时程序void delay10ms()unsigned char i,j;for(i=0;i10;b+)for(j=0;j120;j+)/延时 1ms /等待按键释放程序uchar key_free()key=key_scan();/取扫描到的键值P1=0 xF0;/置行线全为高电平,列线全为低电平wheile(P1&0 xF0!=0 xF0)/如果仍有键按下 名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 18 页 -return(key);/返回键值 51 单片机矩阵键盘扫描、数码管显示键值实验/*程序名称:矩阵键盘扫描显示键值简要说明:P1口接矩阵键盘
8、:低四位列,高四位行使用共阳型数码管:P0口输出数码管段码,P2口输出数码管位码编写:JiangX.net*/#include#define uchar unsigned char;uchar key_val=0;/定义键值,初始默认为0 uchar code TAB16=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xa1,0 x86,0 x8e;/0F共阳数码管显示段码/*按键扫描*/void Check_Key(void)unsigned char row,col,tmp1,
9、tmp2;tmp1=0 x10;/tmp1用来设置 P1口的输出,取反后使P1.4P1.7 中有一个为 0 for(row=0;row4;row+)/行检测 P1=0 x0f;/先将 p1.4P1.7 置高 P1=tmp1;/使 P1.4p1.7 中有一个为 0 tmp1*=2;/tmp1左移一位 if(P1&0 x0f)0 x0f)/检测 P1.0P1.3 中是否有一位为 0,只要有,则说明此行有键按下,进入列检测 tmp2=0 x01;/tmp2用于检测出哪一列为0 for(col=0;col4;col+)/列检测 if(P1&tmp2)=0 x00)/该列如果为低电平则可以判定为该列 k
10、ey_val=row*4+col;/获取键值,识别按键 return;/退出循环 tmp2*=2;/tmp2左移一位 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 18 页 -/*主函数,显示键值*/void main()P2=0 x00;/位码,这里全部置低,点亮8 位数码管(见视频效果)while(1)Check_Key();P0=TABkey_val;/显示 实验 7 矩阵按键识别技术矩阵按键部分由 16 个轻触按键按照 4 行 4 列排列,连接到 JP50端口。将行线所接的单片机的I/O 口作为输出端,而列线所接的I/O 口则作为输入。这样,当按键没有按下时,所有的输出
11、端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.判断键盘中有无键按下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高
12、电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 18 页 -下面给出一个具体的例子:8031 单片机的 P1口用作键盘I/O 口,键盘的列线接到P1口的低 4 位,键盘的行线接到P1 口的高 4位。列线 P1.0-P1.3设置为输入线,行线 P1.4-P.17设置为输出线。4 根行线和 4 根列线形成16 个相交点。1,检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取 P1.0-P1.3 的状态,若 P1.0-P1.3为全“1”
13、,则无键闭合,否则有键合。2,去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。3.若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7 按下述 4 种组合依次输出:P1.7 1 1 1 0 P1.6 1 1 0 1 P1.5 1 0 1 1 P1.4 0 1 1 1 在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。4,为了保证键每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。实验目的:通过 XL20
14、00的 16 位矩阵按键,在数码管上分别显示0-9,A,B,C,D,E,F。接线方法:1,用一条 8PIN 数据排线,把矩阵按键部份的JP50,接到 CPU 部份的P1口 JP44.名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 18 页 -2,接 8 位数码管的数据线。将数码管部份的数据口 JP5 接到 CPU 部份的 P0口 JP51.3,接 8 位数码管的显示位线。将数码管部份的显示位口 JP8 接到 CPU部份的 P2口 JP52.参考程序:;本程序实现扫描按键显示功能.;分别按 16 个键盘显示分别显示数字123A456B789C*0#D;键盘口 P1,数码管显示第二位
15、p21,数码管段位 p0 口org 0000h ajmp main org 0030h main:mov dptr,#tab ;将表头放入 DPTR lcall key ;调用键盘扫描程序movc a,a+dptr ;查表后将L3:JB P1.3,NEXT ;P1.3等于 1 跳转到 NEXT 处 MOV A,#0cH ;将第四行的行值送入 ACC LK:ADD A,R4 ;行值与列值相加后的键值送入 A PUSH ACC ;将 A中的值送入堆栈暂存K4:LCALL DELAY2 ;调用延时名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 18 页 -键值送入 ACC mov p0
16、,a ;将 Acc 值送入 P0口CLR P2.1 ;开显示ljmp main ;返回反复循环显示KEY:LCALL KS ;调用检测按键子程序 JNZ K1 ;有键按下继续 LCALL DELAY2 ;无键按调用延时去抖 AJMP KEY ;返回继续检测按键K1:LCALL DELAY2 LCALL DELAY2 ;有键按下延时去抖动去抖动程序 LCALL KS ;调用按键检测程序 JNZ K4 ;按键没有松开继续返回检测 POP ACC ;将堆栈的值送入ACC RET NEXT:INC R4 ;将列值加一 MOV A,R2 ;将 R2的值送入 A JNB ACC.7,KEY ;扫描完至 K
17、EY处进行下一扫描 RL A ;扫描未完将 A中的值右移一位进行下一列的扫描 MOV R2,A ;将 ACC 的值送入名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 18 页 -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跳转到 L1 MOV A,#00H ;将第一行值送入 ACC AJMP LK ;跳转到
18、键值处理程序R2暂存 AJMP K3 ;跳转到 K3继续KS:MOV P1,#0FH ;将 P1口高四位置 0低四位值 1 MOV A,P1 ;读 P1口 XRL A,#0FH ;将 A中的值与 A中的值相异或 RET ;子程序返回DELAY2:;40ms延时去抖动子程序 MOV R5,#08H L7:MOV R6,#0FAH L8:DJNZ R6,L8 DJNZ R5,L7 RET tab:名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 18 页 -L1:JB P1.1,L2 ;P1.1等于 1跳转到 L2 MOV A,#04H ;将第二行的行值送入 ACC AJMP LK
19、;跳转到键值理程序进行键值处理L2:JB P1.2,L3 ;P1.2等于 1 跳转到 L3 MOV A,#08H ;将第三行的行值送入 ACC AJMP LK ;跳转到键值处理程序db 28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh ;0h0hc9878654a321 轮流显示键盘因为无法表达*#就用 H表示,B用 8 表示end 矩阵按键与数码管显示的运行照片3x4 矩阵键盘的扫描程序(C 语言)3x4 矩阵键盘的扫描程序(C 语言)按相应的按键,数码管显示相应的数字,星号键和井号键分别显示为E和 F#inc
20、lude unsigned char code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,/04 0 x92,0 x82,0 xF8,0 x80,0 x90,/59 0 x88,0 x83,0 xA7,0 xA1,0 x86,0 x8E;/AF 名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 18 页 -void KeyScan();void delay10ms(unsigned char time);void Dispaly(unsigned char k);unsigned char key,temp;void main()/主程序 while
21、(1)KeyScan();void KeyScan()/按键扫描子程序 P1=0 xFF;P1_3=0;temp=P1;temp&=0 xF0;if(temp!=0 xF0)delay10ms(1);temp=P1;temp&=0 xF0;if(temp!=0 xF0)temp=P1;temp&=0 xF0;switch(temp)case 0 x70:key=1;break;case 0 xB0:key=2;break;case 0 xD0:key=3;break;Dispaly(key);名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 18 页 -P1=0 xFF;P1_2
22、=0;temp=P1;temp&=0 xF0;if(temp!=0 xF0)delay10ms(1);temp=P1;temp&=0 xF0;if(temp!=0 xF0)temp=P1;temp&=0 xF0;switch(temp)case 0 x70:key=4;break;case 0 xB0:key=5;break;case 0 xD0:key=6;break;Dispaly(key);P1=0 xFF;P1_1=0;temp=P1;temp&=0 xF0;if(temp!=0 xF0)delay10ms(1);temp=P1;temp&=0 xF0;if(temp!=0 xF0)t
23、emp=P1;temp&=0 xF0;switch(temp)case 0 x70:名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 18 页 -key=7;break;case 0 xB0:key=8;break;case 0 xD0:key=9;break;Dispaly(key);P1=0 xFF;P1_0=0;temp=P1;temp&=0 xF0;if(temp!=0 xF0)delay10ms(1);temp=P1;temp&=0 xF0;if(temp!=0 xF0)temp=P1;temp&=0 xF0;switch(temp)case 0 x70:key=14;
24、break;case 0 xB0:key=0;break;case 0 xD0:key=15;break;Dispaly(key);/延时程序void delay10ms(unsigned char time)unsigned char a,b,c;for(a=0;atime;a+)for(b=0;b10;b+)名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 18 页 -for(c=0;c120;c+);void Dispaly(unsigned char k)/显示程序 P0=tablek;P2_1=0;C51矩阵键盘扫描程序代码实例/*p1.3 p1.2 p1.1 p1.0
25、*-|-|-|-|-p1.4*-|-|-|-|-p1.5*-|-|-|-|-p1.6*-|-|-|-|-p1.7*|*键值排列:*15 14 13 12*11 10 9 8*7 6 5 4*3 2 1 0*/#define uchar unsigned char#include uchar KeyScan()uchar row=0;/将行号置 0 uchar col=0;/将列号置 0 uchar mask=0 x7f;uchar pic=0;uchar key0=255;uchar Shift_Count=0;uchar code Key_value=0,1,2,3,5,6,7,8,9,10
26、,名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 18 页 -11,12,13,14,15,16;/*抖动返回200,无键按下返回255*/P1&=0 x0f;if(P1&0 x0f)=0 x0f)key0=255;return(key0);Delay(50);/延时 25mS 去抖动if(P1&0 x0f)=0 x0f)key0=200;return(key0);/*有键按下,则分析键所在的列号*/P1=mask;while(P1&0 x0f)=0 x0f&Shift_Count3)+col;+Shift_Count;mask=_cror_(mask,1);/右移动一位 P1
27、=mask;/*有键按下,则分析键所在的行号*/pic=P1&0 x0f;mask=0 x01;while(pic&mask)+row;mask=_crol_(mask,1);/左移一位/*得到键值*/pic=row*4+col;key0=Key_valuepic;return(key0);/*函数功能:延时程序0.5mS*input:i*output:NULL*mcu:p89c51*frequency:11.0592M Hz*period:f/6*/void Delay(uint i)uchar j;while(i-)名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 18 页
28、-for(j=0;j125;j+);/*p1.3 p1.2 p1.1 p1.0*-|-|-|-|-p1.4*-|-|-|-|-p1.5*-|-|-|-|-p1.6*-|-|-|-|-p1.7*|*键值排列:*15 14 13 12*11 10 9 8*7 6 5 4*3 2 1 0*/#define uchar unsigned char#include uchar KeyScan()uchar row=0;/将行号置0 uchar col=0;/将列号置 0 uchar mask=0 x7f;uchar pic=0;uchar key0=255;uchar Shift_Count=0;uch
29、ar code Key_value=0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16;/*抖动返回200,无键按下返回255*/P1&=0 x0f;if(P1&0 x0f)=0 x0f)key0=255;return(key0);Delay(50);/延时 25mS 去抖动if(P1&0 x0f)=0 x0f)key0=200;return(key0);/*有键按下,则分析键所在的列号*/名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 18 页 -P1=mask;while(P1&0 x0f)=0 x0f&Shift_Count3)+col;+Shi
30、ft_Count;mask=_cror_(mask,1);/右移动一位 P1=mask;/*有键按下,则分析键所在的行号*/pic=P1&0 x0f;mask=0 x01;while(pic&mask)+row;mask=_crol_(mask,1);/左移一位/*得到键值*/pic=row*4+col;key0=Key_valuepic;return(key0);/*函数功能:延时程序0.5mS*input:i*output:NULL*mcu:p89c51*frequency:11.0592M Hz*period:f/6*/void Delay(uint i)uchar j;while(i-)for(j=0;j125;j+);名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 18 页 -