【51单片机】矩阵按键

0、前言

参考:普中 51 单片机开发攻略

1、硬件

【51单片机】矩阵按键_第1张图片

2、软件

main.c

#include 
#include 
#include "delayms.h"

typedef unsigned int u16; //对数据类型进行声明定义 
typedef unsigned char u8; 

#define GPIO_KEY P1
#define GPIO_DIS P0

u8 KeyValue = 0; //保存键值(记录按下的是哪一个键)

// 显 示 0~F 的值 
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//确定哪个按键按下
void KeyDown(void)
{
	GPIO_KEY = 0x0F;
	

	if(GPIO_KEY != 0x0F)
	{
		delayms(100);  //消抖
		if(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 + 0; break;
				case(0xb0):
					KeyValue = KeyValue + 4;break;
				case(0xd0):
			    KeyValue = KeyValue + 8;break;
				case(0xe0):
					KeyValue = KeyValue + 12;break;
			}
		}
	}
}

/************ * 函 数 名 : main * 函数功能 : 主函数 *输 入 :无 *输 出 :无*********************/ 
void main() 
{ 
	while(1) 
	{ 
		KeyDown();
		GPIO_DIS = smgduan[KeyValue];
	} 
}

3、效果

只有第一个数码管量,并且按第几个键,就显示第几(0-F)。

你可能感兴趣的:(STC51单片机,51单片机,嵌入式硬件,单片机)