本文为LED-执棋困局,csdn原创首发。
> 发布人:LED-执棋困局
> 欢迎大家与LED-执棋困局相互点赞+关注+收藏+评论,也祝大家生活安康,学业愉快,工作顺利。
> 我的格言是:“尽最大努力,做最好的自己!
版权声明:本文为CSDN博主「LCD-执棋困局」的原创文章。昨天,我们学习了独立按键与外部中断的结合项目,今天我们将一起学习矩阵键盘与外部中断的结合。
回顾上文,打下基础:
目录
一、回顾知识
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结果展示
三、本文总结
本文内容回顾了矩阵键盘和外部中断的知识,并将两者结合作为实战,进一步学会如何初始化和写外部中断服务函数。
下一文我将总结键盘知识点!!!!!