【WCH蓝牙系列芯片】-基于CH582开发板按键控制LED灯

发布时间 2023-08-07 20:12:11作者: zyl4444

---------------------------------------------------------------------------------------------------------------------------------------

本文主要介绍CH582的GPIO的基础外设的使用,并且利用GPIO外设点亮LED灯和按键扫描功能。将两者结合,实现按键控制LED灯的状态。
<控制LED灯-硬件电路设计>
从沁恒官网中可以下载CH582开发板的原理图PDF版本,下载网址:https://www.wch.cn/downloads/CH583EVT_ZIP.html,

在下载的CH583EVT文件中,打开PUB>CH583SCH,在原理图中可以找到开发板上已焊接两个LED灯分别对应LED1和LED2,如图所示。

从图中可以看出,LED灯串接一个IK限流电阻,LED正极接电源3.3V,另一端接网络端口标识LED1、LED2。只需要当LED1和LED2引脚端口输出一个低电平,可以导通LED灯,使其点亮。在此实验中,采用自己焊接的LED硬件电路,如图所示。

<控制LED灯-软件程序设计>

在程序设计中,先配置系统时钟源和时钟频率,再初始化LED对应连接IO端口(PA0、PA4、PA6),设置引脚为推挽输出最大5mA模式。这样可以通过设置IO端口的高低电平控制LED状态,也可实现LED流水灯的效果。LED.C函数如下。

#include "CH58x_common.h"

void LED_Init(void)
{
   SetSysClock(CLK_SOURCE_PLL_60MHz);  //配置系统时钟源和时钟频率

   //初始化GPIO口
   GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);  ////推挽输出最大5mA
   GPIOA_ModeCfg(GPIO_Pin_6, GPIO_ModeOut_PP_5mA);
   GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA);
}
//LED亮
void LED1_ON(void)
{
    GPIOA_ResetBits(GPIO_Pin_4); //PA4置低电平

}
//LED灭
void LED1_OFF(void)
{
    GPIOA_SetBits(GPIO_Pin_4); //PA4置高电平
}

//LED1翻转
void LED1_Turn(void)
{
    if (GPIOA_ReadPortPin(GPIO_Pin_4) == 0)  //读取PA4端口是否为低电平
    {
        GPIOA_SetBits(GPIO_Pin_4); //PA4置高电平
    }
    else
    {
        GPIOA_ResetBits(GPIO_Pin_4); //PA4置低电平
    }

}


void LED2_ON(void)
{
    GPIOA_ResetBits(GPIO_Pin_6); //PA6置低电平
}

void LED3_ON(void)
{
    GPIOA_ResetBits(GPIO_Pin_0); //PA0置低电平
}




void LED2_OFF(void)
{
    GPIOA_SetBits(GPIO_Pin_6); //PA6置高电平
}

void LED3_OFF(void)
{
    GPIOA_SetBits(GPIO_Pin_0); //PA0置高电平
}



//LED2翻转
void LED2_Turn(void)
{
    if (GPIOA_ReadPortPin(GPIO_Pin_6) == 0)
    {
        GPIOA_SetBits(GPIO_Pin_6); //PA6置高电平
    }
    else
    {
        GPIOA_ResetBits(GPIO_Pin_6); //PA6置低电平
    }

}

//LED3翻转
void LED3_Turn(void)
{
    if (GPIOA_ReadPortPin(GPIO_Pin_0) == 0)
    {
        GPIOA_SetBits(GPIO_Pin_0); //PA0置高电平
    }
    else
    {
        GPIOA_ResetBits(GPIO_Pin_0); //PA0置低电平
    }

}

//LED流水灯
void LED_RUN(void)
{
 GPIOA_ResetBits(GPIO_Pin_4);
 GPIOA_SetBits(GPIO_Pin_6);
 GPIOA_SetBits(GPIO_Pin_0);
 DelayMs(500);

 GPIOA_ResetBits(GPIO_Pin_6);
 GPIOA_SetBits(GPIO_Pin_0);
 GPIOA_SetBits(GPIO_Pin_4);
 DelayMs(500);

 GPIOA_ResetBits(GPIO_Pin_0);
 GPIOA_SetBits(GPIO_Pin_6);
 GPIOA_SetBits(GPIO_Pin_4);
 DelayMs(500);
}

void LED_shan(void)
{
    GPIOA_ResetBits(GPIO_Pin_4);
    GPIOA_ResetBits(GPIO_Pin_6);
    GPIOA_ResetBits(GPIO_Pin_0);
    DelayMs(500);

    GPIOA_SetBits(GPIO_Pin_0);
    GPIOA_SetBits(GPIO_Pin_6);
    GPIOA_SetBits(GPIO_Pin_4);
    DelayMs(500);

}