蓝桥杯——3.矩阵按键仿真实验

一.矩阵按键简介

矩阵键盘使用的方法与独立按键类似,但是比独立按键节省I/O,同时使用方法变得相对复杂了,首先展示硬件连接。

代码解释

对于矩阵键盘,常用的方法有两种,一个是线反转法,另一个是行列扫描法,本文介绍线反转法

首先插入模块化编程的内容,新建两个文件命名为keyboard.h与keyboard.c并添加到工程中,然后在h文件中定义一个宏,便于与硬件连接发生改变时而进行代码的修改。

编程思路

首先给矩阵键盘的端口Matrixkey_Port赋值0x0F,意为行为1列为0,即0000 1111,对应上图就是P10,P11,P12,P13为1,P14,P15,P16,P17为0,那么此时如果第一行有按键按下,P10这一位的高电平必然被拉低,1 & 0 = 0,P1就会变成0X0E,第二,三,四行亦如此,然后进行反推,当检测到这些值的出现时就可以知道是哪一行有按键按下,记录下行值,row就是行值;

再给矩阵键盘的端口Matrixkey_Port赋值0xF0,意为行为0列为1,即1111 0000,对应上图就是P10,P11,P12,P13为0,P14,P15,P16,P17为1,与第一次反推类似,可以得到列值col;

在下文的程序中,只要将row,col进行运算就能得到1-16的返回值。row的值是1 2 3 4,col的值是1 2 3 4,而键盘编码如下:

1234
5678
9101112
13141516

返回值1-16与行列的关系是(row-1)*4+col。

二.仿真电路图

在这里插入图片描述

三.程序编写

第1步.新建keyboard.h 和 keyboard.c ,放于HARDWARE文件夹中。

在这里插入图片描述

第2步.加载keyboard.c ,并添加keyboard.h文件所在位置。

在这里插入图片描述

在这里插入图片描述

第3步.撰写keyboard.h

#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
#define Matrixkey_Port P1
unsigned char Matrixkey_Scan(void);
#endif

​ 撰写keyboard.c

#include <STC15F2K60S2.h>
#include "keyboard.h"
#include "delay.h"
//按键按下返回键值(1-16)没有按下返回0
//其中row:表示行数;   col:表示列数 
unsigned char Matrixkey_Scan(void)
{
	unsigned char temp,row=0,col=0,i=0;
	Matrixkey_Port=0x0f;//行为1列为0 0000 1111 ->0x0f
	/*第一行若有按键按下 0000 1110 ->0x0e*/
	/*第二行若有按键按下 0000 1101 ->0x0d*/
	/*第三行若有按键按下 0000 1011 ->0x0b*/
	/*第四行若有按键按下 0000 0111 ->0x07*/
	delay_ms(1);
	temp=Matrixkey_Port;
	if(temp!=0x0f)//说明有按键按下
	{
		if(temp==0x0e)     row=1;
		else if(temp==0x0d)row=2;
		else if(temp==0x0b)row=3;
		else if(temp==0x07)row=4;
		
		/*************进行列数识别*****************/
		Matrixkey_Port=0xf0;//行为0列1 1111 0000->0xf0
		temp=Matrixkey_Port;
		if(temp!=0xf0)//说明有按键按下
		{
			switch(temp)
			{
				/*第一列若有按键按下 0111 0000 ->0x70*/
				/*第二列若有按键按下 1011 0000 ->0xb0*/
				/*第三列若有按键按下 1101 0000 ->0xd0*/
				/*第四列若有按键按下 1110 0000 ->0xe0*/
				case 0x70:col=1;break;
				case 0xb0:col=2;break;
				case 0xd0:col=3;break;
				case 0xe0:col=4;break;
				default:break;
			}
		}
		while(Matrixkey_Port!=0xf0&&i<255)//按键松开与超时判断
		{
			delay_ms(1);
			i++;
		}
	}
	if(row!=0&&col!=0) return ((row-1)*4+col);  //将行列数值 转换为 按键1、2、3、……16的值
	else return 0;
}

第4步.撰写main.c主程序

#include "main.h"
#include "keyboard.h"

unsigned char keynum;   //定义矩阵按键值

void main()
{
	BUZZ_OFF;    //关闭 蜂鸣器
	while(1)
	{
	/**************矩阵按键************/	
	keynum = Matrixkey_Scan();
		if(keynum!=0) 
		{
		    if(keynum == 1)    //如果按键KEY1被按下,LED1亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X01;			// 1111 1110
				LATCH_Y4_7      //锁存
			}

			if(keynum == 2)   //如果按键KEY2被按下,LED2亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X02;			// 1111 1101
				LATCH_Y4_7      //锁存
			}
			
			if(keynum == 3)    //如果按键KEY3被按下,LED3亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X04;			// 1111 1011
				LATCH_Y4_7      //锁存
			}
			
			if(keynum == 4)    //如果按键KEY4被按下,LED4亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X08;			// 1111 0111
				LATCH_Y4_7      //锁存
			}
			
			if(keynum == 5)    //如果按键KEY5被按下,LED5亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X10;			// 1110 1111
				LATCH_Y4_7      //锁存
			}
			
			if(keynum == 6)    //如果按键KEY6被按下,LED6亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X20;			// 1101 1111
				LATCH_Y4_7      //锁存
			}
			
			if(keynum == 7)    //如果按键KEY7被按下,LED7亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X40;			// 1011 1111
				LATCH_Y4_7      //锁存
			}
			
			if(keynum == 8)    //如果按键KEY8被按下,LED8亮
			{
				OPEN_Y4_LED     // 打开 LED 的锁存器
				P0 = ~0X80;			// 0111 1111
				LATCH_Y4_7      //锁存
			}
		}			
		
	}
}

四.程序运行效果

矩阵按键效果

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值