STM32
直播中

刘英

7年用户 1054经验值
私信 关注
[问答]

怎么实现基于STM32F103外部IO中断的按键控制编程?

怎么实现基于STM32F103外部IO中断的按键控制编程?

回帖(1)

李铭冠

2021-11-17 11:30:08
1、按键电路

在系统中SW1按键与STM32F103的PB3引脚相连接,SW2按键与STM32F103的PA15引脚相连接。






2、PB3、PA15引脚配置程序
void KEY_GPIO_Config(void)
{       
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);       
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                         
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  
    GPIO_Init(GPIOB, &GPIO_InitStructure);   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                         
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  
    GPIO_Init(GPIOA, &GPIO_InitStructure);          
}


3、PB3、PA15外部IO中断配置程序
void Exti_Config(void)
{       
  EXTI_InitTypeDef EXTI_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
  EXTI_InitStructure.EXTI_Line = EXTI_Line3|EXTI_Line15;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}


4、PB3、PA15外部IO中断服务程序
unsigned char bz=0;
//PB3的中断服务程序
void EXTI3_IRQHandler(void)//按键1,右边的,控制温度
{   
  if (EXTI_GetITStatus(EXTI_Line3) != RESET)
  {
    EXTI_ClearITPendingBit(EXTI_Line3);
      bz=0;//温度标志
  }         
}
//PA15的中断服务程序
void EXTI15_10_IRQHandler(void)//按键2,左边的,控制湿度
{   
  if (EXTI_GetITStatus(EXTI_Line15) != RESET)
  {
    EXTI_ClearITPendingBit(EXTI_Line15);
      bz=1;//湿度标志
  }        
}


注:上述所有程序全部编写在exit.c文件中。


5 按键控制DHT11显示温度和湿度的主程序
在main.c中编写如下代码:


//功能概要:STM32f103C8 滴达定时中断和温湿度DHT11传感器
//通过按键可以控制显示温度还是显示湿度
//PB12  LED灯     工作指示灯  2秒周期
//PC13  DHT11      DATA引脚
//数码管接口,TM1650
//SCL           PB10
//SDA           PB11                                      */
//两个按键   通过中断实现
//PA15           SW2
//PB3            SW1
//SysTick中断在stm32f10x_it.c中


#include "gpio.h"
#include "DHT11.h"
#include "exti.h"
#include "delay.h"
#include "systick.h"
#include "I2C.h"
#include "tm1650.h"


extern unsigned char bz;
void disp(u8 i,u8 flage)
{
            u8 gw=0;//个位
                u8 sw=0;//十位
                u8 bw=0;//百位
                u8 qw=0;//百位   
                gw=i%10;
                sw=(i/10)%10;
                bw=(i/100)%10;
                qw=(i/1000)%10;
                if(qw==0)
                {
                        TM1650_Set(0x68,0);
                }else{
                        TM1650_Set(0x68,CODE[qw]);
                }
                if(bw==0 && qw==0)
                {
                        TM1650_Set(0x6A,0);
                }else{
                        TM1650_Set(0x6A,CODE[bw]);
                }
                if(sw==0 && bw==0 && qw==0)
                {
                        TM1650_Set(0x6C,0);
                }else{
                        TM1650_Set(0x6C,CODE[sw]);
                }
                TM1650_Set(0x6E,CODE[gw]);  //最右边
                if(flage==0)
                {
                        TM1650_Set(0x68,CODE[1]);  //最左边 温度
                }else{
                        TM1650_Set(0x68,CODE[2]);  //最左边        湿度
                }
}


int main(void)
{
        u16 AD_value=0;
        u8 dht_dat[5]={0,0,0,0,0};
        u8 tm_dt=0x01;//亮度
    u8 i=0;
        SystemInit();
        SYSTICK_Init();
        Exti_Config();//初始化中断配置,必须放在前面
   Nvic_Config();//初始化中断向量,必须放在前面
   LED_GPIO_Config();
        KEY_GPIO_Config();
        I2C_Config();
        Delay_ms(50);
        TM1650_Set(0x48,tm_dt);   //初始化为5级灰度,开显示
  while(1)
  {          
                Delay_ms(500);
                if (i==1)
                {        i=0;
                        LED1_OFF;
                }else{
                        i=1;
                        LED1_ON;
                }
                read_temp(dht_dat);
                if(bz==0)
                {
                        AD_value=dht_dat[2];  //温度
                }else{
                        AD_value=dht_dat[0];        //湿度
                }
                disp(AD_value,bz);               
  }               
}


6、其它程序
系统时钟配置、嘀哒时钟配置、LED配置、DHT11引脚配置、TM650引脚配置等其它程序请自行参考本博客相应的文章。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分