Proteus仿真实验---4x4矩阵按键

最近在回顾学习,之前一直没想到要记录一下,突然想到还是要写一写学习笔记的,不仅能记录自己的学习过程,还能记录一下学习过程中出现的问题和思考。(知识能力有限,有错的地方还请不吝指正,谢谢!)

 下面先来记录一下第一个问题:

一个简单的矩阵按键加数码显示如下:

        简单介绍一下矩阵按键:将按键排列成4x4的矩阵,按照行列将按键的各引脚接在起,行接在P1口的高四位,列接在了P1口的低四位;用的数码管为四引脚控制的七段数码管。

电路:

Proteus仿真实验---4x4矩阵按键_第1张图片

 keil程序:

        

        行列判断:如有按键按下,判断列,先将P1口设置为0x0f,也就是将高四位置0低四位置为1,若是第一行第一列按下,则P1口值为0x07,给keyvalue赋值为0,也就是按键S0,表示第一行第一列,第二列P1口值为0x0b,keyvalue的值按它的排序值给,就是1,也是按键S1,剩下两列P1口值分别为0x0d,0x0e;

        判断行,将P1口设置为0xf0,也就是高四位置1,低四位置0,若是第一列第一行按下,则P1口值为0x70,给keyvalue赋值为原来的keyvalue,第二行第一列按下P1口值为0xb0,keyvlaue的值则是在列判断基础上加4,按键则是S4,后面三个按键也是在原来列基础上加4,就是这一行的按键,还有两列对应的P1口的值为0xd0,0xe0。

        这里有个问题:为什么P1口赋值0x0f,按键按下后为1的引脚会变为0?

#include "reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;

#define GPIO_KEY P1
#define GPIO_LED P2

u8 KeyValue;     //用来存放按键的值


void delay(u16 i)   //延时函数
{
	while(i--);
}

//u8 code smgduan[17] = {0x40,0xcf,0x24,0x30,0x19,
//											0x12,0x02,0xf8,0x00,0x10};  //单个数码管对应的0~9的值

											
void keyscan(void)
{
	u8 a=0;
	GPIO_KEY = 0x0f;  //判断列
	if(GPIO_KEY != 0x0f)  //检测按键是否按下
	{
		delay(1000);  //延时10ms消抖
		if(GPIO_KEY != 0x0f)
		{
			GPIO_KEY = 0x0f;  //判断列
			switch(GPIO_KEY)
			{
				case(0x07):KeyValue = 0;break;  //列的值
				case(0x0b):KeyValue = 1;break;
				case(0x0d):KeyValue = 2;break;
				case(0x0e):KeyValue = 3;break;
			}
			
			GPIO_KEY = 0xf0;  //判断行
			switch(GPIO_KEY)
			{
				case(0x70):KeyValue = KeyValue;break; //
				case(0xb0):KeyValue = KeyValue+4;break;
				case(0xd0):KeyValue = KeyValue+8;break;
				case(0xe0):KeyValue = KeyValue+12;break;
			}
			while((a<50)&&(GPIO_KEY != 0xf0))
			{
				delay(1000);
				a++;
			}
		}
	}
}

void main()
{
	
	while(1)
	{
		keyscan();
		GPIO_LED = KeyValue;
	}
}

 最后仿真出现的问题是,列的值可以判断出,但是到行却没有?

Proteus仿真实验---4x4矩阵按键_第2张图片

你可能感兴趣的:(矩阵,单片机,线性代数)