花式流水灯实现

本项目代码:

链接: https://pan.baidu.com/s/1h-vkvBnWJuqgnlYj7pVryA?pwd=jyjy 提取码: jyjy 

1.项目需求

1.通过串口下发流水灯显示顺序指令。

2.当按下按键的时候,按照三种顺序显示流水灯。

3.程序启动时,先从E2PROM中读取查看是否有流水灯顺序,有就按照E2PROM中的第一组显示指令,如果E2PROM没有流水灯的顺序,等待串口下发指令,按照收到指令中的第一条流水灯显示,将指令写入到E2PROM;流水灯正常显示的时候,如果有新的指令下发,就按照新的指令显示流水灯,并更新E2PROM中的值。

2.项目实现例子

串口发送指令:3,1#2,3#1,2

经过解析后指令存入二维数组,可看成下图2-1所示:

图2-1

通过按键按下可控制index的值,选择是哪一组指令的流水灯,假如index=0,那么流水灯会按照key3,key1的顺序亮灭。

3.项目实现思路

本项目简单来说就是通过串口发送流水灯的顺序的指令,E2PROM读取之后处理指令,实现按键选择指令控制LED灯显示。

4.项目实现过程

4.1读取并处理指令

先从E2PROM中读取指令,如果没有读取到指令,串口下发指令,下发后将指令写入E2PROM,再解析指令(解析指令的思路就是用sscanf函数直接解析),详细代码如下所示:

//2.先从E2PROM读取指令

    Inf_W24C02_ReadBytes(E2PROM_START_ADDR,buff,CMD_LEN);

    printf("读取到指令\r\n");

    //3.如果没有读取到指令,等待串口下发指令

    if(strstr((char*)buff,(char*)'#') == NULL)

    {

        //3.1等待串口下发指令

        while(!isToSend);

        isToSend = 0;

        //3.2把指令字符串写到E2PROM

        Inf_W24C02_WriteBytes(E2PROM_START_ADDR,buff,CMD_LEN);

        printf("指令下发完成\r\n");

    }

    //4.解析指令(指令可能来自E2PROM也可能来自串口),把解析出来的数字存储到二维数组中

    handleCMD();

void handleCMD(void)

{

    //3,2#2,3#3,1

    sscanf((char*)buff, "%hhu,%hhu#%hhu,%hhu#%hhu,%hhu", &cmd[0][0], &cmd[0][1], &cmd[1][0], &cmd[1][1], &cmd[2][0], &cmd[2][1]);

    for (int i = 0; i < 3; i++)

    {

        for (int j = 0; j < 2; j++)

        {

            printf("%d ", cmd[i][j]);

        }

        printf("\n");

    }

}

4.2流水灯显示

流水灯显示开始之前先将所有灯熄灭,通过二维数组的值来控制LED灯的亮灭(思路是二维数组的行index代表的是对应的指令数,按键按下可选择index的值以此控制执行指令几),详细代码如下所示:

void doledflow(void)

{

    for(uint8_t i = 0; i < 2; i++)

    {

        Driver_Led_Off(LED_1|LED_2|LED_3);

        Delay_ms(500);

        if(cmd[index][i] == 1)

        {

            Driver_Led_On(LED_1);

        }

        else if(cmd[index][i] == 2)

        {

            Driver_Led_On(LED_2);

        }

        else if(cmd[index][i] == 3)

        {

            Driver_Led_On(LED_3);

        }

        Delay_ms(500);  

    }  

}

4.3检测按键

通过按键按下改变index的值,选择显示第几条指令,详细代码如下所示:

void checkKey(void)

{

    if(isKeypressed)

    {

        isKeypressed = 0;

        index++;               //判断使用第几组流水灯

        index = index % 3;

        printf("按下按键:%d\r\n",index);

    }  

}

4.4检测串口

串口下发命令,详细代码如下所示:

void checkUsart(void)

{

    if(isToSend)

    {

        isToSend = 0;

        handleCMD();

        Inf_W24C02_WriteBytes(E2PROM_START_ADDR,buff,CMD_LEN);

        printf("下发新的命令:%s\r\n",buff);

    }

}

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,花式流水是一种比较常见的LED效,下面是基于LPC2124的实现方法: 1. 首先,需要一个计数器来控制LED的亮灭。我们可以使用LPC2124的定时器来实现。定时器的时钟源可以选择内部时钟或外部时钟,这里我们选择使用内部时钟。 2. 然后,需要一个变量来记录当前LED的状态,即亮或暗。我们可以使用一个布尔类型的变量来表示。 3. 接下来,根据花式流水的需求,需要实现多个LED的控制。这里我们可以使用LPC2124的GPIO控制器来实现。 4. 在代码中,我们可以使用一个数组来存储LED的引脚号,然后循环遍历数组,依次控制LED的亮灭。 5. 最后,我们需要在定时器中断中更新LED的状态,以达到流水的效果。 下面是一份简单的代码示例,供参考: ```c #include <LPC2124.H> #include <stdbool.h> #define LED_NUM 4 const unsigned int led_pins[LED_NUM] = { 0, 1, 2, 3 }; bool led_states[LED_NUM] = { false }; void init_timer(void) { T0CTCR = 0x0; // 使用内部时钟 T0PR = 59; // 定时器时钟频率为1MHz T0MR0 = 9999; // 定时器周期为10ms T0MCR = 0x3; // 在匹配时清零计数器,并产生中断 T0TCR = 0x1; // 启动定时器 } void init_gpio(void) { int i; for (i = 0; i < LED_NUM; i++) { FIO0DIR |= (1 << led_pins[i]); // 设置LED引脚为输出 FIO0SET |= (1 << led_pins[i]); // 初始化时关闭LED } } void update_led_states(void) { int i; for (i = 0; i < LED_NUM; i++) { if (led_states[i]) { FIO0CLR |= (1 << led_pins[i]); // 打开LED } else { FIO0SET |= (1 << led_pins[i]); // 关闭LED } } // 更新LED的状态 for (i = LED_NUM - 1; i > 0; i--) { led_states[i] = led_states[i - 1]; } led_states[0] = !led_states[0]; } void timer_isr(void) __irq { update_led_states(); T0IR = 0x1; // 清除中断标志 VICVectAddr = 0x0; // 清除中断处理完成的标志 } int main() { init_timer(); init_gpio(); VICVectAddr0 = (unsigned int)timer_isr; // 设置定时器中断处理函数 VICVectCntl0 = 0x20 | 0x4; // 使能定时器中断,并设置中断优先级 VICIntEnable = 0x10; // 使能定时器中断 while (1); return 0; } ``` 以上代码仅供参考,具体实现还需要根据实际需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值