硬件编程精粹·玩转LED·花样流水灯

【任务】51单片机的P0和P2口分别控制8个LED,试编写程序使这些LED按预定的花样显示。

【硬件平台】端口控制线采用总线画法,每个LED工作电压为2V,工作电流为3mA,限流电阻值为1k。

【编程思路】

依然采用51单片机来实现花样流水灯功能,必须包含51单片机寄存器的头文件,才可使用其软硬件资源:

1 #include <reg51.h>

为使代码编写简略,引入下面的两个“类型简写”宏定义:

2 #define uchar unsigned char

3 #define uint unsigned int

P0、P2端口对应的花样数据很多,占用的空间较大。我们可以建立两个数组,将它们的存储类型定义为code(存储在ROM区):

4 uchar code Pattern_P0[ ] =

5 {

6 0xFC,0xF8,0xFC,0xFE,0xFC,0xF8,0x1C,0xF8,0xFC,0xF5,0x1C,0xE8,

7 ............(省略列写,着重说明编程思想)

8 };

9 uchar code Pattern_P2[ ] =

10 {

11 0xF1,0xFE,03C,0xEE,0xFC,0xC8,0x1F,0xF5,0xAC,0xC5,0x1C,0xE6,

12 ............(省略列写,着重说明编程思想)

13 };

要产生流水效果,必须使灯的亮灭即跳转有时间间隔,因此要编写一个延时函数以便调用(具体延时可通过修改函数的实参来确定),可通过内外循环之积来延时:

14 void delay(uint x)

15 {

16 uchar i; //定义内循环变量

17 while(x--) //x次外循环

18 {

19 for(i=0;i<200;i++); //200次内循环空操作(不一定固定200,可根据具体情况变更)

20 }

21 }

最后编写主程序(程序从此入口执行):

22 void main()

23 {

24 uchar i;//定义数组元素下标变量,方便取数组元素赋值给P0或P2端口

25 for(i=0;i<100;i++) //假定前面定义的两个数组各有100个元素(花样)

26 {

27 P0=Pattern_P0[i]; //P0口灯以数组Pattern_P0的第i+1个花样点亮

28 P2=Pattern_P2[i]; //P2口灯以数组Pattern_P2的第i+1个花样点亮

29 delay(100); //延时一会儿再跳转到下一个花样,如此循环往复按照100个花样流水显示

30 }

31 }

【程序展示】


原文链接:,转发请注明来源!