精华内容
下载资源
问答
  • 包含线反转法和扫描法两种矩阵键盘的实现,含proteus仿真原理图及完整代码,可运行实现
  • 51单片机驱动 矩阵键盘原理及简单实现 背面: ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019080914511478.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG...

    51单片机驱动 矩阵键盘原理及简单实现


    原理:将P1赋值为0x0f, 如果某行被按下,P1.0 ~ P1.3 的某一个电平会被拉低,单片机就可以检查到电平变化,此时P1赋值为0xf0,再检测P1.4 ~ P1.7的电平,最后将前后值相或,得到的值就是等同于键盘某个键的“坐标”,例如以键盘左上角第一个键为坐标原点,键盘(0,0)的值为0000 1110 | 1110 0000 = 1110 1110,即0xee


    贴代码:

    /*
    
    	4x4矩阵键盘驱动
    	
    	单片机:STC12C5A08S2  机械周期1T
    	晶振:13.37Mhz左右
    	功能:驱动4x4矩阵键盘
    	
    	原理:
    		将P1赋值为0x0f, 如果某行被按下,P1.0 ~ P1.3 的某一个
    		电平会被拉低,单片机就可以检查到电平变化,此时P1赋值
    		为0xf0,再检测P1.4 ~ P1.7的电平,最后将前后值相或,得
    		到的值就是等同于键盘某个键的“坐标”,例如以键盘左上角
    		第一个键为坐标原点,键盘(0,0)的值为0000 1110 | 1110 0000 = 1110 1110,即0xee
    
    	抖动处理:4x4矩阵键盘无法接外设去抖动,所以设计100ms延时进行抖动处理
    
    	按键对应值:
    		(0,0) -> 0xee		   (2,0) -> 0xeb
    		(0,1) -> 0xde		   (2,1) -> 0xdb					 
    		(0,2) -> 0xbe		   (2,2) -> 0xbb
    		(0,3) -> 0x7e		   (2,3) -> 0x7b
    		(1,0) -> 0xed		   (3,0) -> 0xe7
    		(1,1) -> 0xdd		   (3,1) -> 0xd7
    		(1,2) -> 0xbd		   (3,2) -> 0xb7
    		(1,3) -> 0x7d		   (3,3) -> 0x77
    
    */
    
    #include " stc12c5a.h "		 //	 stc12c5a系列单片机头文件,stc-isp有提供
    #include < intrins.h >
    
    unsigned char Data;
    sbit po20 = P2^0;
    
    void delay100ms(){		   //延时100ms
    	unsigned int i;
    	unsigned char k;
    	for ( i = 0; i < 14285; i++ ){
    		for ( k = 0; k < 10; k++ ){
    			_nop_();
    		}
    	} 
    }
    
    void FxFInit(){			//4x4键盘初始化
    
    	P1 = 0x0f;			//0000 1111	
    	P2 = 0x01;			//0000 0001	  我习惯将P2口做测试口
    	
    }
    
    void judge(){	   //判断按键
    
    	switch( Data ){
    	/*可按照上面的对照表添加case*/
    		case 0xee:
    			po20 = ~po20;
    			break;
    		default:
    			break;
    	}
    
    }
    
    void main(){
    	FxFInit();						   
    
    	while(1){
    		if(P1 != 0x0f){	  //0x0f是初始化的值,如果不等于这个值,代表用户按下4行按键的某一行
    			delay100ms();	  //延时100ms
    			if(P1 != 0x0f){		//延时检测,去抖动
    				Data = P1;	  //检测是哪行被按下,并存入信息
    				P1 = 0xf0;	  //0000 1111	-> 	1111 0000
    				Data |= P1;	  //Data 与P1值相或 存入Data   最终Data会有4 x 4 = 16种结果,对应4x4键盘的每一位
    
    				judge();
    				P1 = 0x0f;	   //重新赋值
    			}
    		}
    	}
    }
    
    展开全文
  • 矩阵键盘工作原理:由于按键没有接地,4行 4列正好占用8个I/O 如果4行我们送 P3.0到P3.3送入0 1 1 1 然后去读取 4列的值,如果P3.0的按键按下那么P3.4---P3.7的值等于 0 1 1 1,假如是第2个键按下的话那么读回来的值...
  • c51单片机矩阵键盘最简写法,单片机新手理解掌握矩阵键盘最简代码
  • 8051单片机矩阵键盘原理分析, 浅显易懂
  • 本文为单片机独立按键与矩阵按键原理图,希望对你的学习有所帮助。
  • 1.按键分类与输入原理 ...在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该...

    1.按键分类与输入原理

    按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。

    单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。

    对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键的功能程序,执行完成后再返回主程序。

    2.按键结构与特点

    微机键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便于通用数字系统的逻辑电平相容。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。其抖动过程如下图1所示,抖动时间的长短与开关的机械特性有关,一般为5-10ms。在触点抖动期间检测按键的通与断,可能导致判断出错,即按键一次按下或释放错误的被认为是多次操作,这种情况是不允许出现的。为了克服你、按键触点机械抖动所致的检测误判,必须采取消抖措施。按键较少时,可采用硬件消抖;按键较多式,采用软件消抖。

    单片机学习:单片机独立按键和矩阵键盘概念及原理
    图1 按键触点机械抖动

    (1)按键编码

    一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同,采用不同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的跳转。

    (2)键盘程序

    一个完整的键盘控制程序应具备以下功能:

    a.检测有无按键按下,并采取硬件或软件措施消抖。

    b.有可靠的逻辑处理办法。每次只处理一个按键,期间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。

    c.准确输出按键值(或键号),以满足跳转指令要求。

    3.独立按键与矩阵键盘

    (1)独立按键

    单片机控制系统中,如果只需要几个功能键,此时,可采用独立式按键结构。

    独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立按键的典型应用如图所示。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。独立按键如图2所示。

    单片机学习:单片机独立按键和矩阵键盘概念及原理
    图2 独立键盘

    独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。

    (2)矩阵键盘

    单片机系统中,若使用按键较多时如电子密码锁、电话机键盘等一般都至少有12到16个按键,通常采用矩阵键盘。

    矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

    矩阵键盘的工作原理

    最常见的键盘布局如图3所示。一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,4*4矩阵键盘的内部电路如图4所示。

    单片机学习:单片机独立按键和矩阵键盘概念及原理
    图3 矩阵键盘布局图

    单片机学习:单片机独立按键和矩阵键盘概念及原理
    图4 矩阵键盘内部电路图

    当无按键闭合时,P3.0P3.3与P3.4P3.7之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。判断有无按键按下的方法是:第一步,置列线P3.4P3.7为输入状态,从行线P3.0P3.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P3.4~P3.7读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。

    识别按键的方法很多其中,最常见的方法是扫描法

    按键按下时,与此键相连的行线与列线导通,行线在无按键按下时处在高电平。如果所有的列线都处在高电平,则按键按下与否不会引起行线电平的变化,因此必须使所有列线处在电平。这样,当有按键按下时,改键所在的行电平才回由高变低。才能判断相应的行有键按下。

    独立按键数量少,可根据实际需要灵活编码。矩阵键盘,按键的位置由行号和列号唯一确定,因此可以分别对行号和列号进行二进制编码,然后两值合成一个字节,高4位是行号,低4位是列号。

    4.键盘的工作方式

    对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中的CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常键盘的工作方式有三种,编程扫描、定时扫描和中断扫描。

    (1)编程扫描方式

    编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。

    (2)定时扫描方式

    定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(例如10ms)的定时,当定时时间到就产生定时器溢出中断。CPU响应中断后对键盘进行扫描,并在有按键按下时识别出该键,再执行该键的功能程序。

    (3)中断扫描方式

    上述两种键盘扫描方式,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。

    为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无按键按下时,CPU处理自己的工作,当有按键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。

    展开全文
  • 51单片机之独立按键矩阵键盘(概念及原理

    万次阅读 多人点赞 2015-08-27 22:06:38
    一、基本知识  1.按键分类与输入原理 ...在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时

    一、基本知识

            1.按键分类与输入原理

            按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。

            在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。

             对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键的功能程序,执行完成后再返回主程序。

            2.按键结构与特点

            微机键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便于通用数字系统的逻辑电平相容。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。其抖动过程如下图1所示,抖动时间的长短与开关的机械特性有关,一般为5-10ms。在触点抖动期间检测按键的通与断,可能导致判断出错,即按键一次按下或释放错误的被认为是多次操作,这种情况是不允许出现的。为了克服你、按键触点机械抖动所致的检测误判,必须采取消抖措施。按键较少时,可采用硬件消抖;按键较多式,采用软件消抖。


    图1  按键触点机械抖动

            (1)按键编码

             一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同,采用不同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的跳转。

           (2)键盘程序

             一个完整的键盘控制程序应具备以下功能:

              a.检测有无按键按下,并采取硬件或软件措施消抖。

              b.有可靠的逻辑处理办法。每次只处理一个按键,期间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。

              c.准确输出按键值(或键号),以满足跳转指令要求。

            3.独立按键与矩阵键盘

           (1)独立按键

            单片机控制系统中,如果只需要几个功能键,此时,可采用独立式按键结构。

            独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立按键的典型应用如图所示。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。独立按键如图2所示。


    图2  独立键盘

            独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。

           (2)矩阵键盘

            单片机系统中,若使用按键较多时如电子密码锁、电话机键盘等一般都至少有12到16个按键,通常采用矩阵键盘。

    矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

        矩阵键盘的工作原理 

        最常见的键盘布局如图3所示。一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,4*4矩阵键盘的内部电路如图4所示。

     

    图3 矩阵键盘布局图 

    图4 矩阵键盘内部电路图         

       

        当无按键闭合时,P3.0~P3.3与P3.4~P3.7之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。判断有无按键按下的方法是:第一步,置列线P3.4~P3.7为输入状态,从行线P3.0~P3.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P3.4~P3.7读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。  

       

        识别按键的方法很多其中,最常见的方法是扫描法

        按键按下时,与此键相连的行线与列线导通,行线在无按键按下时处在高电平。如果所有的列线都处在高电平,则按键按下与否不会引起行线电平的变化,因此必须使所有列线处在电平。这样,当有按键按下时,改键所在的行电平才回由高变低。才能判断相应的行有键按下。

        独立按键数量少,可根据实际需要灵活编码。矩阵键盘,按键的位置由行号和列号唯一确定,因此可以分别对行号和列号进行二进制编码,然后两值合成一个字节,高4位是行号,低4位是列号。

        4.键盘的工作方式

        对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中的CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常键盘的工作方式有三种,编程扫描、定时扫描和中断扫描。

        (1)编程扫描方式

        编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。

        (2)定时扫描方式

        定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(例如10ms)的定时,当定时时间到就产生定时器溢出中断。CPU响应中断后对键盘进行扫描,并在有按键按下时识别出该键,再执行该键的功能程序。

        (3)中断扫描方式

        上述两种键盘扫描方式,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。

        为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无按键按下时,CPU处理自己的工作,当有按键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。



     
    展开全文
  • 基于51单片机矩阵键盘+数码管电路及c代码
  • 一文带你详解矩阵键盘工作原理

    万次阅读 多人点赞 2020-08-10 14:06:19
    矩阵键盘应该是经常能够用到的一类器件了,4X4矩阵键盘只需要用到8个IO口,即可完成16位按键的读取。其本质原理也就是行列扫描。本片文章将带你详细的学习矩阵键盘原理以及代码编写。 矩阵键盘本质: 矩阵键盘...

    矩阵键盘应该是经常能够用到的一类器件了,4X4矩阵键盘只需要用到8个IO口,即可完成16位按键的读取。其本质原理也就是行列扫描。本片文章将带你详细的学习矩阵键盘的原理以及代码编写。

    矩阵键盘本质:

    矩阵键盘本质是使用8个io口来进行16个按键的控制读取,可以减小io口的使用,用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上,设置一个按键。而这样的按键中按键的个数是4 X 4个。

    这样的行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。节约单片机的资源,其本质和独立按键类似,就是进行逐行扫描和逐列扫描,然后判断是第几行的第几列个按键,进而进行整体按键值得确定,我们使用的矩阵键盘是接到了单片机的P1口通过读取P1口电平变换即可完成矩阵键盘的数值读取,具体原理图如下:
    在这里插入图片描述
    第一行接到p17,第二行接到p16,第三行接到p15,第4行接到p14
    第一列接到p13,第二列接到p12,第三列接到p11,第四列接到p10

    矩阵键盘扫描的方式有两种: 1.行列扫描2.逐行/逐列扫描

    其中行列扫描适用于8个IO口接到了单片机8个连续的IO口,则可以进行行列扫描

    逐行/逐列扫描 适用于矩阵键盘接到了任意的IO口,则使用逐行,逐列扫描

    接下来我们分别介绍这两种方式:

    行列扫描:

    原理

    先从P1口的高四位(四个行)输出高电平,低四位(四个列)输出低电平,假设有按键按下,从P1口的高四位读取键盘状态。判断高四位的四行哪一行变成了低电平,就知道是第几行,再从P1口的低四位(四个列)输出高电平,高四位(四个行)输出低电平,从P1口的低四位读取键盘状态。判断低四位的四列哪一行变成了低电平,就知道是第几列,将两次读取结果组合起来就可以得到当前按键的特征编码。使用上述方法我们得到16个键的特征编码。

    在这里插入图片描述
    红色高电平,蓝色低电平

    详解

    据矩阵键盘的原理图可知,如果矩阵键盘的8个IO口连接到了连续的一个一个人P10-P17上,当没有按键按下时,将P1口的P1^0 和 P13 置高电平 P14 和 P17 置低电平 ,也就是将4个行的IO口置高,4个列的IO口置低。 也就是P1=0x0f(0000 1111);

    如果这时候有按键按下那么P1^0 和 P13 就有一个会变成低电平。因此P1的值就不等于0x0f,按下按键所在的行就会变成低电平,这是就可以判断有按键按下。

    将对应P1口的值和0x0f(00001111)相 与& 则可以得到高四位第几行变成了0

    按位“与”&(双目运算符):仅当两个操作数都为1时,结果为1,否则为0
    比方说: 0&0=0;0&1=0;1&0=0;1&1=1
    即:两个同时为1,结果为1,否则为0

    比方说按下的第一行第一列 1x1
    例:
    0000 1110------------- 按下1x1之后P1的值
    & 0000 1111------------- 0x0f
    ----------
    0000 1110------------- 最后得到的结果,第一行为0

    再给P1口赋值0X0f。将P1口的P1^0 和 P13 置低电平 P14 和 P17 置高电平 ,也就是将4个低的IO口置高,4个列的IO口置高然后读取低四位的电平, 此时的P1口 (1111 0000

    读取此时的P1口 和0xf0(11110000)相 与& 则可以得到低四位第几列变成了低电平

    比方说我们按下的是1x1 按键,也就是第一行第一列,这时在按下之后可以看到p1.0和p1.3都是低电平,将Row=P1&0x0f;(行的值) 和 Col=P1&0xf0;//列值 进行相加,就可以得到按下的是那个按键

    1x1: (一行一列)
    Row=P1&0x0f =  0000 1110

    Col=P1&0xf0=     1110 0000
    Row+Col=           1110 1110   = 0xee

    低电平0表示对应的行列按下

    可以看到下方的p1.0和p1.4变成了低电平
    在这里插入图片描述
    2x2: (二行二列)
    Row=P1&0x0f =  0000 1101

    Col=P1&0xf0=     1101 0000
    Row+Col=           1101 1101   = 0xdd

    3x4: (三行四列)
    Row=P1&0x0f =  0000 1011

    Col=P1&0xf0=     0111 0000
    Row+Col=           0111 1011   = 0x7b

    这样就可以得到所有的16个按键的数值,具体代码如下:

    unsigned char keyscan(){
    	unsigned char key,Row,Col;
    	P1=0x0f;
    	if(P1!=0x0f){
    		delay(10);//去抖
    		if(P1!=0x0f){
    			Row=P1&0x0f;//确保端口值正确(行的值)
    			P1=0xf0;
    			Col=P1&0xf0;//列值
    
    		}
    		while((P1&0xf0)!=0xf0);//判断键是否抬起
    	}
    	switch(Row+Col){
    		case 0xee:key=0;break;
    		case 0xde:key=1;break;
    		case 0xbe:key=2;break;
    		case 0x7e:key=3;break;
    
    		case 0xed:key=4;break;
    		case 0xdd:key=5;break;
    		case 0xbd:key=6;break;
    		case 0x7d:key=7;break;
    
    		case 0xeb:key=8;break;
    		case 0xdb:key=9;break;
    		case 0xbb:key=10;break;
    		case 0x7b:key=11;break;
    
    		case 0xe7:key=12;break;
    		case 0xd7:key=13;break;
    		case 0xb7:key=14;break;
    		case 0x77:key=15;break;
    
    
    	}
    	return key;
    }
    

    运行效果图:

    在这里插入图片描述

    逐行/列扫描:

    逐行,逐列扫描的本质和行列扫描比较类似,本质是给某一行/某一列,低电平,其余七个全部为高电平,这时候读取电平变换,有电平变低表示按键按下,即可读取按键数据。

    比如逐行扫描:

    1. 置第1行为低电平,其余N-1行和N列为高电平,
    2. 读取列线数据,列线有低电平表示此行有按键按下,比如按下的是1行三列(1x3),那么第三列的列线IO口就为低电平。
    3. 置第2行为低电平,其余N-1行和N列为高电平,,读取列线数据,列线有低电平表示此行有按键按下。
    4. 以此类推,进行逐行扫描。
    5. 根据行线列线的电平不同可以识别是否有按键按下,哪一个按键按下,获取按键号。(N) 根据按键号跳转至对应的按键处理程序。

    用我们的P1口来进行举例:

    首先,给P1赋值 P1=0xfe(1111 1110);,这时P1.0为低电平,P1.1~p1.7为高电平,如果这时候有按键按下那么四个列线,P1.4,P1.5,P1.6,P1.7就有一个列会变成低电平。因此P1的值就不等于0xfe,这是就可以判断有按键按下。

    然后延时一段时间去抖动,然后给P1赋值0xfd(1111 1101),也就是P1.1为低电平,其他为高电平,这时如果有在P1.1线上的P1.4,P1.5,P1.6,P1.7有按键按下,那么就会出现低电平,从而判断哪个按键按下;如果没有那么就给P1赋值0xfb(1111 1011),也就是P1.2为低电平,其他为高电平.,相同方法判断是否有按键按下;······如此类推,一共四次检测。

    比如当第1行有按键按下时P1的相应值为:

      1X1(11101110=0xee)
      1x2(11011110=0xde)
      1X3(10111110=0xbe)
      1X4(01111110=0x7e)
    第2行有按键按下时P1的相应值为:

         2X1(11101101=0xed)
         2x2(11011101=0xdd)
         2X3(10111101=0xbd)
         2X4(01111101=0x7d)

    将P1^2输出低电平,其他的引脚都输出高电平,即P1=0xfb,那么当第3行有按键按下时P1的相应值为:
         3X1(11101011=0xeb)
         3x2(11011011=0xdb)
         3X3(10111011=0xbb)
         3X4(01111011=0x7b)

    最后可得第四行的相对应值为:
         4X1(11100111=0xe7)
         4x2(11010111=0xd7)
         4X3(10110111=0xb7)
       4X4(01110111=0x77)

    那么最后我们可以得到代码:

    /*****************************************************************************
    ** 函数名称:keyscan
    ** 功能描述:按键获取函数
    ******************************************************************************/
    void keyscan(void)
    {
    	P1=0xfe;
       temp=P1;
       temp=temp&0xf0;
       if(temp!=0xf0)
       {
    		delay(10);
          if(temp!=0xf0)
          {	
    			temp=P1;
    			switch(temp)
    			{
    				case 0xee:	key=0;break;
    				case 0xde:	key=1;break;
    				case 0xbe:	key=2;break;
    				case 0x7e:	key=3;break;
             }
             while(temp!=0xf0) 
    			{
    				temp=P1;
    				temp=temp&0xf0;				
             }		
    		}
    	}
    	P1=0xfd;
    	temp=P1;
    	temp=temp&0xf0;
    	if(temp!=0xf0)
    	{
    		delay(10);
    		if(temp!=0xf0)
          {
    			temp=P1;
    			switch(temp)
    			{
    				case 0xed: 	key=4;break;
    				case 0xdd:	key=5;break;
    				case 0xbd:	key=6;break;
    				case 0x7d:	key=7;break;
             }
             while(temp!=0xf0)
             {
               temp=P1;
               temp=temp&0xf0;
             }
          }
    	}
    	P1=0xfb;
    	temp=P1;
    	temp=temp&0xf0;
    	if(temp!=0xf0)
    	{
    		delay(10);
          if(temp!=0xf0)
          {
    			temp=P1;
    			switch(temp)
    			{
    				case 0xeb:	key=8;break;
    				case 0xdb:	key=9;break;
    				case 0xbb:	key=10;break;
    				case 0x7b:	key=11;break;				
             }
    			beep=0;delay(50);beep=1;
    			while(temp!=0xf0)
             {
    				temp=P1;
    				temp=temp&0xf0;
             }
          }
       }
    	P1=0xf7;
       temp=P1;
       temp=temp&0xf0;
       if(temp!=0xf0)
       {
          delay(10);
          if(temp!=0xf0)
          {
    			temp=P1;
    			switch(temp)
    			{
    				case 0xe7:	key=12;break;	
    				case 0xd7:	key=13;break;	
    				case 0xb7:	key=14;break;	
    				case 0x77:	key=15;break;	
             }
    			while(temp!=0xf0)
             {
    				temp=P1;
    				temp=temp&0xf0;
             }
          }
    	}
    }
    

    运行效果图:
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 非常适合新手学习51单片机,利用1602显示,里面有原理图,根据硬件看代码,非常容易理解
  • 4*4矩阵键盘原理图及资料
  • 一、矩阵键盘是什么? 二、多按键检测 1.基本思想 三、松手检测 四、你如何拿去使用? 其他的随便,但是这玩意必须是静态变量 好了好了说重点了 总结 前言 学习单片机时,学习的方法只能检测一个...
  • 4X4矩阵键盘原理

    2015-04-23 10:58:06
    4X4矩阵键盘原理
  • 2、实验目的:学习通过编程单片机矩阵按键控制数码管。 3、实验连接图。 4、实验代码。 #include <reg52.h> unsigned char seg7code[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,...
  • 矩阵键盘扫描原理详解——单片机

    万次阅读 多人点赞 2016-04-07 20:12:00
    矩阵键盘扫描原理详解根据原理图 键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电...
  • 本代码利用矩阵键盘行线和列线以及引脚上高低电平变化的规律以2进制来判断按键位置从而显示在数码管上, 其中运用到数字电路的逻辑运算。 线反转法扫描方式代码少,更便于理解和掌握。 所有代码加起来不超过40行。
  • 51单片机矩阵按键

    千次阅读 2019-07-20 13:57:14
    区别:矩阵按键为4*4即16个按键,如果都采用独立按键的解法,那么需要占用16个I/O接口,对于单片机而言是极大的浪费。 工作原理: 先见下图: 他有两种识别方式:逐行扫描、行列扫描。 (1)逐行扫描: 通俗...
  • 单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入...
  • 逐行扫描:通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
  •  先附上矩阵键盘原理图: 在使用据矩阵键盘时,J5 排针处的跳帽连接 1 脚和 2 脚,使所有按键的有效端口全部连接至 I/O 口。 具体的扫描方式为: 先把P3^0~P3^7高四位和第四位赋不一样的电平值,当确定有键按...
  • 矩阵键盘介绍 ...矩阵按键扫描(输入扫描) 原理:扫描第一行>扫描第二行>>>>>扫描第一列>>扫描第二列>>得出按键位置 矩阵键盘模块通过八个IO口来控制矩阵键盘的输入,其...
  • 单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入...
  • 51单片机矩阵键盘

    万次阅读 多人点赞 2019-05-15 22:11:59
    单片机系统中I/O口资源往往比较宝贵,当用到多个按键时为了节省I/O口口线,我们引入矩阵键盘。 我们以4X4矩阵键盘为例讲解其工作原理和检测方法。将16个按键排成4行4列,第一行将每个按键的一端连接在一起构成行线...
  • 本文以51单片机为载体介绍一种4*4矩阵键盘实现16个按键操作的原理、电路和软件设计要点。1、 矩阵键盘的一般电路 图 1 矩阵键盘电路如图 1矩阵键盘电路所示,4*4矩阵键盘有4行4列按键单片机4个I/O口接矩阵键盘的...
  • STM32 4*4矩阵键盘实现原理(附程序) : 理解矩阵键盘之前,先要了解一下独立按键的触发原理。下图是普通独立 按键的接线图。 : 按键的一端接地,一端接MCU的GPIO。当按键没有被按下的时候,这条路其实是一个断路,...
  • 1.1 矩阵键盘原理 独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。单片机系统中 I/O 口资源往往比较宝贵,当用到多个按键时...
  • 使用proteus进行4×4矩阵键盘仿真
  • 单片机4*4矩阵键盘原理

    千次阅读 2020-04-13 21:21:49
    单片机4*4矩阵键盘的扫描原理 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,046
精华内容 818
关键字:

单片机矩阵按键原理