51单片机之矩阵按键

2018/3/18

单片机

1.说在前面

1.今天从图书馆借到了一本51单片机的基础教程,从其中看到了一些关于单片机的基础知识

1-1:单片机是在一块硅片上集成微处理器,储存器以及各种输入输出接口,所以被称为单片微型计算机,简称单片机

1-2:通俗的来说,单片机就是一块集成芯片,但是有一些特殊的功能,通过在不同时间控制芯片输出高低电平从而输出不同的电平,控制和引脚相连的外围电路的电气情况

对于我的单片机板子ST89c52 40I

STC:前缀    8:8051内核    9:内部是FlashE^2prom存储器    c:cmos存储器    5:无特殊含意    2:内存为2*4KB

40I:40表示单片机的最高晶振为40mhz,I:表示为工业用(c:商业    a:汽车用品    m:军用)

2.矩阵键盘(进入正题)

1.矩阵键盘其实和独立键盘的原理差不多,都是机械按键,都需要实现消抖,但是矩阵键盘需要加上一些特定的条件,不能跟独立键盘一样一个一个定义了(否则定义16个不是要爆炸),所以如果要判断是哪个键位按下,有两种判断方法

 方法一:先通过高四位全部输出低电平,然后逐行扫描,如果低四位不为1(非门)则,该行的按键被按下

方法二(常用):先给高四位全部输出低电平,低四位输出高电平,接受数据,当低四位不全为高电平时,判断所在列,然后,低四位输出低电平,高四位输出高电平,判断行,行列都判断了;

	#include<reg52.h>
//采用宏定义,定义矩阵端口和数码管发送端口
	#define  GPIO_KEY P1//矩阵端口
	#define  GPIO_DIG P0//数码管端口
	typedef unsigned char u8;
	typedef unsigned int u16;
/*实现38译码器的使用,实现数码管的位选*/
	sbit LSA=P2^2;
	sbit LSB=P2^3;
	sbit LSC=P2^4;
	u8 KEY_VALUE;//定义矩阵键盘所定义的数
	u16 i;//延时参数
	u16 a=0;

//使用数组定义,code为定义常量数组,将数组定义在ROM中
	u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码管的字码
//延时函数
	void delay(u16 i)
	{
		while(i--);
	}
//判断按键按下的情况
	void KEYDown()
	{
	GPIO_KEY=0x0f;//00001111 定义高四位为低电平,低四位为高电平
	if(GPIO_KEY!=0x0f)//说明某一列按键按下
	{
		delay(1000);//消抖
		if(GPIO_KEY!=0x0f) //检测代码是否按下
		{
		//列判断
			 GPIO_KEY=0x0f;//00001111定义高四位为0,低四位为1
			 switch(GPIO_KEY)
			 {
				//给samg数组赋值,便于让按钮控制数值
			 	case(0x07):	KEY_VALUE=0;break;//第一列,00000111
				case(0x0b): KEY_VALUE=1;break;//第二列,00001011
				case(0x0d): KEY_VALUE=2;break;//第三列,00001101
				case(0x0e): KEY_VALUE=3;break;//第四列;00001110
			 }
			//行判断
			  GPIO_KEY=0xf0;
			 switch(GPIO_KEY)
			 {
			  GPIO_KEY=0xf0;//定义高四位为1,低四位为0(第二次判断)
			   	case(0x70):	KEY_VALUE=KEY_VALUE;break;//第一行,01110000
				case(0xb0): KEY_VALUE=KEY_VALUE+4;break;//第二行,10110000
				case(0xd0): KEY_VALUE=KEY_VALUE+8;break;//第三列,11010000
				case(0xe0):	KEY_VALUE=KEY_VALUE+12;break;//第四列;11100000
			}
			//设置a,设置运转时间
			while((a<50)&&(GPIO_KEY!=0xf0))//按键松手检测
			{
				delay(1000);
				a++;
			}
		}

	}
	}	

	void main()	
	{
//表示38译码器
		LSA=1;
		LSB=1;
		LSC=0;
		while(1)
		{
		  KEYDown();
		  GPIO_DIG=smgduan[KEY_VALUE];
		}
	

	}






  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值