上篇文章我们讲到了Keil5
与STC
的使用方式点亮第一个LED灯
这篇将继续进行一些LED灯的进阶操作
上文我们说只要通过P2这个寄存器就可以控制LED亮灭,现在我们要将其变为闪烁状态,故:
void main()
{
while(1)
{
P2 = 0xFE;
P2 = 0xFF;
}
}
但由于寄存器的速度是非常快的,达到MHz(每秒100次)的等级,就导致这两句代码执行的特别快,最后的结果就是整体变暗一点
故我们需要进行一定的延时
这里说一下我们的STC软件中有一个下图的软件延时计算器
我们可以通过设置系统频率(与你的开发板有关,我们使用的是STC89C52,用的是12MHz的频率)与定时长度,得到一段延时你目标秒数的代码,我们复制粘贴就可以使用
---------------------生成的代码-------------------
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
这段代码中_nop_的含义是
出自丿Zero
---------------------生成的代码-------------------
我们将其引用在C程序中
#include <REGX52.H>
#include <intrins.h>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2 = 0xFE;
Delay500ms();
P2 = 0xFF;
Delay500ms();
}
}
这样就可以得到一个闪烁的LED灯了
流水灯的话,让每个灯按次序亮灭就可以得到,再嵌套一个循环。
我们说到,写程序时不能写P2 = 1111 1111
这样的命令,要使用16进制,那么
我们就可以
void main()
{
while(1)
{
P2 = 0xFE;//1111 1110
Delay500ms();
P2 = 0xFD;//1111 1101
Delay500ms();
P2 = 0xFB;//1111 1011
Delay500ms();
P2 = 0xF7;//1111 0111
Delay500ms();
P2 = 0xEF;//1110 1111
Delay500ms();
P2 = 0xDF;//1101 1111
Delay500ms();
P2 = 0xBF;//1011 1111
Delay500ms();
P2 = 0x7F;//0111 1111
Delay500ms();
}
}
这样就得到一个流水灯了
我们每次进行软件延时时都去调节比较麻烦,我们可以利用C语言的基础,用传参去解决每次都要调节的问题
我们先生成一个延时1ms的子函数,对这个子函数进行传参
void Delay1ms(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
运用到程序函数中就可以得到一个可以自由控制秒数的LED等啦
#include <intrins.h>
void Delay1ms(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
while(1)
{
P2 = 0xFE;//1111 1110
Delay1ms(100);
P2 = 0xFD;//1111 1101
Delay1ms(100);
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);
}
}
欢迎讨论