单片机学习笔记---独立按键控制LED显示二进制

这节我们来实现独立按键的第三个功能,独立按键控制LED显示二进制

新创建一个工程文件,然后上来我们就要把基本框架写好,这是基本的习惯

单片机学习笔记---独立按键控制LED显示二进制_第1张图片

老规矩,然后把Delay 1ms的代码复制过来

单片机学习笔记---独立按键控制LED显示二进制_第2张图片

复制过来后改造一下:

把1ms删掉,然后给Delay函数传个参数unsigned int xms

把延时1ms的那段代码移到一个while(xms--)里面

单片机学习笔记---独立按键控制LED显示二进制_第3张图片

Delay函数定义后之后,先写程序点亮测试一下

单片机学习笔记---独立按键控制LED显示二进制_第4张图片

编译无错误下载程序,重启板子看看效果

点亮

单片机学习笔记---独立按键控制LED显示二进制_第5张图片

延时500ms

灭掉

单片机学习笔记---独立按键控制LED显示二进制_第6张图片

延时500ms

此时它正在以1秒为周期闪烁,证明程序写的没错

把测试程序的这段代码删掉

单片机学习笔记---独立按键控制LED显示二进制_第7张图片

换成上一节的按键判断程序

单片机学习笔记---独立按键控制LED显示二进制_第8张图片

这节主要讲解状态取反的新形式

上一节我们只是对P2的0口取反(P2_0=~P2_0)

那如果我们想要对P2的8个口都取反怎么办?

我们要引入一个变量,变量名为LEDnum,类型是unsigned char(因为char类型占1个字节,8个比特位,刚好等于寄存器的一组,寄存器以8个为一组)

我们可以先让LEDnum++然后再让它取反,赋值给P2的8个口

代码如下:

单片机学习笔记---独立按键控制LED显示二进制_第9张图片

代码逻辑如下:

LEDnum原本是0,即0000 0000

第一次循环后:

LEDnum++;//0000 0001

~LEDnum;//1111 1110 (D1亮)

第二次循环后:

LEDnum++;//0000 0010

~LEDnum;//1111 1101 (D2亮)

第三次循环后:

LEDnum++;//0000 0011

~LEDnum;//1111 1100 (D1,D2亮)

第四次循环后:

LEDnum++;//0000 0100

~LEDnum;//1111 1011

第五次循环后:

LEDnum++;//0000 0101

~LEDnum;//1111 1010

第六次循环后:

LEDnum++;//0000 0110

~LEDnum;//1111 1001

第七次循环后:

LEDnum++;//0000 0111

~LEDnum;//1111 1000

第八次循环后:

LEDnum++;//0000 1000

~LEDnum;//1111 0111

第九次循环后:

LEDnum++;//0000 1001

~LEDnum;//1111 0110

第十次循环后:

LEDnum++;//0000 1010

~LEDnum;//1111 0101

第十一次循环后:

LEDnum++;//0000 1011

~LEDnum;//1111 0100

第十二次循环后:

LEDnum++;//0000 1100

~LEDnum;//1111 0011

第十三次循环后:

LEDnum++;//0000 1101

~LEDnum;//1111 0010

第十四次循环后:

LEDnum++;//0000 1110

~LEDnum;//1111 0001

第十五次循环后:

LEDnum++;//0000 1111

~LEDnum;//1111 0000

第十六次循环后:

LEDnum++;//0001 0000

~LEDnum;//1110 1111

第十七次循环后:

LEDnum++;//0001 0001

~LEDnum;//1110 1110

第十八次循环后:

LEDnum++;//0001 0010

~LEDnum;//1110 1101 

......

第255次循环后:

LEDnum++;//1111 1111

~LEDnum;//0000 0000 (全灭)

完整代码如下

单片机学习笔记---独立按键控制LED显示二进制_第10张图片

单片机学习笔记---独立按键控制LED显示二进制_第11张图片

#include 

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)//后置--操作完之后给xms减1
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	unsigned char LEDnum=0;//0000 0000
	while(1)
	{
		if(P3_1==0)
		{
			//按键判断
			Delay(20);//按下要消抖
			while(P3_1==0);//判断是否松手,松手变成==1
			Delay(20);//松开要消抖
			
			//状态取反
			LEDnum++;//0000 0001
			P2=~LEDnum;//1111 1110
	}
}

编译无错误下载查看效果

按第一次,D1亮

单片机学习笔记---独立按键控制LED显示二进制_第12张图片

按第二次,D2亮

单片机学习笔记---独立按键控制LED显示二进制_第13张图片

按第二次,D1,D2亮

单片机学习笔记---独立按键控制LED显示二进制_第14张图片

......

按第254次时才是全亮

单片机学习笔记---独立按键控制LED显示二进制_第15张图片

按第255次时全灭

单片机学习笔记---独立按键控制LED显示二进制_第16张图片

按256次之后开启第二轮循环

单片机学习笔记---独立按键控制LED显示二进制_第17张图片

以上就是这节要实现的效果!

你可能感兴趣的:(51单片机学习笔记,单片机,学习,笔记)