单片机零基础入门(6):独立按键控制LED移位


一、需求如下:

独立按键控制LED移位:
通过两个独立按键控制LED移位
-------需求------
1、按下按键1时,LED逐个往后移动;
1、按下按键2时,LED逐个往前移动;


二、需求分析:

-------分析-------
1、往后移动–>按下第一次时,LED1亮,其他灭;按下第二次时,LED2亮,其他灭;以此类推;
2、往前移动–>按下第一次时,前一次亮的LED(LED5)灭,前面一个LED(LED4)亮,以此类推。


三、源代码实现:

#include <REGX52.H>
#include <INTRINS.H>

/*独立按键控制LED状态
-----需求
1、独立按键控制LED移位
*/

void Delay(unsigned int xms)
{
	while(xms)
	{
		unsigned char i,j;
		i = 2;
		j = 249;
		do
		{
			while(--j);	
		}
		while(--i);
		xms--;
	}
}

unsigned char LEDnum;
int main()
{	
	P2 = ~0X01;
	while(1)
	{
		if(P3_1 == 0) //按键1按下
		{
			//消抖
			Delay(20);
			//检查按键是否松开
			while(P3_1 ==0);
			Delay(20);
			LEDnum++;
			if(LEDnum>=8) //判断是否溢出
				LEDnum = 0;
			P2 = ~(0X01<<LEDnum);
		}
		if(P3_0 == 0) //按键1按下
		{
			//消抖
			Delay(20);
			//检查按键是否松开
			while(P3_0 ==0);
			Delay(20);
			
			
			if(LEDnum==0) //判断是否溢出
				LEDnum = 7;
			else
			LEDnum--;	

			P2 = ~(0X01<<LEDnum);
		}
	}
}

四、原理图:

1、独立按键和单片机核心原理图:

在这里插入图片描述

2、LED模块原理图:

在这里插入图片描述


五、解释

1、分析解释:

(1)通过原理图可得出:独立按键1为:P3_1。按下为0,松开为1。P3_1 == 0即按下。
按键1按下时,LED灯第1个点亮,其他熄灭。然后再按下时,亮第二个,依次下去,故:P3_1 == 0条件下,P2 = ~0X01,LEDnum++;
(2)通过原理图可得出:独立按键2为:P3_0。按下为0,松开为1。P3_0 == 0即按下。
按键1按下时,LED灯第1个点亮,其他熄灭。然后再按下时,亮前一个,依次下去,故:P3_0 == 0条件下,P2 = ~0X01,LEDnum–;与(1)相反既可。


2、代码解释:

(1)void Delay(unsigned int xms) —>延时函数。
(2)P2 = ~0x01 —>按位取反。
十六进制:0x01-----转化为二进制—>0000 0001
0000 0001前面的文章中有写到点亮为0,熄灭为1.(原因:灯亮是因为两侧有电压差,当LED的正极接到VCC,负极接到单片机的P1.0上,当单片机的P1.0为高电平时,此时LED两端电压一样,电流不会流动,LED不会亮,只有当P1.0为低电平是,电流才会从VCC经过LED流向P1.0,再进过单片机内部形成回路,LED就会亮了,反之一样,当LED负极接GND,正极接P1.0,当P1.0置高电平时,LED也会亮,置于低电平时,LED不会亮。
注意,很多人都容易把按位取反搞错了。
0x01—>0000 0001按位取反得出:1111 1110。故点亮1个LED灯,其他熄灭。

(3)LEDnum++ —> 往下移动一个LED灯。LEDnum–与之相反。
(4)LEDnum>=8和LEDnum0 都是判断按键是否溢出。LEDnum0 如果溢出等于0时,赋值7,返回第7个(LED为0-7)。
(5)P2 = ~(0x01<<LEDnum); —>点亮的灯依次往下执行。


-----------------人生在勤,不索何获!-------------

  • 17
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
单片机独立按键控制LED灯程序在Proteus中的实现步骤如下: 1. 准备工作:打开Proteus软件,并创建一个新的工程。 2. 选择单片机模型:在组件库中选择一个合适的单片机模型,如ATmega16。将其拖放到工作区中。 3. 添加元器件:从元器件库中选择一个LED模型,并将其拖放到工作区中。 4. 连接电路:连接单片机LED灯,将LED的正极连接到单片机的I/O口,将LED的负极连接到单片机的地(GND)引脚。 现在开始编写程序部分: 5. 点击单片机模型,并找到其属性窗口。在属性窗口中找到仿真选项,并将仿真速度设置为合适的数值,如10kHz。 6. 双击单片机模型进入代码编辑器,开始编写C语言程序。 7. 编写主函数:在程序的入口处定义主函数,如int main()。 8. 初始化引脚:使用端口初始化函数将单片机I/O口设置为输出或输入模式。例如,使用DDRx寄存器将引脚设置为输出模式。 9. 设定按键检测循环:使用while循环不断检测按键状态。 10. 检测按键:使用条件判断语句检测按键是否被按下。例如,使用if语句判断按键引脚的状态是否为低电平。 11. 控制LED亮灭:根据按键状态,在条件判断语句中控制LED灯的亮灭。例如,使用PORTx寄存器将引脚输出电平设置为高或低。 12. 结束程序:使用return语句结束程序的执行。 在代码编辑器中编写完程序后,保存并编译程序。然后回到Proteus主界面,添加一个仿真器,如AVR仿真器。点击仿真按钮启动仿真。 通过以上步骤,我们可以在Proteus中实现单片机独立按键控制LED灯的程序。在仿真中,可以通过按下按键来控制LED灯的亮灭状态。这样可以在仿真环境中验证和调试程序,确保其正常工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡先森ia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值