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

时间:2021-05-01 01:05:22

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


✨当然可以通过上面的相关示例篇,可以将按键检测功能放到能支持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