第11讲 矩阵键盘扫描
矩阵键盘的工作原理和扫描确认方式
来源:《AVR 单片机嵌入式系统原理与应用实践》M16 华东师范大学电子系 马潮 当键盘中按键数量较多时,为了减少对 I/O 口的占用,通常将按键排列成
矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图 9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交 点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行 或列线上的电平变化可以确定哪个按键被按下。
图 9-7 为一个 4 x 3 的行列结构,可以构成 12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个 16 键的键盘。很明显,在按键数量多的场合,矩 阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。
矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式 按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和 线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态, 因此会大量占用 MCU 的时间,所以较好的方式也是采用状态机的方法来设计, 尽量减少键盘查询过程对 MCU 的占用时间。
key_return = K1_1; break; case 0b00001101: key_return = K1_2; break; case 0b00001011: key_return = K1_3; break; case 0b00010110: key_return = K2_1; break; case 0b00010101: key_return = K2_2; break; case 0b00010011: key_return = K2_3; break; case 0b00100110: key_return = K3_1; break; case 0b00100101: key_return = K3_2; break; case 0b00100011: key_return = K3_3; break;
矩阵键盘的按键识别方法
矩阵键盘的按键识别方法
在学习有关矩阵键盘的时候,往往要学会矩阵键盘的按键识别方法,那么矩阵键盘的按键识别方法有哪些呢?店铺带着你来了解方法一行扫描法
1、判断键盘中有无键按下将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
方法二
先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。
再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。
将两次读取结果组合起来就可以得到当前按键的特征编码。
矩阵键盘的按键识别方法在学习有关矩阵键盘的时候,往往要学会矩阵键盘的按键识别方法,那么矩阵键盘的按键识别方法有哪些呢?店铺带着你来了解方法一行扫描法 1、判断键盘中有无键按下将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内推荐度:点击下载文档文档为doc格式。
单片机矩阵键盘扫描的两种方式
单片机矩阵键盘扫描的两种方式单片机矩阵键盘扫描的两种方式矩阵键盘扫描方式:第一种:逐行扫描法,就是一行一行的扫描。
实现代码如下(键盘连接P2口):#define NO_KEY 0XFF#define KEY_LO() P2 &= 0XF0#define KEY_HI() P2 |= 0X0F#define KEY_L(i) P2 &= ~(1<<i)#define KEY_RD() ((P2>>4) & 0x0f)UINT8 OnceKey(void){UINT8 line = 0;UINT8 key = NO_KEY;//key valueKEY_LO();if (KEY_RD() == 0X0F){KEY_HI();return NO_KEY;}for (line=0; line<4; line ++){KEY_HI();KEY_L(line);key = KEY_RD();switch (key){case ROW_FIRST:key = 4*line + 0;break;case ROW_SECOND:key = 4*line + 1;break;case ROW_THIRD:key = 4*line + 2;break;case ROW_FOURTH:key = 4*line +3;break;default :key = 0x0f;break;}if (key < 0x10){return key;}}return NO_KEY;}第二种,线性反转法。
就是行和列分别读出。
实现代码如下:#define CVT(i) ((i)==(~1)&0x0f)? 0: ((i)==(~2)&0x0f)? 1: ((i)==(~4)&0x0f)? 2: ((i)==(~8)&0x0f)? 3: 4;#define KEY0_3HI() P2 |= 0X0F#define KEY0_3LO() P2 &= 0XF0#define KEY4_7HI() P2 |= 0XF0#define KEY4_7LO() P2 &= 0X0F#define KEY0_3RD() (P2 & 0X0F)#define KEY4_7RF() ((P2>>4) & 0X0F)UINT8 OnceKey(void){UINT8 line = NO_KEY;UINT8 row = NO_KEY;UINT8 key;KEY0_3HI();KEY4_7LO();line = KEY0_3RD();//读入行的值if (0x0f == line){key = NO_KEY;}else{KEY0_3LO();KEY4_7HI();row = KEY4_7RD();//读入列的值if (0x0f == row){key = NO_KEY;}else{key = CVT(line)*4 + CVT(row);}}KEY0_3HI();KEY4_7HI();return key; }。
键盘扫描
case 0xef: managekey4();break;
case 0xdf: managekey5();break;
case 0xbf: managekey6();break;
* P1.0-P1.3为列线,P1.4-P1.7为行线 *
* 喇叭接P3.7口 矩阵键盘P1口, 数码管数据P0口,数码管控制P2口 *
* *
}
//--------------------------------------------------
main()
{
P0=0xFF; //置P0口
P2=0xFF; //置P2口
dis_buf=0xBF;
while(1)
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
else
{ for(a=0;a<4;a++)
P1=0xF0;
if(P1!=0xF0)
{
keyscan();
beep();
// while(P1!=0xF0); //等待键释放
}
}
//--------------------------------------------------
void beep()
}
//--------------------------------------------------
矩阵键盘扫描显示键值
课程报告课程新型单片机实践题目4*4矩阵键盘扫描显示键值二级学院班级姓名学号指导教师设计时间2011.11.15~2011.12.14常州工学院《新型单片机》设计任务书学院:专业:自动化班级:绪论 (4)第一章总体方案设计 (5)第二章系统硬件电路的设计 (6)第三章系统软件电路的设计 (8)3.1软件设计思想 (8)3.2主程序设计 (9)3.3子程序设计 (9)3.3.1 动态显示程序设计 (10)3.3.2 按键程序设计 (11)第四章调试及性能分析 (14)4.1软件调试 (14)4.2性能分析 (15)总结 (16)参考文献 (16)附录 (17)A元件清单 (17)8、瓷片电容 (17)B总原理图 (18)C程序清单 (19)C实物图 (22)绪论制作一个检测4*4 矩阵键盘的按键编码的实验,把实际按键的键值的八位编码先转换成从0000—1111 的编码,再译成数码管能识别的八位编码,在数码管动态显示时,矩阵键盘的第一行对应00—03,4*4 第二行对应04—07,第三行08—11,第四行对应12—15。
原理:1.键盘的工作原理:.键盘的工作原理:按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。
行线通过上拉电阻接到+5V 电源上。
无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平与此行线相连的列线电平决定。
2.行列扫描法原理:原理:.行列扫描法原理第一步,使行线为编程的输入线,列线是输出线,拉低所有的列线,判断行线的变化,如果有按键按下,按键按下的对应行线被拉低,否则所有的行线都为高电平。
第二步,在第一步判断有键按下后,延时10ms 消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下一步,否则返回第一步重新判断。
第三步,开始扫描按键位置,采用逐行扫描,每间隔1ms 的时间,分别拉低第一列,第二列,第三列,第四列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置,分别把行值和列值储存在寄存器里。
矩阵键盘过程及扫描程序
键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。
即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。
矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。
查找哪个按键被按下的方法为:一个一个地查找。
先第一行输出0,检查列线是否非全高;否则第二行输出0,检查列线是否非全高;否则第三行输出0,检查列线是否非全高;如果某行输出0时,查到列线非全高,则该行有按键按下;根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。
下面是具体程序:void Check_Key(void){unsigned char row,col,tmp1,tmp2;tmp1 = 0x10;//tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0for(row=0;row<4;row++) // 行检测{P1 = 0x0f; // 先将p1.4~P1.7置高P1 =~tmp1; // 使P1.4~p1.7中有一个为0tmp1*=2; // tmp1左移一位if ((P1 & 0x0f) < 0x0f)// 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测{tmp2 = 0x01; // tmp2用于检测出哪一列为0for(col =0;col<4;col++) // 列检测{if((P1 & tmp2)==0x00)// 该列如果为低电平则可以判定为该列{key_val =key_Map[ row*4 +col ];// 获取键值,识别按键;key_Map为按键的定义表return; // 退出循环}tmp2*=2; // tmp2左移一位}}}} //结束。
矩阵键盘扫描原理
矩阵键盘扫描原理矩阵键盘是一种常见的输入设备,广泛应用于各种电子产品中,如计算机、手机、电视遥控器等。
它的原理是通过矩阵扫描技术来实现按键的检测和识别。
下面我们将详细介绍矩阵键盘的扫描原理。
首先,我们来了解一下矩阵键盘的结构。
矩阵键盘由若干行和若干列按键组成,每个按键都与一个行线和一个列线相连接。
当按下某个按键时,对应的行线和列线会发生连接,从而形成一个按键闭合的电路。
在正常情况下,行线和列线是断开的,不会导通。
为了检测按键的状态,需要通过矩阵扫描的方式来逐个检测每个按键。
扫描的原理是通过逐行逐列地扫描按键,从而确定哪些按键被按下。
具体来说,扫描的过程是这样的,首先,将所有的列线拉低,然后逐行地扫描每一行,检测每一行上的按键是否被按下。
如果某一行上有按键被按下,那么对应的列线和行线就会连接,从而形成一个闭合的电路。
通过这种方式,可以逐个检测每一个按键的状态。
在实际应用中,为了提高扫描的效率,通常会采用按键去抖技术和扫描周期的优化。
按键去抖技术是为了解决按键在按下和松开的过程中会产生抖动现象的问题,通过软件或硬件的方式来滤除抖动信号,从而确保按键状态的稳定性。
扫描周期的优化则是为了减少扫描的时间,提高系统的响应速度。
总的来说,矩阵键盘的扫描原理是通过逐行逐列地扫描按键,从而确定按键的状态。
通过合理的设计和优化,可以实现稳定、高效的按键检测和识别,从而为用户提供良好的输入体验。
总结一下,矩阵键盘扫描原理是通过逐行逐列地扫描按键,从而确定按键的状态。
通过合理的设计和优化,可以实现稳定、高效的按键检测和识别,为用户提供良好的输入体验。
希望本文能够帮助大家更好地理解矩阵键盘的工作原理。
PIC单片机自学手记之矩阵键盘 行扫描法
PIC单片机自学手记——PIC 单片机矩阵键盘+行扫描法/*采用行扫描法RAM占用空间较少(呵呵起码我写的程序是这样的,因为我刚开始学,还不是很懂各方面的程序优化)*/#include <pic.h>__CONFIG(0x3F32); //芯片配置字#define uchar unsigned char#define uint unsigned intvoid delay10ms(uchar x);void beep();void init();uchar key;uchar LED_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};void keyscan(){uchar temp;PORTB=0x07;//将列线置0,行线作为输入状态检测。
temp=PORTB;//读回B端口状态值if((temp&0x07)!=0x07)//将读取的值跟0x07做与运算然后再判断是否不等于0x07,如果不等于说明有按键按下{delay10ms(1);//延时10毫秒,去抖动(去干扰)PORTB=0x07;//同上temp=PORTB;//同上if((temp&0x07)!=0x07)//延时消抖后再次判断是否真的有按键按下,如果有再判断是此行的哪个按键(这里我们用的是3x3矩阵键盘,则每行有3种情况){PORTB=0x37;//第一行状态temp=PORTB;//读回B端口状态值switch(temp)//判断第一行按键按下后可能产生的情况{case 0x33:key=7;break;//第一种情况:1号按键按下_0B0011 0011case 0x35:key=4;break;//第二种情况:2号按键按下_0B0011 0101case 0x36:key=1;break;//第三种情况:3号按键按下_0B0011 0110}PORTB=0x2F;//第二行状态temp=PORTB;//读回B端口状态值switch(temp)//判断第二行按键按下后可能产生的情况{case 0x2b:key=8;break;//第一种情况:4号按键按下_0B0010 1011case 0x2d:key=5;break;//第二种情况:5号按键按下_0B0010 1101case 0x2e:key=2;break;//第三种情况:6号按键按下_0B0011 1110 }PORTB=0x1F;//第三行状态temp=PORTB;//读回B端口状态值switch(temp)//判断第三行按键按下后可能产生的情况{case 0x1b:key=9;break;//第一种情况:7号按键按下_0B0001 1011 case 0x1d:key=6;break;//第二种情况:8号按键按下_0B0001 1101 case 0x1e:key=3;break;//第三种情况:9号按键按下_0B0001 1110 }}}}void main(){init();//系统初始化PORTD=LED_CODE[10];//上电数码管显示“—”while(1){PORTB=0x07;if(PORTB!=0x07)//判断有无按键按下有则执行按键处理程序{keyscan();//调用扫描子程序PORTD=LED_CODE[key];//显示对应键号PORTB=0x07;//重新赋值if(PORTB!=0x07)//再次判断有无按键按下按下蜂鸣器响一声{beep(); //调用蜂鸣器子函数}while(PORTB!=0x07)//按键松手检测,如果按键一直按下关闭蜂鸣器 {RE1=0;delay10ms(1);}}}}void init()//系统初始化程序{TRISB=0x07;//低三位,行作为输入TRISD=0;//D端口设置为输出TRISA=0;//A端口设置为输出TRISE=0;//E端口设置为输出PORTA=0;//A端口全部设置为低电平,位选开放PORTD=0xFF;//D端口全部设置为高电平,段选关闭数码管不亮。
矩阵键盘扫描的C语言实例
矩阵键盘扫描的C语言实例1、按键扫描(线反转)//-------------------------------- ------------------------------------------------------------------// 函数名称:program_SCANkey// 函数功能:程序扫描键盘,// 有键按下完成按键处理,无键按下直接返回//--------------------------------------------------------------------------------------------------void program_SCANkey(){unsigned char key_code;if(judge_hitkey()) //判断是否有键按下{delay(1000); //延时20ms左右,消除抖动干扰if(judge_hitkey()) //判断是否有效按键{key_code=scan_key();//获取键值while(judge_hitkey()); //等待按键释放{}key_manage(key_code); //键盘扫描、键盘散转、按键处理}}}//--------------------------------------------------------------------------------------------------// 函数名称:judge_hitkey// 函数功能://判断是否有键按下,有返回1,没有返回0// 列判断,还可以用行判断。
//--------------------------------------------------------------------------------------------------bit judge_hitkey() //判断是否有键按下,有返回1,没有返回0{unsigned char scancode,keycode;scancode=0x0F; //开始设定P1.0~P1.3输出全1(初值)即表明无键闭合KEY=scancode;keycode=KEY; //读取P1.0~P1.3的真实状态,从而确定有没有键被按下if(keycode==0x0F)return(0); //全1则无键闭合elsereturn(1); //否则有键闭合}//--------------------------------------------------------------------------------------------------// 函数名称:scan_key// 函数功能://扫描键盘,返回键值(高四位代表行,低四位代表列)// 说明:scancode 扫描码,keycode 键值,keycode_line 行,keycode_row 列// 过程:先扫描行,确定那行的按键被按下。
矩阵键盘的三种扫描方法
矩阵键盘的三种扫描方法矩阵键盘是一种常见的输入设备,它由多个按键组成,并通过矩阵扫描的方式来检测用户的按键输入。
矩阵键盘的扫描方法可以分为三种:行扫描、列扫描和交错扫描。
下面将详细介绍这三种扫描方法。
1.行扫描行扫描是最简单的一种扫描方法。
它的原理是将矩阵键盘的每一行连接到一个IO口,通过轮询检测每一行的电平变化来获取用户的按键输入。
行扫描的工作流程如下:1)将矩阵键盘的每一行连接到一个IO口,并设置为输入模式。
2)逐个地将每一行的IO口设置为高电平,并检测列的电平状态。
3)如果其中一列的电平为低电平,说明该列有按键按下。
此时,记录下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将这个按键的位置和值传递给上层应用或处理器。
4)将当前行的IO口设置为低电平,然后继续下一行的检测,重复2)~3)步骤,直到所有行都被检测完毕。
行扫描的优点是实现简单,只需要一个IO口来检测按键的状态。
但是它的缺点是扫描速度较慢,因为需要逐个地检测每一行。
2.列扫描列扫描是一种比较常用的扫描方法。
它的原理是将矩阵键盘的每一列连接到一个IO口,通过轮询检测每一列的电平变化来获取用户的按键输入。
列扫描的工作流程如下:1)将矩阵键盘的每一列连接到一个IO口,并设置为输入模式。
2)逐个地将每一列的IO口设置为高电平,并检测行的电平状态。
3)如果其中一行的电平为低电平,说明该行有按键按下。
此时,记录下这个按键的位置(行号和列号)以及按键的值(键码或字符),然后将这个按键的位置和值传递给上层应用或处理器。
4)将当前列的IO口设置为低电平,然后继续下一列的检测,重复2)~3)步骤,直到所有列都被检测完毕。
列扫描的优点是速度较快,因为只需要逐个地检测每一列。
但是它的缺点是需要多个IO口来检测按键的状态。
3.交错扫描交错扫描是一种综合了行扫描和列扫描的扫描方法,它可以有效地减少扫描的时间。
交错扫描的原理是将矩阵键盘的行和列交错地连接到多个IO口,通过并行检测行和列的电平变化来获取用户的按键输入。
矩阵键盘反转扫描
/*-----------------------------------------------名称:矩阵键盘依次输入控制论坛:编写:shifang日期:2009.5修改:无内容:如计算器输入数据形式相同从右至左------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换#define KeyPort P1sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~Funsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数unsigned char KeyScan(void);//键盘扫描unsigned char KeyPro(void);void Init_Timer0(void);//定时器初始化/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num,i,j;unsigned char temp[8];Init_Timer0();while (1) //主循环{num=KeyPro();if(num!=0xff){if(i<8){temp[i]=dofly_DuanMa[num];for(j=0;j<=i;j++)TempData[7-i+j]=temp[j];}i++;if(i==9)//多出一个按键输入为了清屏原本应该为8{i=0;for(j=0;j<8;j++)//清屏TempData[j]=0;}}//Display(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
课程设计矩阵键盘扫描
课程设计矩阵键盘扫描一、教学目标本课程的目标是让学生掌握矩阵键盘扫描的原理和实现方法。
知识目标要求学生理解矩阵键盘的基本结构和工作原理,掌握键盘扫描的算法和程序设计方法。
技能目标要求学生能够运用矩阵键盘扫描原理设计简单的键盘输入系统。
情感态度价值观目标在于培养学生对计算机科学和编程的兴趣,提高他们的问题解决能力和创新意识。
二、教学内容本课程的教学内容主要包括矩阵键盘的基本原理、键盘扫描的算法实现和程序设计。
首先,学生将学习矩阵键盘的结构和工作原理,了解键盘扫描的基本概念。
然后,学生将学习如何设计和实现键盘扫描算法,包括行列扫描法和非阻塞扫描法。
最后,学生将通过实际编程练习,掌握如何使用矩阵键盘扫描原理设计实用的键盘输入系统。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。
首先,将采用讲授法,系统地讲解矩阵键盘扫描的基本原理和算法。
其次,将采用讨论法,引导学生通过小组讨论和分享,深入理解键盘扫描的实现方法。
此外,还将采用案例分析法,通过分析实际案例,让学生学会将理论知识应用于实际问题解决中。
最后,将采用实验法,让学生通过动手实践,亲自设计和实现矩阵键盘扫描程序。
四、教学资源为了支持教学内容和教学方法的实施,本课程将选择和准备适当的教学资源。
教材将提供基础知识,参考书将提供更深入的内容,多媒体资料将帮助学生更直观地理解键盘扫描的原理和实现方法。
实验设备将用于学生的动手实践,让他们能够亲自验证和应用所学的知识。
通过丰富多样的教学资源,学生将能够更全面地掌握矩阵键盘扫描的知识,并提高他们的学习体验。
五、教学评估为了全面反映学生的学习成果,本课程将采用多元化的评估方式。
平时表现将占30%的比重,通过课堂参与、提问和小组讨论等方式评估学生的积极性和主动性。
作业将占20%的比重,通过布置相关的编程练习和项目设计,评估学生对矩阵键盘扫描知识的掌握程度。
考试将占50%的比重,包括期中考试和期末考试,将通过笔试和上机操作的方式,全面评估学生的知识水平和应用能力。
一种矩阵键盘的扫描定位的方法(编码方式)
图1是本发明方法的键盘扫描定位原理框图,图2是说明本发明方法的一个实施例的电路图,所述方法通过嵌入式设备和键盘扫描定位程序来实现,所述的嵌入式设备包括键盘和微控制器,所述的键盘扫描定位程序在微控制器中运行。
图1图2中,键盘的4个按键以2×2的矩阵形式排列,所有的行线与列线都通过上拉电阻接至电源+VCC,并连接至微控制器的I/O接口。
本实施例要求利用4个按键实现以下操作:操作0:键盘从有键按下恢复到没有任何键按下后,时间达到2min时,执行一次操作0;操作1:按键S1单键按下操作时,执行一次操作1;操作2:按键S2单键按下操作时,执行一次操作2;按键S2单键按下时间持续3s以上后,每隔0.1s执行一次操作2,直到S2释放(或者键盘状态发生其他改变);操作3:按键S3单键按下时间持续2s以上后,执行一次操作3;操作4:按键S3单键释放操作时,执行一次操作4;操作5:按键S4单键按下后,再按下按键S3的组合键操作,执行一次操作5。
如图1所示的键盘进行初始化,主要是前后读入2次键值,分别作为前态键值与现态键值保存,组合成状态码,同时作为前态状态码和现态状态码保存。
如图1所示的等待键盘扫描时间到,等待时间周期T为10~50ms之间的一个固定值,本实施例选择等待时间为20ms,微控制器采用周期扫描的方式对键盘的当前状态进行读取采样。
如图1所示的采样读取现态键值,本实施例中,图2所示键盘的键值为4位二进制码。
例如,没有键按下的键值是1111,S1按下的键值是0101,S1、S2同时按下的键值是0100。
采样读取键值的方法为反转法。
首先在所有行线输出低电平,采样读取列线状态作为键值的高2位;再在所有列线输出低电平,采样读取行线状态作为键值的低2位;组合键值的高2位和低2位,得到4位键值。
在采样读取现态键值前,将上一次采样读取的键值保存为前态键值。
如图1所示的键盘状态是否稳定判断,用于确定键盘是否处于稳定状态,如果前后两次键盘采样的键值相同,即现态键值等于前态键值,键盘处于稳定状态,进入下一步骤;如果前后两次键盘采样的键值不同,现态键值不等于前态键值,则返回等待下一次键盘扫描时间到。
第11讲 矩阵键盘扫描
亚博科技
51单片机开发板28课配套视频教程
位运算
在前面我们已经讲了一种位运算,就是移位,这里 我们再介绍其他的位运算----位逻辑运算: 先讲一下什么是逻辑运算?见下页 什么是位逻辑运算?按位对变量进行逻辑运算。 位逻辑运算有以下4种: ~ 按位取反 & 按位与 | 按位或 ^ 按位异或 注意点:位运算不改变参与运算的变量的值,如果 希望改变参与运算的变量的值,应利用相应的赋值 操作!
亚博科技
51单片机开发板28课配套视频教程
第11讲
矩阵键盘扫描
亚博科技
51单片机开发板28课配套视频教程
矩阵键盘输入
本讲任务: 了解矩阵键盘检测原理及如何获得键盘扫描。 掌握矩阵键盘的检测和数码管显示混合编程。
穿插讲解以下知识点: 带返回值函数 位逻辑运算 SWITH语句
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
注意区分逻辑运算和位逻辑运算 逻辑运算:参与运算的对象是逻辑量,结 果也是逻辑量,运算符是与或非。 逻辑运算用于多个关系表达式的连接,例 如: If (a>2)&& (a<9) 可以实现更复杂的条件判 断。 位逻辑运算:参与运算的对象是8位二进制 数,结果也是8位二进制数,运算符是位与、 位或、位非。位与、位或主要用来对特定 位的屏蔽。
矩阵按键和独立按键
从“独立按键”的缺点说起…… 矩阵键盘的优点: 当键数较多时,可以节约大量的I/O口资源。
矩阵键盘的工作原理和扫描确认方式
9.3.1 矩阵键盘的工作原理和扫描确认方式
来源:《AVR 单片机嵌入式系统原理与应用实践》M16 华东师范大学电子系 马潮 当键盘中按键数量较多时,为了减少对 I/O 口的占用,通常将按键排列成
矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图 9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交 点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行 或列线上的电平变化可以确定哪个按键被按下。
图 9-7 为一个 4 x 3 的行列结构,可以构成 12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个 16 键的键盘。很明显,在按键数量多的场合,矩 阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。
File name
: demo_9_3.c
Chip type
: ATmega16
Program type
: Application
Clock frequency
: 4.000000 MHz
// 输出行线电平 // 必须送 2 次!!!(注 1 // 读列电平 // 没有按键,继续扫描
// 有按键,停止扫描 // 转消抖确认状态
// 再次读列电平, // 与状态 0 的相同,确认按键 // 键盘编码,返回编码值
case 0b01000110:
key_return = K4_1;
break;
它们不仅与键盘的硬件连接有关系,同时还要注意他们在程序中是如何使用的, 其值的保存等等。
矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验是一种常见的数字电路实验。
在这个实验中,我们可以通过按下矩阵键盘上的按键,控制数码管上的数字显示。
实验结果分析主要包括以下几个方面:
1. 矩阵键盘扫描:在实验中按下键盘上的某个按键,可以通过扫描算法检测到按键的位置,并将对应按键的行列信息送入微处理器或控制电路。
分析实验结果时,可以观察是否可以正常检测到按键的位置,并且是否能够正确传递给其他部分的电路或处理器。
2. 数码管显示:通过实验中的控制电路,可以将微处理器或其他控制器输出的数字信号转换成数码管上的对应数字显示。
在分析实验结果时,可以观察数码管是否能够正常显示所期望的数字,并且是否能够响应输入信号的变化。
3. 信号传递与处理:在整个实验电路中,信号的传递和处理是关键部分。
可以分析信号在各个部分的传递过程中是否出现错误或干扰,是否能够实现正确的数据传输和处理。
4. 稳定性和可靠性:实验结果的分析还需要考虑电路的稳定性和可靠性。
即在长时间使用或复杂环境条件下,电路能否保持正常工作,并且不出现意外错误或故障。
总结来说,矩阵键盘扫描与数码管显示实验结果的分析需要关注按键的检测和传递、数码管的正确显示、信号传递与处理等方面,同时也需要考虑电路的稳定性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
矩阵按键和独立按键
从“独立按键”的缺点说起…… 矩阵键盘的优点: 当键数较多时,可以节约大量的I/O口资源。
亚博科技
51单片机开发板28课配套视频教程
实验板上的4X4按键
亚博科技
51单片机开发板28课配套视频教程
矩阵键盘扫描原理
方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键 盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明 有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一 个按键被按下。 方法二: 行列扫描:我们可以通过高四位全部输出低电平,低四位输 出高电平。当接收到的数据,低四位不全为高电平时,说明有按 键按下,然后通过接收的数据值,判断是哪一列有按键按下,然 后再反过来,高四位输出高电平,低四位输出低电平,然后根据 接收到的高四位的值判断是那一行有按键按下,这样就能够确定 是哪一个按键按下了。
亚博科技
51单片机开发板28课配套视频教程
第11讲
矩阵键盘扫描
亚博科技
51单片机开发板28课配套视频教程
矩阵键盘输入
本讲任务: 了解矩阵键盘检测原理及如何获得键盘扫。 掌握矩阵键盘的检测和数码管显示混合编程。
穿插讲解以下知识点: 带返回值函数 位逻辑运算 SWITH语句
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
带返回值函数的定义
亚博科技
51单片机开发板28课配套视频教程
带返回值函数的定义
返回值类型 函数名(形式参数表) { 局部变量定义; 函数体语句; return 返回值; } return后面可以是常量、变量或表达式。 执行到return语句时,函数即告结束,如果后面还有 代码,则后面的代码不被执行。
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
注意区分逻辑运算和位逻辑运算 逻辑运算:参与运算的对象是逻辑量,结 果也是逻辑量,运算符是与或非。 逻辑运算用于多个关系表达式的连接,例 如: If (a>2)&& (a<9) 可以实现更复杂的条件判 断。 位逻辑运算:参与运算的对象是8位二进制 数,结果也是8位二进制数,运算符是位与、 位或、位非。位与、位或主要用来对特定 位的屏蔽。
亚博科技
51单片机开发板28课配套视频教程
位运算
在前面我们已经讲了一种位运算,就是移位,这里 我们再介绍其他的位运算----位逻辑运算: 先讲一下什么是逻辑运算?见下页 什么是位逻辑运算?按位对变量进行逻辑运算。 位逻辑运算有以下4种: ~ 按位取反 & 按位与 | 按位或 ^ 按位异或 注意点:位运算不改变参与运算的变量的值,如果 希望改变参与运算的变量的值,应利用相应的赋值 操作!
亚博科技
51单片机开发板28课配套视频教程
SWITCH语句(多方向分支语句 )
if...else语句只能实现从二选一,如果要实现多选一,可以使用多级 if...else...语句,也可以使用switch语句,建议采用switch语句。switch语 句也叫开关语句,它是C语言提供的专门处理多方向分支的语句,可以使 程序简洁、高效。 一般格式: switch( 变量 ) //变量只能是整型或字符型。 { case 变量可能值1 :分支1语句 break; Case 变量可能值2:分支2语句 break; …… Case 变量可能值n:分支n语句 break; default:最后分支语句 //default也可以省略。 } 程序先读出这个变量的值,然后在各个"case"里查找哪个值和这个变量相 等,如果相等,就算条件成立,程序执行相应的分支,直到碰上break或 者switch语句结束。