15:矩阵按键

1、 矩阵按键的原理图分析

在这里插入图片描述

(1)横向和纵向分割
(2)按键两端分别接不同的IO引脚
(3)按键的物理作用不变:按下接通电路,弹起断开电路
把上面的图简化如下图:
在这里插入图片描述
由图得出2个不同的引脚控制一个按键。如8号引脚和4号引脚控制按键S1。

2、 矩阵键盘的工作过程

(1)单片机CPU先输出(IO引脚输出)0x0f(0000 1111)
既8~5为0,4~1为1。
(2)若没有按键按下,则单片机CPU收到的依然是0x0f。假如S1按键按下,则4号引脚的高电平1会变成低电平0,则CPU收到的是 0x07(0000 0111),但是S1,S5,S9,S13按下后也会使4号引脚变成低电平0。
(3)单片机CPU继续输出0xf0(1111 0000),既8~5为1 ,4~1为0。假如S1按键按下,则8号引脚的高电平1会变成低电平0,则CPU收到的是 0x70(0111 0000),但是S1,S2,S3,S4按下都会使8号引脚变成低电平0。
(4)从收到的数据(IO引脚输入)判断哪一列按下了。
(5)综合2次得到的行和列位置,计算出键值。

3、编程实战

3.1、先通过LED灯进行按键测试

按键接P2端口,从上到下是P2.7~P2.0

#include <REGX51.H>

#define LED P0
#define KEY P2


void main(void)
{
   
		KEY = 0X0F;    //从P2端口输出(0000 1111)
		if(KEY != 0X0F) //代表由按键按下
		{
   
			LED = KEY;
		}
}

0000 1111
K1按下:0000 0111
K2按下:0000 1011
K3按下:0000 1101
K4按下:0000 1110
由次可以类推出:
8位二进制,后4位代表列。

#include <REGX51.H>

#define LED P0
#define KEY P2


void main(void)
{
   
		KEY = 0Xf0;    //从P2端口输出(1111 0000)
		if(KEY != 0Xf0) //代表由按键按下,与P2连接的引脚输入不是1111 0000,
		{
   
			LED = KEY;
		}
}

1111 0000
K1按下:0111 0000
K5按下:1011 0000
K9按下:1101 0000
K13按下:1110 0000
由次可以类推出:
8位二进制,前4位代表行。

3.2、通过静态数码管显示键值

按键接P2端口,从上到下是P2.7~P2.0

#include <REGX51.H>

#define SMG P0
#define KEY P2

void delay10ms(void)  //消抖的延迟函数
{
   
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}

void main(void)
{
   
	  while(1)
	{
   
	unsigned char hang,lie,keynum;
	unsigned char val[16] = {
   0xc0, 0xf9, 0xa4, 0xb0,
	0x99, 0x92, 0x82, 0xf8, 
	0x80, 0x90, 0x88, 0x83, 
	0xc6, 0xa1, 0x86, 0x8e};
	
/******判断是哪一行按下******/
		KEY = 0Xf0;    //从P2端口输出(0000 1111)
		if(KEY != 0Xf0) //代表有按键按下
	{
   
	   delay10ms();//消抖
			switch(KEY)
			{
   
				case 0x70:
					     hang = 1;
				break;
				case 0xb0:
					     hang = 2;
				break;
				case 0xd0:
					     hang = 3;
				break;
				case 0xe0:
					     hang = 4;
				break;
				default:
					break;
			}				
				
/******判断是哪一列按下******/
			KEY = 0x0F;//p2端口输出0000 1111
		if(KEY != 0x0f)//代表有按键按下
	  {
   
				switch(KEY)
			{
   
				case 0x07:
					     lie = 1;
				break;
				case 0x0b:
					     lie = 2;
				break;
				case 0x0d:
					     lie = 3;
				break;
				case 0x0e:
					     lie = 4;
				break;
				default:
					break;		
			}
		}
			keynum = (hang - 1)*4 + lie;
	}
	else//没有任何按键按下
		keynum = 0;//静态数码管一直显示为0
		 SMG = val[keynum];
 }
		
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-02-06 03:36:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-06 03:36:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-06 03:36:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-06 03:36:01       20 阅读

热门阅读

  1. 292.Nim游戏

    2024-02-06 03:36:01       35 阅读
  2. 【Django-ninja】使用schema

    2024-02-06 03:36:01       32 阅读
  3. docker容器stop流程

    2024-02-06 03:36:01       30 阅读
  4. Linux cp命令(cp指令)解析

    2024-02-06 03:36:01       32 阅读
  5. 每日一题 力扣1696跳跃游戏

    2024-02-06 03:36:01       39 阅读
  6. 【数学1】基础数学问题

    2024-02-06 03:36:01       39 阅读
  7. 【Android】代码混淆简单介绍

    2024-02-06 03:36:01       40 阅读
  8. 异或加密原理及简单应用(C语言版)

    2024-02-06 03:36:01       37 阅读
  9. Docker Compose下载

    2024-02-06 03:36:01       34 阅读
  10. 【lesson12】高并发内存池项目最终完整版代码

    2024-02-06 03:36:01       28 阅读
  11. Simulink仿真中Simulink.ConfigSet用法

    2024-02-06 03:36:01       35 阅读
  12. 流量控制原理

    2024-02-06 03:36:01       38 阅读