利用中断实现的4*4矩阵键盘扫描

#include <reg51.h>
#include <intrins.h>
typedef unsigned char UINT8;
typedef unsigned int UINT16;

UINT8 num = 0, temp = 0, key = 16, t0 = 0, t1 = 0, shu = 0;

/* 数码管编码 */

UINT8 code table[]=
{
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71,0x00
};

/* 初始化函数 */
void init()
{
	P1 = 0xf0;
	/* 初始化定时器 */
	TMOD = 0x01;					/* 定时器0和定时器1同时设置为16位定时方式 */
	TH0 = (65536 - 50000) / 256; 	  // 放在高八位当中
	TL0 = (65536 - 50000) % 256;
	EA = 1;						//开总中断
	ET0 = 1;					//开定时器0中断
	TR0 =1;						//启动定时器0
}

/* 显示函数 */
/* 按键扫描函数 */
UINT8 scan_key()
{
		P1 = 0xef;
		temp = P1;
		temp = temp&0xf0;
		if (temp != 0xf0)
		{
			temp = P1;
			switch(temp)
			{
				  case 0xee:
					   key=0;
					   break;
				  case 0xed:
					   key=1;
					   break;
				  case 0xeb:
					   key=2;
					   break;
				  case 0xe7:
					   key=3;
					   break;
				  default:
					  break;
			}
			P1=0xfe;
		}
		P1 = 0xdf;
		temp = P1;
		temp = temp&0x0f;
		if(temp != 0x0f)
		{
			temp = P1;
			switch(temp)
			{
				  case 0xde:
					   key = 4;
					   break;
				  case 0xdd:
					   key = 5;
					   break;
				  case 0xdb:
					   key = 6;
					   break;
				  case 0xd7:
					   key = 7;
					   break;
				  default:
					  break;
			 }
		}
		P1 = 0xbf;
		temp = P1;
		temp = temp&0x0f;
		if(temp != 0x0f)
		{
			temp = P1;
			switch(temp)
			{
				  case 0xbe:
					   key = 8;
					   break;

				  case 0xbd:
					   key = 9;
					   break;

				  case 0xbb:
					   key = 10;
					   break;

				  case 0xb7:
					   key = 11;
					   break;
				  default:
					   break;
			}
		}
		P1 = 0x7f;
		temp = P1;
		temp = temp&0x0f;
		if(temp != 0x0f)
		{
			temp = P1;
			switch(temp)
			{
				  case 0x7e:
					   key = 12;
					   break;

				  case 0x7d:
					   key = 13;
					   break;

				  case 0x7b:
					   key = 14;
					   break;

				  case 0x77:
					   key = 15;
					   break;

				  default:
					  break;
			}
		}
		return key;
}

/* 显示函数 */
void display(unsigned char num)
{
     P0 = table[num];
}

/* 定时器0的中断 */
void timer0() interrupt 1
{
	/* 装初值 */
	TH0 = (65536 - 50000) / 256;
	TL0 = (65536 - 50000) % 256;
	t0++;
	display(key);
	if ( t0 == 1)
	{
		t0 = 0;
		key = scan_key();
		P1 = 0x00;
	}
}

void main()
{
	init();

	while(1)
	{
		;
	}
}

时间: 2024-11-05 17:19:15

利用中断实现的4*4矩阵键盘扫描的相关文章

4x4矩阵键盘扫描

4x4矩阵键盘扫描 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了 Win10 IoT 如何对本地 IoT 设备内嵌 SQLite 数据库进行 CURD 操作 ,这章我们来学习如何使用 GPIO Pin 扫描4x4矩阵键盘按键状态.如果对安装部署过程还不熟悉可以参考前几篇文章,Raspberry安装 IoT系统及搭建开发环境(http:/

4X4矩阵键盘扫描程序

4X4矩阵键盘扫描: 1. 4根行线的GIO均设为Output,根列线的GIO均设为Input: 2. 4根行线的GIO分别置为0111.1011.1101.1110,读逐一读取列线GIO的值,可确定是哪一个按键: 电路图如下: 注意: 1. 图中用作输入的GIO,一定要有一个上拉电阻. 2. 芯片中的每一个引脚是否用作了GPIO口来用,需配置芯片的寄存器,使引脚当作GPIO口来使用,才会有效. 测试代码如下: #define KEY_GIO_ROW_1 37 #define KEY_GIO_R

STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)

本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可. 1.键盘原理图: 2.STM32 cubemx 引脚配置图: 这里用外部晶振内部晶振都可以,时钟对这个没什么影响,不用开中断,所以其他的配置就不细说了,下面再说一下这8个GPIO的配置. 4个引脚配推挽输出,这4个配输出的引脚内部上下拉不用配置:另外4个配成输入,内部上拉. 3.生成代码后,开始编写逻辑: 编写之前我们先做一下头文件的定义,把一些要用到的宏定

矩阵键盘扫描算法

函数的主体 unsigned char GetKey() { unsigned char i,j,k; static unsigned char backup[4][4]={ {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1} }; EA=1; TMOD=0x01;//设置T0为模式1 TH0=0xF8; TL0=0xCD; ET0=1;//使能T0中断 TR0=1;//启动T0 while(1) { for(i=0;i<4;i++)//循环检测4×4的矩阵按键 {

单片机第8课:矩阵键盘扫描

JP3接P0,VCC接+5V,矩阵键盘的左边八个引脚接在P1上面.想要的结果是按第0个按键,数码管显示0,以此类推.注意,这里的数码管是共阳极的. #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa

Win10 IoT C#开发 6 - 4x4矩阵键盘扫描

Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了 Win10 IoT 如何对本地 IoT 设备内嵌 SQLite 数据库进行 CURD 操作 ,这章我们来学习如何使用 GPIO Pin 扫描4x4矩阵键盘按键状态.如果对安装部署过程还不熟悉可以参考前几篇文章,Raspberry安装 IoT系统及搭建开发环境(http://www.cnblo

4x4矩阵键盘 扫描程序

一:不排除第四位异常处理 uchar JuzhenkeyScan() { // P3=0xfe; // temp=P3; // while(temp!=0xfe) // { // temp=P3; // switch(temp) // { // case 0xee:num=10; // break; // case 0xde:num=3; // break; // case 0xbe:num=2; // break; // case 0x7e:num=1; // break; // } // d

AVR单片机教程——矩阵键盘

本文隶属于AVR单片机教程系列. ? 开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测.但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法. 矩阵键盘 这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动.我们先来看看它的原理. 每个按键有两个引脚,当按键按下时接通.每一行的一个引脚接在一起,分别连接到左边4个端口,称为"行引脚":每一列的另一个引脚接在一起,分别连接到右边的4个端口,称

【转】 矩阵键盘的工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,在矩阵键盘中每条水平线和垂直线在交叉处不直接相连,而是通过一个按键相连接,这样在由N条水平线和M条垂直线最多可以有N *M 个按键,大大的减少了对于芯片I/O的占用. 键盘矩阵的按键识别方法 图1   矩阵键盘的结构 方法一 行扫描法 1.判断键盘中有无键按下 将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态.只要有一列的电平为低,则表示键盘中有键