51单片机学习(4)-----独立按键进一步控制LED灯

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。

目录

[一. 独立按键灵活控制LED](#一. 独立按键灵活控制LED)

程序一:单个独立按键控制多个LED灯

程序二:多个独立按键同时控制LED

[二. 独立按键实现LED的位移控制](#二. 独立按键实现LED的位移控制)

1.位运算介绍:

2.具体运用:

[三. 实验视频](#三. 实验视频)


一. 独立按键灵活控制LED

对于独立按键的具体介绍可以参考:51单片机学习(3),这里我们借助一些算术运算符以及一些逻辑运算符来实现不同的控制。

运算符如下:

例如:

程序一:单个独立按键控制多个LED灯

cpp 复制代码
#include <REGX52.H>

void Delay(unsigned int xms)	//@11.0592MHz
{
	unsigned char data i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
void main()
{
	while(1)
	{
			if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			P2_0=~P2_0, P2_1=~P2_1;  //实现K1控制LED1和LED2
		}
	}
}

程序二:多个独立按键同时控制LED

cpp 复制代码
#include <REGX52.H>

void Delay(unsigned int xms)	//@11.0592MHz  //延时函数设置
{
	unsigned char data i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
void main()
{
	while(1)   //while循环语句
	{
		if(P3_1==0||P3_0==0)   //if语句,并且运用逻辑或
		{
			Delay(20);    //延时20ms,去除第一段抖动
			while(P3_1==0||P3_0==0);
			Delay(20);  //去除第二段抖动
			P2_0=~P2_0;   //按位取反,即对应的LED状态改变
		}
	}
}

二. 独立按键实现LED的位移控制

1.位运算介绍:

按位与(&): 按位与为双位运算符,其作用于将两个二进制数逐位相与,即只要对应的两个二进制都为1时,结果为1,否则为0。

例如:1&1=1,1&0=0,0&0=0。

按位或(|):按位或也为双目运算符,其作用于将两个二进制数逐位相或,即只要对应的两个二进制中有一个为1,其结果为1,否则为0。

例如:1|1=1,1|0=1,0|0=0。

按位异或(^):进行异或运算时,当两个二进制表示不同时为1,相同则为0。

例如:1^1=0,1^0=1。

按位取反(~):按位取反即对于二进制的每一位都取反。

例如:假设1的二进制为0000 0001,则按位取反后为1111 1110。

按位左移(<<):将操作数的二进制所有位向左移动指定的位数。

例如:1的二进制0000 0001,0000 0001<<2即1的二进制数按位左移动2位,则为0000 0100。

按位右移(>>):将操作数的二进制所有位向左移动指定的位数。

例如:10的二进制为0000 1010,0000 1010>>2即10的二进制数按位右移动2位,则为0000 0010(右移两位时高位补0即右移后的第一位补0)。

注意:这里的按位左移与右移均只对于正数而言,且左移时为低位补0,右移时为高位补0。

2.具体运用:

源程序:

cpp 复制代码
#include <REGX52.H>
void Delay(unsigned int xms)	//@11.0592MHz
{
	unsigned char data i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned int LEDNUM=0;  //定义移动的位数
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			LEDNUM++;   //移动的位数逐渐增加来实现逐次控制不同LED
			if(LEDNUM>=8)
			{
				LEDNUM=0;   //当移动的位数超过8时重新令位数为0,从而实现不断的逐次循环
			}
			P2=~(0x01<<LEDNUM);  //0x01本应该是第一个LED亮,但是这里马上进行了位运算,所以第一个点亮的为第二个LED然后依次被控制点亮。
		}
	}
}

三. 实验视频

51单片机独立按键依次控制LED

感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。

相关推荐
Song几秒前
JVM 学习计划表(2025 版)
jvm·学习
神里流~霜灭2 分钟前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
一人の梅雨2 分钟前
化工网平台API接口开发实战:从接入到数据解析‌
java·开发语言·数据库
小杨爱学习zb9 分钟前
学习总结 网格划分+瞬态求解设置
笔记·学习·算法
Zfox_9 分钟前
【C++项目】从零实现RPC框架「四」:业务层实现与项目使用
linux·开发语言·c++·rpc·项目
我想吃余12 分钟前
【C++篇】类与对象(上篇):从面向过程到面向对象的跨越
开发语言·c++
LS_learner13 分钟前
小智机器人关键函数解析,Application::OutputAudio()处理音频数据的输出的函数
人工智能·嵌入式硬件
Niuguangshuo16 分钟前
Python设计模式:克隆模式
java·开发语言·python
双叶83622 分钟前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏
想睡hhh24 分钟前
c++概念——入门基础概念
开发语言·c++