stc89c52-操作LED相关代码

点亮一个LED灯

原理:查阅手册可得,stc是8位的,那么板子上LED灯对应有8个,他们都接在P2系列端口(P20-P27是LED模块)。当给相应端口设置为低电平0时,这个端口的LED才会亮起,下图点亮的是P27端口的D8灯,代码中对应设置P2=0x7F,0x代表十六进制
在这里插入图片描述

#include <REGX52.H>
//加上这个头文件可以识别出变量P2
void main()
{
	P2=0x7F;// 二进制0111 1111转换成十六进制0xFE
	//死循环让程序一直运行,持续看到灯被点亮
	while(1)
	{
		
	}
}

LED闪烁

原理:在while循环里加延时函数Delay500ms(),实现一闪一灭,间隔时长为500ms
这个Delay500ms()函数直接由stc-isp生成:选择与单片机对应的晶振频率->设置定时长度注意单位->STC89Cxx系列选择STC-Y1指令集->复制代码

在这里插入图片描述

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

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();//这个可以不要,去掉之后就不用加第二个头文件#include <INTRINS.H>
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		//D8灯会先亮然后间隔500ms后再灭...一直这样交替变化
		P2=0x7F; //0111 1111
		Delay500ms();
		P2=0xFF; //1111 1111
		Delay500ms();
	}
}

LED流水灯

原理:挨个点亮,每点亮一颗LED就时延500ms,如此循环

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

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0XFE; //1111 1110 D1灯
		Delay500ms();
		P2=0XFD; //1111 1101 D2灯
		Delay500ms();
		P2=0XFB; //1111 1011 D3灯
		Delay500ms();
		P2=0XF7; //1111 0111 D4灯
		Delay500ms();
		P2=0XEF; //1110 1111 D5灯
		Delay500ms();
		P2=0XDF; //1101 1111 D6灯
		Delay500ms();
		P2=0XBF; //1011 1111 D7灯
		Delay500ms();
		P2=0X7F; //0111 1111 D8灯
		Delay500ms();
	}
}

LED流水灯Plus控制流水速度

原理:用stc-isp生成Delay1ms()函数,再修改Delay1ms()函数,给它传入一个形参,这个形参用来表示任意想要设置的时延

#include <REGX52.H>

//给Delay1ms传入一个无符号整数xms
void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		}while (--i);
			xms--;//每循环一次减1毫秒
	}
}


void main()
{
	while(1)
	{
		P2=0XFE; //1111 1110
		Delay1ms(800);//800毫秒时延
		P2=0XFD; //1111 1101
		Delay1ms(800);
		P2=0XFB; //1111 1011
		Delay1ms(100);
		P2=0XF7; //1111 0111
		Delay1ms(100);
		P2=0XEF; //1110 1111
		Delay1ms(100);
		P2=0XDF; //1101 1111
		Delay1ms(100);
		P2=0XBF; //1011 1111
		Delay1ms(100);
		P2=0X7F; //0111 1111
		Delay1ms(100);
	}
}

独立按键控制LED亮灭

原理:当检测到独立按键P3系列端口为低电平0,就代表对应按键被人按下,让按键被按下后再进行点亮LED操作
在这里插入图片描述
在这里插入图片描述

#includ <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0)//如果按键K1别按下,P2_1端口就会变成低电平0
		{
			P2_0=0;//按下按键K1就灯D1亮
		}
		else
		{
			P2_0=1;//松开P3_1端口就恢复为高电平1,灯D1灭
		}
	}
}

独立按键控制LED亮灭带消抖

原理:当我们按下和松开按键时,会产生下沿和上沿抖动,我们可以采取在按下按键后添加20ms延时和松开按键后加20ms延时的方法来消除抖动
在这里插入图片描述

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Dalay(20);//按下按键后加20ms延时
			while(P3_1==0);//没松手之前让程序一直"停留"在这执行空语句
			Dalay(20);//松手就跳出了上一个while循环,紧接着加20ms的延时
			
			P2_0=~P2_0;//上电默认P2_0为高电平1,取反后为低电平0,所以第一次按下后灯D1会一直亮着
			//第二次按下按键时,P2_0为上次循环后的状态即低电平0,取反后为高电平1,所以第二次按下后会一直灭
			//...
		}
	}
}

独立按键控制LED以二进制显示

原理:设置一个LED操作数LEDNum,让LEDNum以转换成二进制形式自增,再取反赋给整个P2系列端口

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

unsigned char LEDNum=0;//设置LED操作数
void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			//消抖
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;//第一次按下按键后LEDNum自增1变为0000 0001
			P2=~LEDNum;//第一次按下按键后对LEDNum取反,所以P2=1111 1110,灯D8亮

			/*
			LEDNum++;//第二次按下按键后LEDNum自增1变为0000 0010
			P2=~LEDNum;//第二次按下按键后对LEDNum取反,所以P2=1111 1101,灯D7亮

			LEDNum++;//第三次按下按键后LEDNum自增1变为0000 0011
			P2=~LEDNum;//第三次按下按键后对LEDNum取反,所以P2=1111 1100,灯D7、D8亮
			如此循环下去,灯以二进制形式被点亮...
			*/
		}
	}
}

独立按键控制LED移位

原理:通过设置LED操作数LEDNum来控制0000 0001中’1’的移位,再将结果取反赋给P2系列端口,实现的功能为按下按键K1(P3_1端口)左移,按下按键K2(P3_0端口)右移

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

unsigned char LEDNum=0;//设置LED操作数
void main()
{
	P2=~0x01;//初始点亮D1灯
	while(1)
	{
		//P3_1端口控制LED从D1->D8方向亮
		if(P3_1==0)
		{
			//消抖
			Delay(20);
			while(P3_1==0);
			Delay(20);

			LEDNum++;
			if(LEDNum==8)
				LEDNum=0;
			P2=~(0x01<<LEDNum);//0000 0001 将1左移LEDNum位
		}

		//P3_0端口控制LED从D8->D1方向亮
		if(P3_0==0)
		{
			//消抖
			Delay(20);
			while(P3_0==0);
			Delay(20);
			
			LEDNum--;
			if(LEDNum==0)
				LEDNum=7;
			else
				LEDNum--;
			P2=~(0x01<<LEDNum);//0000 0001 将1右移上一个LEDNum-1位
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值