键盘之中断法3

b1d1d9706e9946efa8a422274eed6498.png

本文为LED-执棋困局,csdn原创首发。
> 发布人:LED-执棋困局
> 欢迎大家与LED-执棋困局相互点赞+关注+收藏+评论,也祝大家生活安康,学业愉快,工作顺利。
> 我的格言是:“尽最大努力,做最好的自己!
版权声明:本文为CSDN博主「LCD-执棋困局」的原创文章。

昨天,我们学习了独立按键与外部中断的结合项目,今天我们将一起学习矩阵键盘与外部中断的结合。

回顾上文,打下基础:

键盘之中断法3

目录

一、回顾知识

1.1矩阵键盘

1.2外部中断

二、项目实战

2.1功能说明

2.2仿真图

2.3模块解析

2.4结果展示

三、本文总结


一、回顾知识

1.1矩阵键盘

矩阵键盘排列方式有4×4、8x8、16x16、32×32等。

以4×4矩阵键盘为例,对行来看,每行键盘一端共接一个单片机接口,共占一个I/O口的低4位接口。对列来看,每列键盘另一端共接一个单片机接口,共占一个I/O口的高4位接口。

本文涉及2个概念,分别是按键行列编码、人为规定的编码

按键行列编码:通过不同行列计算出来的按键独有的编码。不同行/不同列/不同行列编码不同,可以通过该编码判断按键所在的行与列。

人为规定的编码:按下键盘在数码管中显示的数值。

上述可得,按键行列编码是计算值,人为规定的编码是结果值/显示值。

计算按键行列编码:

1为输入,0为输出。将行输出,列输入,计算出,即11110000,计算出temp,然后行输入,列输出,即00001111,计算出temp2,最后计算出temp+temp2,这个结果就是按键行列编码。

1.2外部中断

外部中断有2个,分别是外部中断0和外部中断1,各自对应引脚INT0、INT1,它们各自的中断服务函数入口编号是0、2。

初始化:打开总中断、外部中断并确定触发方式。

中断服务函数:格式为void timer() interrupt n

1.3按键与外部中断触发

当按键按下时,外部中断对应的引脚会变成低电平,从而触发中断。

二、项目实战

2.1功能说明

16个键盘组成4×4矩阵键盘,按键触发外部中断,从第一个按键开始,按竖直方向算起,按键人为规定以此是1、2、3、......、0、a、b、c、d、e、f。

2.2仿真图

​​​​​​​

2.3模块解析

main.c

keypressflag是外部中断标志位,keypressflag=1说明外部中断触发。

void init0()//外部中断0初始化
{
	IT0=1;
	EX0=1;
	EA=1;
}

void time0() interrupt 0//外部中断0中断服务函数
{
	keypressflag=1;
}

void dis_service()用于显示数码管每一位。

void dis_service()
{
	LEDBuf[0]=23;
	LEDBuf[1]=23;
	LEDBuf[2]=23;
	LEDBuf[3]=Keynum;
}

if(keypressflag==1)用于判断外部中断是否触发。

#include "reg51.h"
#include "display.h"
#include "key_scan.h"


void dis_service();
void init0();

unsigned char Keynum;
unsigned char keypressflag;

void main()
{
	init0();
	P2=0x0f;
	while(1)
	{
		if(keypressflag==1)
		{
			keypressflag=0;
			Keynum=key_scan();
		}
		dis_service();
		display();
	}
}

key_scan.c

#include "key_scan.h"//独立键盘头文件
#include "delay.h"//延时头文件

/******************************************************************************************
函数名:key
功能:  独立键盘函数
参数:  无
返回值:unsigned char
******************************************************************************************/
unsigned char key_scan()//独立键盘按键函数
{
	unsigned char temp,temp2;
	static unsigned char keynum=20;
	KEYPIO=0xf0;//1为输入 0位输出 令高4位为1 低4位为0
	temp=KEYPIO;
	if(temp!=0xf0)//判断是否按下按键
	{
		delay(10);//消抖延时10ms
		if(temp!=0xf0)//再次判断是否按下按键
		{
			temp=KEYPIO&0xf0;//确定行
			KEYPIO=0x0f;//反转
			temp2=KEYPIO&0x0f;//确定列
		}
	}
	switch(temp+temp2)
	{
		case 0xee:keynum=1;break;
		case 0xed:keynum=2;break;
		case 0xeb:keynum=3;break;
		case 0xe7:keynum=4;break;
		case 0xde:keynum=5;break;
		case 0xdd:keynum=6;break;
		case 0xdb:keynum=7;break;
		case 0xd7:keynum=8;break;
		case 0xbe:keynum=9;break;
		case 0xbd:keynum=0;break;
		case 0xbb:keynum=10;break;
		case 0xb7:keynum=11;break;
		case 0x7e:keynum=12;break;
		case 0x7d:keynum=13;break;
		case 0x7b:keynum=14;break;
		case 0x77:keynum=15;break;
		default:break;
	}
	return keynum;
}

key_scan.h

#ifndef __KEY_SCAN_H__
#define __KEY_SCAN_H__

#include <reg51.h>//51头文件

#define KEYPIO P2 //矩阵键盘两端所接的IO口

unsigned char key_scan();//独立键盘函数声明

#endif

2.4结果展示

三、本文总结

本文内容回顾了矩阵键盘和外部中断的知识,并将两者结合作为实战,进一步学会如何初始化和写外部中断服务函数。

下一文我将总结键盘知识点!!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值