STM8S自学笔记-003 GPIO输出:点亮LED灯 and 跑马灯特效

  • 点亮LED
    • GPIO初始化函数:GPIO_Init()
    • GPIO电平操作库函数:GPIO_WriteHigh()、GPIO_WriteLow()、GPIO_WriteReverse()
    • LED控制代码
  • 跑马灯
    • 跑马灯原理
    • 跑马灯代码

【修订记录】
1、20181226,第一版
2、20210315,错别字修正,简化文字表述
3、20210321,错误修正
4、20210808,将应用层代码与底层代码分离,增加目录

点亮LED

点亮一个LED灯,应该是大多数单片机教程的第一步。这是最简单的一步。

GPIO初始化函数:GPIO_Init()

通常,要对LED所在的单片机的LED引脚 Px(y) 进行:
模式设置
①输出模式
②哪一种输出方式)
电平设置
③高/低电平

才能够点亮LED。看上去,至少也要三个语句,方能实现对LED的控制;但是,在STM8S中,只要一个句子就可以实现!

  //假设该LED是灌电流方式GPIO_Init( GPIOC , GPIO_PIN_3 , GPIO_MODE_OUT_PP_LOW_SLOW );

来分析上面的句子:

  • 它调用了库函数stm8s_gpio.c中的GPIO初始化函数-GPIO_Init(),该函数可将指定的引脚配置为你想要的状态。函数的入口有三个参数:GPIOx, GPIO_Pin, GPIO_Mode

  • GPIOx:GPIO分组

  • GPIO_Pin:PIN编号

  • GPIO_Mode:模式配置,包含引脚模式、速度、电平、中断

    短短一句话完成了所有的设置,言简意赅。

GPIO电平操作库函数:GPIO_WriteHigh()、GPIO_WriteLow()、GPIO_WriteReverse()

如果要在点亮LED之后熄灭它呢,你可以写成:

 GPIO_Init( GPIOC , GPIO_PIN_3 , GPIO_MODE_OUT_PP_HIGH_SLOW );

这样做,的确是熄灭了LED,但在改变IO电平的同时还把IO再次执行了初始化,后者是无用的,还浪费CPU程序资源。
我们需要新的办法,来加快只改变输出电平的操作。而库函数里也的确有这样的函数:

 GPIO_WriteHigh( GPIOC , GPIO_PIN_3 );       //PC3输出高电平GPIO_WriteLow( GPIOC , GPIO_PIN_3 );      //PC3输出低电平GPIO_WriteReverse( GPIOC ,GPIO_PIN_3 );       //PC3输出电平取反

进入倒函数内部,你会发现这三个函数只操作了GPIOC->ODR(输出寄存器)。

LED控制代码

在《STM8S自学笔记-002 STM8初上手和开发环境的建立》中,我有介绍自己用的开发板。上面有三个LED灯,从左到右依次接在PC3,PC4和PD2上。我用宏定义给他们编了号,方便后续的开发,包含Drv_GPIO.cDrv_GPIO.h

新建源文件【Drv _GPIO.c】

/********************************************************************************* @file    Drv_GPIO.c* @author  Elsa* @version V1.0.0* @date    7-August-2021* @brief   *******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "Drv_GPIO.h"/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/*** @brief  Initializes the LEDx according to the specified parameters.* @param  LED_MAP : This parameter contains the pin number* @retval None*/
void LED_Init(uint8_t LED_MAP)
{if (LED_MAP & LED1) GPIO_Init(LED1_GPIO, LED1_GPIO_PIN, GPIO_MODE_OUT_PP_LOW_SLOW);    //LED1 ONif (LED_MAP & LED2) GPIO_Init(LED2_GPIO, LED2_GPIO_PIN, GPIO_MODE_OUT_PP_LOW_SLOW);    //LED2 ONif (LED_MAP & LED3) GPIO_Init(LED3_GPIO, LED3_GPIO_PIN, GPIO_MODE_OUT_PP_LOW_SLOW);    //LED3 ON
}/*** @brief  Light on the specified LEDs.* @param  LED_MAP : This parameter contains the pin number* @retval None*/
void LED_On(uint8_t LED_MAP)
{if (LED_MAP & LED1) GPIO_WriteLow(LED1_GPIO, LED1_GPIO_PIN);if (LED_MAP & LED2) GPIO_WriteLow(LED2_GPIO, LED2_GPIO_PIN);if (LED_MAP & LED3) GPIO_WriteLow(LED3_GPIO, LED3_GPIO_PIN);
}/*** @brief  Light off the specified LEDs.* @param  LED_MAP : This parameter contains the pin number* @retval None*/
void LED_Off(uint8_t LED_MAP)
{if (LED_MAP & LED1) GPIO_WriteHigh(LED1_GPIO, LED1_GPIO_PIN);if (LED_MAP & LED2) GPIO_WriteHigh(LED2_GPIO, LED2_GPIO_PIN);if (LED_MAP & LED3) GPIO_WriteHigh(LED3_GPIO, LED3_GPIO_PIN);
}/*** @brief  Blink the specified LEDs.* @param  LED_MAP : This parameter contains the pin number* @retval None*/
void LED_Reverse(uint8_t LED_MAP)
{if (LED_MAP & LED1) GPIO_WriteReverse(LED1_GPIO, LED1_GPIO_PIN);if (LED_MAP & LED2) GPIO_WriteReverse(LED2_GPIO, LED2_GPIO_PIN);if (LED_MAP & LED3) GPIO_WriteReverse(LED3_GPIO, LED3_GPIO_PIN);
}/*** @brief  Control the specified LEDs.* @param  LED_MAP : This parameter contains the pin number* @retval None*/
void LED_Control(uint8_t LED_MAP)
{if (LED_MAP & LED1) GPIO_WriteLow(LED1_GPIO, LED1_GPIO_PIN);else                GPIO_WriteHigh(LED1_GPIO, LED1_GPIO_PIN);if (LED_MAP & LED2) GPIO_WriteLow(LED2_GPIO, LED2_GPIO_PIN);else                GPIO_WriteHigh(LED2_GPIO, LED2_GPIO_PIN);if (LED_MAP & LED3) GPIO_WriteLow(LED3_GPIO, LED3_GPIO_PIN);else                GPIO_WriteHigh(LED3_GPIO, LED3_GPIO_PIN);
}

新建头文件【Drv _GPIO.h】

/********************************************************************************* @file    Drv_GPIO.h* @author  ANNA* @version V1.0.0* @date    03-August-2021* @brief   This file contains the headers of the Drv_GPIO.c*******************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DRV_GPIO_H
#define __DRV_GPIO_H/* Includes ------------------------------------------------------------------*/
#include "main.h"/* Exported types ------------------------------------------------------------*/
/* Exported defines ----------------------------------------------------------*/
//Maps of LEDx
#define LED(n)  ((uint8_t)(0x01<<(uint8_t)(n-1)))
#define LED1    LED(1)
#define LED2    LED(2)
#define LED3    LED(3)
//GPIO Definition of LEDx
#define LED1_GPIO_PIN     GPIO_PIN_3
#define LED2_GPIO_PIN     GPIO_PIN_4
#define LED3_GPIO_PIN     GPIO_PIN_2
#define LED1_GPIO         GPIOC
#define LED2_GPIO         GPIOC
#define LED3_GPIO         GPIOD/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported function prototypes ----------------------------------------------*/
void LED_Init(uint8_t LED_MAP);
void LED_On(uint8_t LED_MAP);
void LED_Off(uint8_t LED_MAP);
void LED_Reverse(uint8_t LED_MAP);
void LED_Control(uint8_t LED_MAP);#endif

跑马灯

跑马灯原理

其实跑马灯真么什么好说的。想实现这个效果,你至少要有三个LED,而且它们在物理上要排成一行,这样看的才明显。
实现的原理也很简单:

  1. 只开第一个LED;
  2. 只开第二个LED;
  3. 只开第三个LED;
  4. 返回1 。
    为了方便肉眼观察,还需要在1、2、3步的尾部各追加一个延时函数。
    简单的延时函数如下:
#define Delay(n) while(n--)

跑马灯代码

源文件【main.c】的内容

/********************************************************************************* @file    main.c* @author  Annakin* @version V1.0.0* @date    21-March-2018* @brief*******************************************************************************//* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define Delay(n)    while(n--)/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void Easy_Delay(void);
/* Private functions ---------------------------------------------------------*/
/*** @brief  Main program.* @param  None* @retval None*/
void main(void)
{LED_Init(LED1 | LED2 | LED3);while (1){LED_Control(LED1);Easy_Delay();LED_Control(LED2);Easy_Delay();LED_Control(LED3);Easy_Delay();}
}void Easy_Delay(void)
{uint16_t i = 60000;Delay(i);
}#ifdef USE_FULL_ASSERT/*** @brief  Reports the name of the source file and the source line number*   where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval : None*/
void assert_failed(u8* file, u32 line)
{/* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}
}
#endif
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

源文件【main.h】的内容

#ifndef __MAIN_H
#define __MAIN_H/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "stm8s_it.h"
#include "Drv_GPIO.h"/* Exported types ------------------------------------------------------------*/
/* Exported defines ----------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported function prototypes ----------------------------------------------*/#endif
/***************************************************************END OF FILE****/

更完备的延时函数,它们和时钟系统有关系,让我们一起期待《STM8S自学笔记-004 时钟》和《STM8S自学笔记-005 精准延时》。

STM8S自学笔记-003 GPIO输出:点亮LED灯 and 跑马灯特效相关推荐

  1. STM32笔记2-使用库函数点亮LED灯

    目录 一.硬件电路设计 二.软件设计 1.工程配置 2.程序编写 (1)led头文件 (2)Led_Init()函数编写 三.实验测试 四.使用宏定义 1.修改后的led.h中程序 2.修改后的Led ...

  2. STM8S自学笔记之利用库函数点亮一个LED

    准备工作及前提 a.已安装IAR或者STVD b.下载标准固件库(StdPeriph_Lib_V2.1.0)备用; c.已建立好一个程序模板,如未建立请参考我的博客中的帖子STVD+STM8官方固件库 ...

  3. python控制树莓派led_Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  4. python控制灯_Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  5. python控制树莓派gpioled,Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  6. java gpio_单片机基础——使用GPIO输出点亮一个LED灯

    1. 准备工作 硬件准备 开发板 首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接. 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码,可参考MDK安装教程 ...

  7. STM8学习笔记---点亮LED灯

    对单片机操作时一般有三个步骤,1.系统时钟选择.2.单片机外设初始化.3主程序编写. 同样要点亮LED灯时,也要按照这个步骤来. 首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器 可以看到 ...

  8. 【STM32学习笔记-点亮LED灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...

  9. DSP(TMSF280049C)学习笔记2:点亮LED灯

    DSP(TMSF280049C)学习笔记2:点亮LED灯 实验目的:点亮Texas InstrumentsTMSF280049C开发板,LED0与GPIO23相连,下载到FLASH,具体代码如下: # ...

最新文章

  1. MDNICE使得你只需要关注内容
  2. 什么是restful风格?
  3. python绘制简单直方图-python plotly绘制直方图实例详解
  4. STL Vector使用例程
  5. You can't specify target table 'tablename' for update in FROM clause的解决方法
  6. 使用RemObjects Pascal Script
  7. 问题一:CodeBlocks环境搭建及创建第一个C++程序
  8. 十大算法 — 冒泡排序法【C语言代码诠释】
  9. (计算圓柱体的体积)编写程序,读入圆柱体的半径和高,并使用下列公式计算圆柱的体积
  10. Spring 之 @Transaction 详解
  11. Java最新面试题汇总
  12. Redis原理浅析(一):Redis基本数据类型、事务以及排序
  13. 剪映+json解析将视频中的声音转换成文本
  14. 张小龙-年薪近3亿的微信之父,他是如何做到的?
  15. 图形2d,3d加速简介
  16. css textarea行数_超级简单:在一个TextArea中如何限制行数和字符数
  17. 矩阵特征分解(svd)介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)
  18. GOM 登录器源码及编译教程
  19. POSTGRESQL按拼音排序
  20. 教师计算机桌面文件乱图片,调皮学生恶作剧,把老师的电脑壁纸换了,老师打开一看懵圈了...

热门文章

  1. My Heart Will Go On--Art from Life
  2. 【软件体系结构】考点总结 第四章 软件体系结构描述 XJU
  3. 洛谷 1346 电车
  4. 安卓系统使用adb解锁手机及设置休眠时长
  5. php小蛋白奶粉有哪些牌子,部分水解蛋白奶粉有哪些
  6. 5款Java性能分析工具的对比
  7. linux获取夏令时时间,关于时区:获取C中时区的夏令时转换日期
  8. Linux 远程访问及控制 OpenSSH 服务
  9. 【开发者文库】批量上传工具上线了,欢迎来“尝鲜”~
  10. 矿大计算机学院周裕浩,计算机学院学子在第45届ACM-ICPC亚洲区决赛获佳绩