51单片机——按键

1. 独立按键

在这里插入图片描述
在这里插入图片描述

#include"reg51.h"
typedef unsigned char u8
typedef unsigned int  u16

sbit k2=P3^0;
sbit led=P2^0;
void delay(u16 i)
{
	while(i--);
}
void 	keypros()
{
	if(k2==0)
	{
		delay(500);			//消抖
		if(k2==0)			//判断K2是否为低电平
			led=~led;		//led取反
		while(!k2);		//判断是否松开,松开的话(应为有上拉电阻默认高电平),跳出循环,没松开的话,led状态不变
	}

}

void main()
{
	while(1)
	{
		keypros();
	}
}

2.矩阵按键

在这里插入图片描述

按键扫描原理:

1)逐行扫描:1、2、3、4分别输出高电平),观察5、6、7、8 pin脚上电平的情况。
2)行列扫描:高四位(1、2、3、4)先同时输出低电平,低四位(5、6、7、8)输出为高电平,根据低四位上电平的情况判断哪一列的按键被按下。按键被按下时,按键所在一列全为低电平,因此高四再位同时输出高电平,低四位同时输出低电平,再根据低四位上电平情况判断那一行被按下。
(高电平遇上低电平都变成低电平,相当于接地)

#include"reg51.h"
typedef unsigned char u8;
typedef unsigned int  u16;

#define GPI0_DIG P0
#define GPIO_KEY P1

u8	smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};			//共阴
u8 KeyValue;
void delay(u16 i)
{
	while(i--);
}
void KeyDown()
{
	 char a=0;
	 GPIO_KEY=0x0f;						//00001111 高四位低电平 第四位高电平
	 if(GPIO_KEY!=0x0f)
	 {
	 	delay(1000);//消抖
		if(GPIO_KEY!=0x0f)
		{
			switch(GPIO_KEY)
			{
				case(0x07):KeyValue=0;break;//0000	0111
			 	case(0x0b):KeyValue=1;break;
				case(0x0d):KeyValue=2;break;
				case(0x0e):KeyValue=3;break;
			}   
				
			GPIO_KEY=0xf0;				//11110000 高四位高电平 第四位低电平
			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++ ;				   //a强制退出
			}
		}
		
		}

}

void main()
{
	while(1)
	{
		KeyDown();
		GPI0_DIG=smgduan[KeyValue];//静态数码管共阳,段码是共阴的,需要取反
	}
				
}

P0口控制LCD
P1口控制矩阵按键

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值