关于爱心闪烁相框的设计思路

  制作简易心形相框,将流水灯以心形排列,利用特定程序使其按一定规律闪烁,形成闪烁相框。

以下是关于控制流水灯程序的c语言教程

 

1.数字模拟点灯

我们用八位的二进制数表示八盏灯,对应的位为0灯就亮,为1灯就灭。

流水灯的实现如下所示

11111110   //对应十六进制=0xFE,P0.0输出0,其余输出1

11111101   //对应十六进制=0xFD,P0.1输出0,其余输出1

11111011   //对应十六进制=0xFB,P0.2输出0,其余输出1

11110111   //对应十六进制=0xF7,P0.3输出0,其余输出1

11101111   //对应十六进制=0xEF,P0.4输出0,其余输出1

11011111   //对应十六进制=0xDF,P0.5输出0,其余输出1

10111111   //对应十六进制=0xBF,P0.6输出0,其余输出1

01111111   //对应十六进制=0xF7,P0.7输出0,其余输出1

......



2.流水灯代码
#include <reg52.h> 
//sbit LED2  = P0^0;  本节代码中用不到这条语句了
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
 
void delay_ms(unsigned int x)
{
    unsigned int i,j;
    if(x==1000)
    {
        for(i=0;i<19601;i++)//延时1s
        {
            for(j=5;j>0;j--);
        }
    }
    else while(x--)for(j=115;j>0;j--);
}
 
void main()
{  
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
   
    ADDR2 = 1;//**************************
    ADDR1 = 1;//让三八译码器的IO6输出低电平
    ADDR0 = 0;//**************************
   
    while(1)
    {
        P0 = 0xFE; 
        delay_ms(100);// 大概延时一段时间 
        P0 = 0xFD; 
        delay_ms(100);
        P0 = 0xFB; 
        delay_ms(100);   
        P0 = 0xF7; 
        delay_ms(100);
        P0 = 0xEF; 
        delay_ms(100);   
        P0 = 0xDF; 
        delay_ms(100);
        P0 = 0xBF; 
        delay_ms(100);   
        P0 = 0x7F; 
        delay_ms(100);
    }
}
 

3.代码优化

我们用switch语句让代码显得整齐一些,且不需要重复书写“delay_ms(100);”,实现了书写上的优化,避免占据过多版面,修改主函数如下
void main()
{  
    unsigned char i=1;//定义新的变量用来轮流调用不同的case语句
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
   
    ADDR2 = 1;//**************************
    ADDR1 = 1;//让三八译码器的IO6输出低电平
    ADDR0 = 0;//**************************
   
    while(1)
    {
        switch(i)
        {   
            case 1: P0 = 0xFE; break;
            case 2: P0 = 0xFD; break;
            case 3: P0 = 0xFB; break;   
            case 4: P0 = 0xF7; break;
            case 5: P0 = 0xEF; break;   
            case 6: P0 = 0xDF; break;
            case 7: P0 = 0xBF; break;  
            case 8: P0 = 0x7F; i=0; break;//i归0使语句又从case 1执行
        } 
        i++;//i从1变到8使switch语句轮流调用“P0 = xxxx;”
        delay_ms(100);
    }
}

posted @ 2021-10-05 16:04  A201刘明凯  阅读(337)  评论(0)    收藏  举报