STM8S自学笔记-003 GPIO输出:点亮LED灯 and 跑马灯特效
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.c和Drv_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,而且它们在物理上要排成一行,这样看的才明显。
实现的原理也很简单:
- 只开第一个LED;
- 只开第二个LED;
- 只开第三个LED;
- 返回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 跑马灯特效相关推荐
- STM32笔记2-使用库函数点亮LED灯
目录 一.硬件电路设计 二.软件设计 1.工程配置 2.程序编写 (1)led头文件 (2)Led_Init()函数编写 三.实验测试 四.使用宏定义 1.修改后的led.h中程序 2.修改后的Led ...
- STM8S自学笔记之利用库函数点亮一个LED
准备工作及前提 a.已安装IAR或者STVD b.下载标准固件库(StdPeriph_Lib_V2.1.0)备用; c.已建立好一个程序模板,如未建立请参考我的博客中的帖子STVD+STM8官方固件库 ...
- python控制树莓派led_Python 控制树莓派 GPIO 输出:控制 LED 灯
树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...
- python控制灯_Python 控制树莓派 GPIO 输出:控制 LED 灯
树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...
- python控制树莓派gpioled,Python 控制树莓派 GPIO 输出:控制 LED 灯
树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...
- java gpio_单片机基础——使用GPIO输出点亮一个LED灯
1. 准备工作 硬件准备 开发板 首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接. 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码,可参考MDK安装教程 ...
- STM8学习笔记---点亮LED灯
对单片机操作时一般有三个步骤,1.系统时钟选择.2.单片机外设初始化.3主程序编写. 同样要点亮LED灯时,也要按照这个步骤来. 首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器 可以看到 ...
- 【STM32学习笔记-点亮LED灯】
STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...
- DSP(TMSF280049C)学习笔记2:点亮LED灯
DSP(TMSF280049C)学习笔记2:点亮LED灯 实验目的:点亮Texas InstrumentsTMSF280049C开发板,LED0与GPIO23相连,下载到FLASH,具体代码如下: # ...
最新文章
- MDNICE使得你只需要关注内容
- 什么是restful风格?
- python绘制简单直方图-python plotly绘制直方图实例详解
- STL Vector使用例程
- You can't specify target table 'tablename' for update in FROM clause的解决方法
- 使用RemObjects Pascal Script
- 问题一:CodeBlocks环境搭建及创建第一个C++程序
- 十大算法 — 冒泡排序法【C语言代码诠释】
- (计算圓柱体的体积)编写程序,读入圆柱体的半径和高,并使用下列公式计算圆柱的体积
- Spring 之 @Transaction 详解
- Java最新面试题汇总
- Redis原理浅析(一):Redis基本数据类型、事务以及排序
- 剪映+json解析将视频中的声音转换成文本
- 张小龙-年薪近3亿的微信之父,他是如何做到的?
- 图形2d,3d加速简介
- css textarea行数_超级简单:在一个TextArea中如何限制行数和字符数
- 矩阵特征分解(svd)介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)
- GOM 登录器源码及编译教程
- POSTGRESQL按拼音排序
- 教师计算机桌面文件乱图片,调皮学生恶作剧,把老师的电脑壁纸换了,老师打开一看懵圈了...
热门文章
- My Heart Will Go On--Art from Life
- 【软件体系结构】考点总结 第四章 软件体系结构描述 XJU
- 洛谷 1346 电车
- 安卓系统使用adb解锁手机及设置休眠时长
- php小蛋白奶粉有哪些牌子,部分水解蛋白奶粉有哪些
- 5款Java性能分析工具的对比
- linux获取夏令时时间,关于时区:获取C中时区的夏令时转换日期
- Linux 远程访问及控制 OpenSSH 服务
- 【开发者文库】批量上传工具上线了,欢迎来“尝鲜”~
- 矿大计算机学院周裕浩,计算机学院学子在第45届ACM-ICPC亚洲区决赛获佳绩