上篇文章我们讲到了Keil5
与STC
的使用方式点亮第一个LED灯
这篇将继续进行一些LED灯的进阶操作
目录
- LED灯闪烁:
- LED流水灯
- 普通LED流水灯
- LED流水灯PLUS
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灯了
LED流水灯
普通LED流水灯
流水灯的话,让每个灯按次序亮灭就可以得到,再嵌套一个循环。
我们说到,写程序时不能写P2 = 1111 1111
这样的命令,要使用16进制,那么
我们就可以
void main()
{while(1){P2 = 0xFE;//1111 1110Delay500ms();P2 = 0xFD;//1111 1101Delay500ms();P2 = 0xFB;//1111 1011Delay500ms();P2 = 0xF7;//1111 0111Delay500ms();P2 = 0xEF;//1110 1111Delay500ms();P2 = 0xDF;//1101 1111Delay500ms();P2 = 0xBF;//1011 1111Delay500ms();P2 = 0x7F;//0111 1111Delay500ms();}
}
这样就得到一个流水灯了
LED流水灯PLUS
我们每次进行软件延时时都去调节比较麻烦,我们可以利用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 1110Delay1ms(100);P2 = 0xFD;//1111 1101Delay1ms(100);P2 = 0xFB;//1111 1011Delay1ms(100);P2 = 0xF7;//1111 0111Delay1ms(100);P2 = 0xEF;//1110 1111Delay1ms(100);P2 = 0xDF;//1101 1111Delay1ms(100);P2 = 0xBF;//1011 1111Delay1ms(100);P2 = 0x7F;//0111 1111Delay1ms(100);}
}
欢迎讨论