【任务】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 }
【程序展示】