大家好,我是单片机爱好者-MCU起航。这里说下使用库函数方式控制STM8S103F3P6的GPIO,扫描外部按键,然后控制LED开关。
首先看原理图,这里使用我设计的地心一号的开发板做演示:
如图所示,LED依然使用PB4控制的,按键使用PC3外接的按键。普通按键KEY电路上没有外接上拉电阻,这里使用单片机内部的上拉电阻。程序如下:
#include "stm8s.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
#define LED_GPIO_PORT (GPIOB)
#define LED_GPIO_PINS (GPIO_PIN_4)
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void main(void)
{
/* Initialize I/Os in Output Mode */
GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);
while (1)
{
/* Toggles LEDs */
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_3) == 0)
{
Delay(100);
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_3) == 0)
{
GPIO_WriteReverse(GPIOB, GPIO_PIN_4);
while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_3) == 0);
}
}
}
}
首先看宏定义,那里定义了要初始化的GPIO的组和编号,组为GPIOB,编号为GPIO_PIN_4。
首先是PC3和PB4的初始化,PC3初始化为输入、带上拉电阻、无中断模式。
GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);
PB4跟上一节有些不一样,初始化为推挽输出、管脚高电平、高速模式。
GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_MODE_OUT_PP_HIGH_FAST);
这里简单说下STM8S的GPIO支持哪些模式:
GPIO_MODE_IN_FL_NO_IT = 浮空输入,无中断
GPIO_MODE_IN_PU_NO_IT = 带上拉电阻输入,无中断
GPIO_MODE_IN_FL_IT = 浮空输入,有中断
GPIO_MODE_IN_PU_IT =带上拉电阻输入,有中断
GPIO_MODE_OUT_OD_LOW_FAST = 开漏输出,IO默认低电平,翻转速度为10MHZ高速
GPIO_MODE_OUT_PP_LOW_FAST =推挽输出,IO默认低电平,翻转速度为10MHZ高速
GPIO_MODE_OUT_OD_LOW_SLOW =开漏输出,IO默认低电平,翻转速度为2MHZ低速 GPIO_MODE_OUT_PP_LOW_SLOW =推挽输出,IO默认低电平,翻转速度为2MHZ低速
GPIO_MODE_OUT_OD_HIZ_FAST =开漏输出,高阻态,翻转速度为10MHZ高速 GPIO_MODE_OUT_PP_HIGH_FAST =推挽输出,IO默认高电平,翻转速度为10MHZ高速
GPIO_MODE_OUT_OD_HIZ_SLOW =开漏输出,高阻态,翻转速度为2MHZ低速
GPIO_MODE_OUT_PP_HIGH_SLOW =推挽输出,IO默认高电平,翻转速度为2MHZ低速
初始化的时候根据自己的需求进行选择。
while(1)里的内容也比较简单,通过函数“GPIO_ReadInputPin(GPIOC,GPIO_PIN_3)”读取PC3管脚的状态,为低电平的时候PB4的输出进行翻转。当然,读取PC3的时候,要考虑消抖的操作。
要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。