当前位置: 首页 > article >正文

【IAR工程】STM8S208RB基于ST标准库下按键检测

【IAR工程】STM8S208RB基于ST标准库下按键检测


  • 📍相关篇《【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例》
  • 🎈《【IAR工程】STM8S208RB基于ST标准库下EXTI外部中断》
  • 🔖基于ST STM8S/A标准外设库:STSW-STM8069,版本号:2.3.1
  • 📌STSW-STM8069官方资源下载地址:https://www.st.com/zh/embedded-software/stsw-stm8069.html
  • 🔧IAR编译器版本:IAR Assembler for STMicroelectronics STM8 3.11.1
  • 📌STM8S207/208RBT6最小系统板:https://oshwhub.com/perseverance51/stm8s207rbt6-kai-fa-ban

✨当然可以通过上面的相关示例篇,可以将按键检测功能放到能支持EXTI外部中断的引脚上来实现,可以减少主任务的资源占用,EXTI外部中断可以说是按键扫描功能的升级版本,只不过EXTI针对STM8S208RB来说只支持端口A、B、C、D、E端口上的引脚,其他型号的也参不多只要是引脚数64或以上的端口号都是如此。作为普通IO输入引脚就没有这么多限制了。本例作为基础例程部分。

🛠按键输入检测GPIO引脚配置

  • 🔖GPIO作为普通的输入模式配置有两种模式:
  GPIO_MODE_IN_FL_NO_IT      = (uint8_t)0x00,  /*!< Input floating, no external interrupt */
  GPIO_MODE_IN_PU_NO_IT      = (uint8_t)0x40,  /*!< Input pull-up, no external interrupt */
  1. 浮空输入
  2. 带上拉输入

📑具体引脚配置函数

#define KEY_GPIO_PORT  (GPIO_TypeDef *)(GPIOG)
#define KEY_GPIO_PINS  (GPIO_PIN_0 | GPIO_PIN_1)

#define KEY1 	GPIO_ReadInputPin(KEY_GPIO_PORT,GPIO_PIN_0)
#define KEY2 	GPIO_ReadInputPin(KEY_GPIO_PORT,GPIO_PIN_1)

void KEY_Init( void )
{
    //设置PG0为不含中断带上拉电阻输入
//   	GPIO_Init(GPIOG , GPIO_PIN_0 , GPIO_MODE_IN_PU_NO_IT);
    //设置PG1为不含中断带上拉电阻输入
//   	GPIO_Init(GPIOG , GPIO_PIN_1 , GPIO_MODE_IN_PU_NO_IT);

    GPIO_Init( KEY_GPIO_PORT, ( GPIO_Pin_TypeDef )KEY_GPIO_PINS, GPIO_MODE_OUT_PP_HIGH_FAST ); //同上
}

📝主程序代码

/**************************************************************************************
实验现象:按下K1键,控制LED1指示灯亮灭,按下K2键,控制LED2指示灯亮灭

接线说明:	1,STM8S单片机-->LED
		   		PC7-->LED1
                                PC6-->LED2
		  	2,STM8S单片机-->独立按键模块
		   		PG0-->K1
				PG1-->K2

注意事项:1、点击“Download active application”按钮,程序下载完成后,即可运行程序。

***************************************************************************************/

#include "stm8s.h"      /*  添加库函数头文件 */
#include "delay.h"
#include "led.h"
#include "key.h"

/* 主函数 */
int main( void )
{

    //内部时钟为1分频 = 16Mhz
    CLK_SYSCLKConfig( CLK_PRESCALER_HSIDIV1 );
    LED_Init();
    KEY_Init();

    while( 1 )
    {
        if( KEY1 == 0 )
        {//检测到按键PG0被按下
            delay_ms( 20 );//消抖
            while( KEY1 == 0 );
            LED1_TOGGLE;
        }
        if( KEY2 == 0 )
        {//检测到按键PG1被按下
            delay_ms( 20 );//消抖
            while( KEY2 == 0 );
            LED2_TOGGLE;
        }

    }
}
//是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数
void assert_failed( u8* file, u32 line )
{
    while ( 1 )
    {

    }
}

📚工程源码

  • 🔖IAR对中文路径不友好,不要将工程解压在带有中文字符路径的文件夹内直接打开工程编译,这样会导致IAR内部检索文件路径将消耗大量CPU资源。
链接: https://pan.baidu.com/s/1m5qnnBZ0fba-Yrus0oTwJQ
提取码: txjn

http://www.kler.cn/a/5137.html

相关文章:

  • ASTRA Toolbox学习笔记
  • Excel使用技巧:如何打印指定区域?如何设置禁止打印?
  • 华为路由器 高级ACL配置
  • 图解Redis,Redis主从复制与Redis哨兵机制
  • centos 7安装mysql
  • 盒子拖拽效果,原生js实现
  • 【Linux内网穿透】使用SFTP工具快速实现内网穿透
  • 【C语言】文件操作
  • 神策数据如何帮助企业实现营销自动化?
  • yolov5模型训练流程
  • 2023西安交通大学软件工程915考研经验帖(初试+复试)
  • 11 容器常用命令
  • *(void**)解析——如何设计可以在32位下访问到内存区域的前4个字节,在64位下访问到前8个字节?
  • 面试官:ThreadLocal了解吗?用过吗?原理是什么?底层数据如何存储的?
  • [oeasy]python0122_日韩字符_日文假名_JIS_Shift_韩国谚文
  • 蓝桥杯刷题冲刺 | 倒计时8天
  • 2023年超全的Android面经(23/30)设计模式安卓源码案例
  • 学术论文等级与分类标准——JCR
  • Element Plus 实例详解(五)___Scrollbar 滚动条
  • 语句【C++】