查看: 3101|回复: 0

[分享] 【LPC11U68】三色彩灯的实现

[复制链接]
  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    连续签到: 1 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7125
    最后登录
    2023-4-20
    发表于 2018-11-17 14:58:18 | 显示全部楼层 |阅读模式
    本帖最后由 jinglixixi 于 2018-11-17 15:00 编辑

           前面一直受困于无法更新调试固件,经多次摸索终于搞定了。似乎在Win7专业版上较困难,而在Win7旗舰版上较好使。更新完调试固件,就可以回到原开发环境使用了。
          在开发板上板载了三色LED,通过编程可实现3色彩灯效果(见图1),其主程序如下:
    1. int main(void)
    2. {
    3.    SystemCoreClockUpdate();
    4.    Board_Init();
    5.    Board_LED_Set(0,0);//灭
    6.    Board_LED_Set(1,0);//灭
    7.    Board_LED_Set(2,0);//灭
    8.    while(1)
    9.    {
    10.        Board_LED_Set(0,1);//亮
    11.        delay(10000);
    12.        Board_LED_Set(0,0);//灭
    13.        delay(10000);
    14.        Board_LED_Set(1,1);//亮
    15.        delay(10000);
    16.        Board_LED_Set(1,0);//灭
    17.        delay(10000);
    18.        Board_LED_Set(2,1);//亮
    19.        delay(10000);
    20.        Board_LED_Set(2,0);//灭
    21.        delay(10000);
    22.    }
    23.        return0;
    24. }
    复制代码

    1.jpg
    图1  彩灯效果

          那么为什么单用一个Board_LED_Set()函数就可以轻松地实现呢?
          原来在board.c中已定义好了函数Board_LED_Init()和Board_LED_Set(),而对函数Board_LED_Init()的调用是在函数Board_Init()中。
    Board_Init函数的内容为:
    void Board_Init(void)
    {
        /* Sets upDEBUG UART */
        DEBUGINIT();
        /* InitializeGPIO */
        Chip_GPIO_Init(LPC_GPIO);
        /* InitializeLEDs */
        Board_LED_Init();
    }
        那函数Board_LED_Init()和Board_LED_Set()有是如何写的呢?其内容如下:
    static void Board_LED_Init(void)
    {
        int idx;
        for (idx = 0;idx < MAXLEDS; idx++) {
           /* Set theGPIO as output with initial state off (high) */
           Chip_GPIO_SetPinDIROutput(LPC_GPIO,ledports[idx], ledpins[idx]);
           Chip_GPIO_SetPinState(LPC_GPIO,ledports[idx], ledpins[idx], true);
        }
    }

    /* Sets the state of a board LED to on or off */
    void Board_LED_Set(uint8_t LEDNumber, bool On)
    {
        if (LEDNumber< MAXLEDS) {
           /* Togglestate, low is on, high is off */
           Chip_GPIO_SetPinState(LPC_GPIO,ledports[LEDNumber], ledpins[LEDNumber],!On);
        }
    }

           结合彩灯原理图和相关的定义就可以明白,它其实就是将相应的引脚设为输出口,然后再控制其输出高低电平而已。
    #define MAXLEDS 3
    static const uint8_t ledports[MAXLEDS] = {2, 2, 2};
    static const uint8_t ledpins[MAXLEDS] = {17, 16, 18};
    2.jpg
    图2 彩灯原理图

           其实我们完全可以用以下的语句来实现,即:
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 2, 16);
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 2, 17);
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 2, 18);

    Chip_GPIO_SetPinState(LPC_GPIO, 2, 16, 0);//绿亮
    Chip_GPIO_SetPinState(LPC_GPIO, 2, 16, 1);//绿灭
    Chip_GPIO_SetPinState(LPC_GPIO, 2, 17, 0);//红亮
    Chip_GPIO_SetPinState(LPC_GPIO, 2, 17, 1);//红灭
    Chip_GPIO_SetPinState(LPC_GPIO, 2, 18, 0);//蓝亮
    Chip_GPIO_SetPinState(LPC_GPIO,2, 18, 1);//蓝灭
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-31 06:33 , Processed in 0.082682 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表