精华内容
下载资源
问答
  • 包含线反转法和扫描法两种矩阵键盘的实现,含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个键按下的话那么读回来的值...
  • 非常适合新手学习51单片机,利用1602显示,里面有原理图,根据硬件看代码,非常容易理解
  • 学习51单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分析电路,然后终于明白其中的原理,这样的话,再看程序,就是那样的简单了。。首先看一下电路图是怎样连接的,我买的开发板上是AT89S52单片机...

    学习51单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分析电路,然后终于明白其中的原理,这样的话,再看程序,就是那样的简单了。。

    首先看一下电路图是怎样连接的,我买的开发板上是AT89S52单片机,矩阵键盘在P3口。接法如下图:

    3f829e29e76caa8c3b1f630a6b27d58d.gif

    QQ截图20150120151608.png (87.58 KB, 下载次数: 70)

    2015-5-22 00:54 上传

    当然上面的图的意思是P3.1~P3.3 跟P3.4~P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。

    如果给P3一个扫描初值的话:如0x0F ,则没有键按下时为:

    P3.1~P3.3为1,P3.4~P3.7为0。

    如果有键按下,则情况发生变化:高电平接入低电平:如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。

    则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0,低四位保留,可以得到低四位的内容了。

    通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P3&0x0F;

    如果再得到高四位内容,则可以组成一个数,来定位哪个键了。

    用P3=h|0xF0;这会出现什么情况呢?1|0=1   1| 1 =1,这里难道高四位全置1 吗?不是的,当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。 即:0111 0111,&F0之后,得到0111 0000,这样的话,我们得到高四位的值了,

    用高四位+低四位,就可以得到一个数值,确定一个键。

    下面看看人家编写的程序,相信不是太难了吧。

    //keyboard.c这里的行与列的扫描,也就是把字节的8位,高四位与低四位分开来,从而确定坐标。

    //行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍

    #include //包含头文件

    #define uchar unsigned char

    #define uint unsigned int

    unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

    0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。

    uchar keyscan(void);            //主要的矩阵键盘扫描函数。

    void delay(uint i);

    void main()

    {

    uchar key;

    P2=0x00;//1数码管亮 按相应的按键,会显示按键上的字符

    while(1)

    {

    key=keyscan();//调用键盘扫描,

    switch(key)

    {

    case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值 原理就是高四位一列低四位一列的组

    //合。0111    1110 7e    0表示按键后为0,1表示没有按键按下的。即P3.7与P3.1连接为低电平,为S1键

    //其他类推。

    case 0x7d:P0=dofly[1];break;//1

    case 0x7b:P0=dofly[2];break;//2

    case 0x77:P0=dofly[3];break;//3

    case 0xbe:P0=dofly[4];break;//4

    case 0xbd:P0=dofly[5];break;//5

    case 0xbb:P0=dofly[6];break;//6

    case 0xb7:P0=dofly[7];break;//7

    case 0xde:P0=dofly[8];break;//8

    case 0xdd:P0=dofly[9];break;//9

    case 0xdb:P0=dofly[10];break;//a

    case 0xd7:P0=dofly[11];break;//b

    case 0xee:P0=dofly[12];break;//c

    case 0xed:P0=dofly[13];break;//d

    case 0xeb:P0=dofly[14];break;//e

    case 0xe7:P0=dofly[15];break;//f

    }

    }

    }

    uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位

    {

    uchar cord_h,cord_l;//行列值

    P3=0x0f;            //行线输出全为0

    cord_h=P3&0x0f;     //读入列线值

    if(cord_h!=0x0f)    //先检测有无按键按下

    {

    delay(100);        //去抖

    if(cord_h!=0x0f)

    {

    cord_h=P3&0x0f; //读入列线值

    P3=cord_h|0xf0; //输出当前列线值

    cord_l=P3&0xf0; //读入行线值

    return(cord_h+cord_l);//键盘最后组合码值

    }

    }return(0xff);     //返回该值

    }

    void delay(uint i)//延时函数

    {

    while(i--);

    }以上为51单片机矩阵键盘扫描显示程序。

    展开全文
  • 众所周知,51单片机一般的键盘检测原理为非编码键盘检测,没有专门用来产生键编码号或键值的电路芯片;而我们使用的电脑键盘为编码键盘,通过编码电路芯片为每个按键产生一个编码号,可以通过串行总线把键值传输给...
  • 1. 运算过程、符号公式实时显示在显示屏上(I2C 1602)。2. 自带三角函数、开根号、平方运算。3. 计算得出的结果可设置保存并用以下一...(AT24C02)硬件连接图如下:单片机源程序如下:main.c#include#include "Calculat...

    1. 运算过程、符号公式实时显示在显示屏上(I2C 1602)。

    2. 自带三角函数、开根号、平方运算。

    3. 计算得出的结果可设置保存并用以下一次计算。

    4. 所有运算结果精确到至少小数点后两位。

    5. 运算结果可通过串口发送给上位机。

    6. 当断电重启时,能存储并显示断电前正在计算的任务。(AT24C02)

    硬件连接图如下:

    单片机源程序如下:

    main.c

    #include

    #include "Calculate.H"

    #include "Martixkey.h"

    #include "AT24C02.h"

    #include

    #include "I2C.h"

    #include "1602.h"

    #include

    #include "UART.h"

    long float number1=0,number2=0;

    long float result;//结果

    unsigned char i=0,x=0; //运算符号标志位

    unsigned char x1=1;//液晶屏第一行列标志位x1

    unsigned char key;//矩阵键盘键值

    char strnum1[7]={'

    展开全文
  • 按键控制数字显示在数码管上的第一个,通过16个矩阵按键分别显示在数码管的第一个位置
  • 51单片机矩阵键盘扫描方法的学习

    千次阅读 2021-03-07 16:25:14
    正在学习郭天祥《51单片机C语言教程(第2版)》第4章,键盘检测原理矩阵键盘检测部分的代码又长又啰嗦,所以修改了下。 权当个记录。 问题描述: 在实验板TX-1C上实现如下描述,实验板上电时,数码管不显示,顺序...

    正在学习郭天祥《51单片机C语言教程(第2版)》第4章,键盘检测原理。矩阵键盘检测部分的代码又长又啰嗦,所以修改了下。
    权当个记录。

    问题描述:
    在实验板TX-1C上实现如下描述,实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0-F,6个数码管同时静态显示即可。

    当前代码实现的是:按键按下后,数码管亮起;手放下,不按,数码管关闭不亮。

    尤其说明,只有按键状态变化时,才会重新扫描,数码管的亮灭状态才会变化,而不是连续重复扫描,数码管持续高速亮灭变化。

    矩阵键盘扫描方法有两种,书中采用的是 逐行扫描 。
    在此尝试用 行列扫描:学习板上,行连接的是P3的低4位,列连接的是P3的高4位。所以,当P3口高4位输出高电平,低4位输出低电平,若这4行按键里有按键按下了,那么那一列对应的I/O电平就会拉低,我们就可知道按键的列坐标。类似地,高4位输出低电平,低4位输出高电平,可以得到按键的行坐标。
    (上面一段话引用自文章《矩阵键盘的原理及应用》,链接: link.其中因为按键的接线不同,而有些说法不同。 )

    代码如下:

    #include <reg52.h>
    
    sbit dula = P2^6 ;
    sbit wela = P2^7 ;
    unsigned char code table[]={ 0x3f ,	0x06 , 0x5b , 0x4f ,
    							 0x66 , 0x6d , 0x7d , 0x07 ,
    							 0x7f , 0x6f , 0x77 , 0x7c ,
    							 0x39 , 0x5e , 0x79 , 0x71 };
    
    int delayms( unsigned int );
    int LED_on( unsigned int P0we , unsigned int P0du );
    unsigned int matrixkeyscn();
    
    int main( void )
    {
    	unsigned int num , num0=16 ,temp ;
    	while( 1 )
    	{
    		num = matrixkeyscn();
    		if( num != num0 )                     // 按键状态有变,则(才)需要操作
    		{
    			if( num < 16 )	                  // 按了不同的按键
    			{
    				LED_on( 0xc0 , table[num] );  // 点亮对应的数码管
    				P3 = 0x0f ;
    				temp = P3 ;
    				while( temp != 0x0f )		  // 等放开按键
    				{
    					temp = P3 ;
    				}
    			}
    			else			                  // 先前按了,现在不按了
    			{
    				LED_on( 0xc0 , 0x00 );		  // 关闭数码管
    				P3 = 0x0f ;
    				temp = P3 ;
    				while( temp == 0x0f )		  // 等再按下按键
    				{
    					temp = P3 ;
    				}
    			}
    	   		num0 = num ;
    		}
    	}
    	return 0 ;
    }
    
    unsigned int matrixkeyscn()      // 键盘阵列,行列扫描
    {
    	unsigned char temp ;
    	unsigned int hang , lie , key=16 ;
    
    	P3 = 0x0f ;
    	temp = P3 ;
    	if( temp != 0x0f )
    	{
    		delayms( 10 );	    // 去抖延时
    		P3 = 0x0f ;
    		temp = P3 ;
    		if( temp != 0x0f )
    		{
    			P3 = 0x0f ;
    			temp = P3 ;
    		    switch( temp )
    			{
    			 	case 0x0e : hang = 1; break;
    				case 0x0d : hang = 2; break;
    				case 0x0b : hang = 3; break;
    				case 0x07 : hang = 4; break;
    			}
    
    			P3 = 0xf0 ;
    			temp = P3 ;
    			switch( temp )
    			{
    			 	case 0xe0 : lie = 1; break;
    				case 0xd0 : lie = 2; break;
    				case 0xb0 : lie = 3; break;
    				case 0x70 : lie = 4; break;
    			}
    			key = ( hang - 1 ) * 4 + lie - 1 ;
    		}
    	}
    	return key ;
    }
    
    int LED_on( unsigned int P0we , unsigned int P0du )
    {	
    	wela = 1 ;
    	P0 = P0we ;
    	wela = 0 ;
    		
    	P0 = 0xff ;	  // 消影
    	dula = 1 ;
    	P0 = P0du ;
    	dula = 0 ;
    
    	return 0 ;
    }
    
    int delayms( unsigned int xms )
    {
     	unsigned int i , j ;
    	for( i=0 ; i<xms ; i++ )
    		for( j=0 ; j<110 ; j++ );
    	return 0;
    }
    
    
    展开全文
  • 51单片机之独立按键和矩阵键盘(概念及原理

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

    万次阅读 多人点赞 2019-05-15 22:11:59
    独立键盘与单片机连接时,每一个按键都需要单片机的一个I... 我们以4X4矩阵键盘为例讲解其工作原理和检测方法。将16个按键排成4行4列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一...
  • 根据电路原理图,键盘扫描方法是:行线P1O~P13为输出线,列线P14~P17为输入线...51单片机综合学习系统资源丰富,板内有:8位LED数码管、32路LED、4x4矩阵键盘、4个直控按键盘、蜂鸣器喇叭、继电器试验、I2C总线接口、S
  • 1.掌握矩阵键盘工作原理。 2.掌握矩阵键盘驱动方法。 3.配置单片机显示模块,实现具备键盘功能的应用程序。 设计程序把按键键码(0-F)显示在八位数码管上。 要求:启动时八位数码管的八个段全显示,每次按键时...
  • 本文通过在proteus上搭建51单片机的矩阵键盘电路并联合keil编程软件编写的源程序进行8*8矩阵键盘仿真,进而熟悉proteus仿真软件的仿真操作。 目录(一)4×4矩阵键盘原理1.逐行扫描2.行列扫描(二)8×8矩阵键盘...
  • 上讲介绍并应用了单片机的串口通信,并给出了实例。从这一讲开始将介绍单片机的外围电路。这讲向大家介绍单片机外接键盘电路,通过该讲,读者可以掌握单片机外接键盘的工作原理从而实现电路与程序设计。
  • 1.1 矩阵键盘原理 独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。单片机系统中 I/O 口资源往往比较宝贵,当用到多个按键时...
  • 3.4 51单片机-矩阵键盘

    2021-10-28 16:12:11
    3.4.1 矩阵键盘原理图 要使用矩阵键盘,需要将JP4接到JP8(P1)上面,JP165跳线帽需要断开(否则会导致矩阵键盘最右一排无法正常使用)。 图3-4-1 图3-4-2(这张图看起来更加方便) 图3-4-3 3.4.2 矩阵键盘...
  • 51单片机矩阵键盘扫描

    千次阅读 多人点赞 2015-06-24 14:53:00
    矩阵键盘检测原理: 1、查询是否有键按下。 2、键的抖动处理。 3、查询按下键所在行和列位置,得到键值。先行后列扫描法#include<reg51.h> #define uchar unsigned char #define uint unsigned int #define t
  • ORG 0000H ;伪指令,指定一下程序汇编后代码在入程序存储器0000H单元开始的连续单元中,不占有内存AJMP MAIN ;短转移指令,转到主程序开始处ORG 0050H ;伪指令,指定一下程序是从0050H之后连续单元存储MAIN:MOV P1,#...
  • 8051单片机矩阵键盘原理分析, 浅显易懂
  • 在《51单片机(二十九)—— 矩阵键盘输入实验》中,我们对矩阵键盘原理及使用方法进行了介绍。在本文中,我们采用矩阵键盘设计一个计算器,实现简单的计算器功能。 这个实验的代码的主函数如下所示。 main() ...
  • //4x4矩阵键盘扫描例程(C51)//使用P0口上的LED灯显示4x4键盘扫描得到的键值////广西民大物电学院 李映超 2010.4.19#include //52系列单片机头文件#define uchar unsigned char#define uint unsigned int#define key_...
  • 矩阵键盘原理 矩阵键盘是这个东西: 电路原理图 矩阵键盘的判断方式是:逐行逐列扫描。 P10、P11、P12、P13为一组(记为A组),属于“列”; P14、P15、P16、P17为一组(记为B组),属于“行”。 通过扫描,确定...
  • 51单片机键盘、矩阵键盘松手检测

    千次阅读 2019-09-27 23:08:39
    当按下按键不松手,是进行一次响应操作,还是重复进行响应操作呢?下面就基于51单片机的独立按键和矩阵键盘对连按功能进行配置。
  • C51 单片机矩阵键盘

    千次阅读 2015-12-28 00:45:44
    关于矩阵键盘的扫描,这个简单的问题居然困扰了我一天。扫描原理:输入行值,读取列值;输入列值,读取行值。这是很常用的方法。代码如下: //======================================= // 矩阵键盘扫描,返回按键...
  • 51单片机矩阵键盘编码方法

    万次阅读 多人点赞 2017-07-23 16:33:16
    众所周知,51单片机一般的键盘检测原理为非编码键盘检测,没有专门用来产生键编码号或键值的电路芯片;而我们使用的电脑键盘为编码键盘,通过编码电路芯片为每个按键产生一个编码号,可以通过串行总线把键值传输给...
  • 一、矩阵键盘原理介绍 在之前的文章中,我们介绍过独立按键的使用,独立按键需要每个按键使用一个IO口进行读取,如果按键比较多,对IO资源的占用比较多。 ...
  • 简陋,后面再修改 直接控制: 8*8LED点阵的点阵控制方法与动态数码管非常相似 动态数码管是控制位选,直接给段选送数据 点阵是控制行,直接给列送数据 For循环控制行的扫描,8行就循环8次,循环内利用...矩阵键盘

空空如也

空空如也

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

51单片机矩阵键盘原理