【51单片机】独立按键

学习使用的开发板:STC89C52RC/LE52RC

编程软件:Keil5

烧录软件:stc-isp

开发板实图:

文章目录

独立按键

独立按键在开发板的左下角


相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开

不按下时,图中圈出的金属弹片凸起,不会连通电路,按下后变得扁平,将电路连通


独立按键在开发板中原理图如下:

  • GND表示接地,表示负极
  • P30~P33是I/O口 ,CPU通过控制I/O口来实现电路是否连通,详细原理可参看!!!
  • 因为GND一端为负极,所以K1等为0,代表按键被按下,为1代表松开(没按下)
  • 该开发板的K1连接的是P31,K2连接的是P30,应该是连反了。理应按顺序,K1接0,K2接1,K3接2,K4连3

练习

通过独立按键控制LED亮起/熄灭

LED灯可以参看单片机第一个程序

此处简单介绍:P2_0 ~ P2_7控制D1 ~ D8,0为亮起,1为熄灭

要想实现该需求,我们可以通过检测独立按键的状态,按下让灯亮起,松开让灯熄灭。

因为我们要一直检测,所以需要在外层套个循环

代码如下:

c 复制代码
//按下按键灯亮,松开按键灯灭
void test1()
{
	//可以通过P2_0单独控制寄存器的一个比特位
	//独立按键K4->P3_3,K3->P3_2,K2->P3_0,K1->P3_1
	//按键1和2反了
	while(1)
	{
		if(P3_1 == 0)//K1按键按下
			P2_0 = 0;//D1亮灯
		else//K1没按下
			P2_0 = 1;//D1灭灯
	}
}

按键的抖动

按键的按下,对应电路的连通其实是一下就连通稳定的,如下图:

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动

这些抖动可能会影响按键状态的判断,要想消除这些抖动,我们可以手动进行延迟来过滤这些抖动

延迟的函数可以通过STC-ISP生成

注意选择符合的系统频率、指令集

我们可以生成延迟1ms的函数,然后稍加改动,变成可以指定延迟任意时间的方法

c 复制代码
//等待指定毫秒数
void Delayms(unsigned int xms)		//@12.000MHz
{
	while(xms--)
	{
		unsigned char i, j;
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

消除抖动的代码如下:

c 复制代码
//按下独立按键K1,再松开后改变D1灯的状态
void test2()
{	
	while(1)
	{
		if(P3_1 == 0)
		{
			Delayms(20);//按键的抖动------5~10ms,通过等待20ms,获取稳定的信号
			while(P3_1 == 0);//等待松开
			Delayms(20);//同样消除松开的抖动
			P2_0 = ~P2_0;//改变LED灯状态
		}	
	}
}

独立按键实现LED二进制亮起

因为LED灯是0亮起,1熄灭,所以我们可以通过控制其他变量从1开始累加,然后P2为其取反的值 即可

代码如下:

c 复制代码
//通过独立按键K1,使LED呈二进制++亮起
void test3()
{
	unsigned char LEDNum = 1;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delayms(20);//消除按下抖动
			while(P3_1 == 0);//等待松开
			Delayms(20);//消除松开抖动
			P2 = ~LEDNum;
			LEDNum++;
		}
	}	
}

独立按键实现LED左右移动

按下K1按键让LED灯往左,按下K2按键让LED灯往右

因为博主开发板的LED灯从左往右是D1~D8,注意辨别方向

代码如下:

c 复制代码
//K1按键让LED灯往左走,K2按键让LED灯往右走
void test4()
{
	unsigned char LEDNum = 1;
	P2 = 0xFE;//起始第一个灯亮起
	while(1)
	{
		if(P3_1 == 0)//K1按下,LED灯往左
		{
			Delayms(20);
			while(P3_1 == 0);
			Delayms(20);
			if(LEDNum == 1)//已经来到最左边,下一步直接跳到右边
				LEDNum = 0x80;
			else
				LEDNum >>= 1;
			P2 = ~LEDNum;
		}
		else if(P3_0 == 0)//K2按下,LED灯往右
		{
			Delayms(20);
			while(P3_0 == 0);
			Delayms(20);
			LEDNum <<= 1;
			if(LEDNum == 0)//LEDNum为unsigned,溢出后会变成0
				LEDNum = 1;
			P2 = ~LEDNum;
		}
	}
}

注意点: P2 = ~LEDNum

  • 当要向左移动时,如果当前LEDNum为1时,此时P2 = 0xFE,最后一位为0,只有D1亮。要想再往左,那么要让D8亮,即P2只有最高位为0,相反的LEDNum只有最高位为1,所以LEDNum = 0x80
  • 当要向右移动时,因为LEDNum为unsigned,溢出会变成0,移位完为0,说明接下来要变成D1亮。此时P2 = 0xFE,则LEDNum = 1

以上就是本篇博客的所有内容,感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。

相关推荐
网易独家音乐人Mike Zhou14 分钟前
【无人机】MavLink通讯协议的回调解析函数及状态机
单片机·mcu·物联网·嵌入式·无人机·iot
teeeeeeemo27 分钟前
Vue数据响应式原理解析
前端·javascript·vue.js·笔记·前端框架·vue
蒙奇D索大1 小时前
【11408学习记录】考研数学攻坚:行列式本质、性质与计算全突破
笔记·学习·线性代数·考研·机器学习·改行学it
moxiaoran57531 小时前
uni-app学习笔记二十四--showLoading和showModal的用法
笔记·学习·uni-app
tcoding1 小时前
《基于Apache Flink的流处理》笔记
笔记·flink·apache
laocooon5238578862 小时前
win操作系统安装C++语言开发环境之一, vscode +MinGW ,流程
c语言
奔跑吧邓邓子2 小时前
解锁Vscode:C/C++环境配置超详细指南
c语言·c++·vscode·配置指南
代码小将2 小时前
java中static学习笔记
java·笔记·学习
小何~~2 小时前
基于 STM32 和 MPU6050 的三轴倾斜角度传感器设计与实现
stm32·单片机·嵌入式硬件·mpu6050·倾斜角度传感器
君鼎2 小时前
音视频——I2S 协议详解
嵌入式硬件·音视频