[应用相关] STM32F103(按键控制流水灯方向)

[复制链接]
847|11
 楼主| 雨果喝水 发表于 2021-2-25 22:20 | 显示全部楼层 |阅读模式
1:要求   用按键控制流水灯方向

2:基于Stm32F103RB


3:型号CT117E

 楼主| 雨果喝水 发表于 2021-2-25 22:20 | 显示全部楼层
/*STM32库头文件*/
  1. #include "stm32f10x_gpio.h"
  2. #include "stm32f10x_rcc.h"
  3. #include "stm32f10x.h"
  4. #include "core_cm3.h"
  5. #include "misc.h"
 楼主| 雨果喝水 发表于 2021-2-25 22:21 | 显示全部楼层
GPIO口的设置,还有宏的定义

  1. #define LED0    GPIO_Pin_8
  2. #define LED1    GPIO_Pin_9
  3. #define LED2    GPIO_Pin_10
  4. #define LED3    GPIO_Pin_11
  5. #define LED4    GPIO_Pin_12
  6. #define LED5    GPIO_Pin_13
  7. #define LED6    GPIO_Pin_14
  8. #define LED7    GPIO_Pin_15
  9. #define LED_ALL (LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7)
  10. #define LED_PORT GPIOC
  11. #define N_LE        GPIO_Pin_2
  12. #define N_LE_PORT        GPIOD
  13. #define SWN        4       
  14. #define N_K1        GPIO_Pin_0
  15. #define N_K2        GPIO_Pin_8
  16. #define N_K3        GPIO_Pin_1
  17. #define N_K4        GPIO_Pin_2
  18. #define N_K1C        GPIOA
  19. #define N_K2C        GPIOA
  20. #define N_K3C        GPIOB
  21. #define N_K4C        GPIOB
  22. /*宏*/
  23. #define LED_OUT(x)         GPIO_SetBits(LED_PORT,LED_ALL), \
  24.                         GPIO_ResetBits(LED_PORT, x<<8), \
  25.                         GPIO_SetBits(N_LE_PORT,N_LE), \
  26.                         GPIO_ResetBits(N_LE_PORT,N_LE)
 楼主| 雨果喝水 发表于 2021-2-25 22:22 | 显示全部楼层
定义数组和一些标记

  1. typedef enum
  2. {
  3.         FALSE = 0,
  4.           TRUE
  5. }y_bool;
  6. static y_bool led_t = TRUE;        //发光标记
  7. static y_bool rl = TRUE;        //左移右移标记
  8. static y_bool key_t = FALSE;        //按键的检测
 楼主| 雨果喝水 发表于 2021-2-25 22:28 | 显示全部楼层
  1. void SystemInit()
  2. {
  3. //SystemInit为空为了骗过编译器,没有任何作用
  4. }
 楼主| 雨果喝水 发表于 2021-2-25 22:29 | 显示全部楼层
/*主函数*/

  1. int main()
  2. {       
  3.         uint8_t key_dn;
  4.         init();       
  5.         while(1)
  6.         {
  7.                 if(led_t)
  8.                 {
  9.                         led_t = FALSE;
  10.                         Led();                //
  11.                 }
  12.                 if(key_t)
  13.                 {
  14.                         key_t = FALSE;
  15.                         key_dn = key_c();//按键检测
  16.                 }
  17.                
  18.                 if(key_dn)
  19.                 {
  20.                         key_d(key_dn);//按键处理
  21.                         key_dn = 0x00;
  22.                 }
  23.         }
  24. }
 楼主| 雨果喝水 发表于 2021-2-25 22:30 | 显示全部楼层


  1.    
  2.      void init()//GPIO口的初始化
  3. {
  4.  GPIO_InitTypeDef GPIO_InitStructure;
  5.  //
  6.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);    
  7.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
  8.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);    
  9.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
  10.    
  11.    
  12.       //LED
  13.  GPIO_InitStructure.GPIO_Pin = LED_ALL ;
  14.  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  15.  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  16.  GPIO_Init(LED_PORT , &GPIO_InitStructure);
  17.    
  18.    
  19.       /*N_LE*/
  20.  GPIO_InitStructure.GPIO_Pin=N_LE;
  21.  GPIO_Init(N_LE_PORT , &GPIO_InitStructure);
  22.  
  23.  /*        */
  24.  GPIO_InitStructure.GPIO_Pin =  N_K1 | N_K2;
  25.  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  26.  GPIO_Init(N_K1C , &GPIO_InitStructure);
  27.  GPIO_InitStructure.GPIO_Pin =  N_K3 | N_K4;
  28.  GPIO_Init(N_K3C , &GPIO_InitStructure);
  29.    
  30.    
  31.      
  32.  /*滴答定时器初始*/
  33.     SysTick_Config(8000);
  34. }
  35.   
 楼主| 雨果喝水 发表于 2021-2-25 22:30 | 显示全部楼层

  1. //SysTick 中断
  2. void SysTick_Handler()    
  3. {
  4.  static uint16_t i = 0;
  5.  if(++i >= 1000)       
  6.   i = 0;
  7.  if(i % 20 == 0)
  8.   key_t = TRUE;
  9.  if(i%500 == 0)
  10.   led_t = TRUE;
  11. }
 楼主| 雨果喝水 发表于 2021-2-25 22:31 | 显示全部楼层
  1. /*Led显示*/
  2. void Led()
  3. {
  4.         static uint8_t led_b = 0x01;
  5.         LED_OUT(led_b);//数据的输出
  6.         if(rl)//判断左移还是右移
  7.         {
  8.                 if((led_b <<= 1) == 0x00)
  9.                         led_b = 0x01;
  10.         }
  11.         else
  12.         {
  13.                 if((led_b >>= 1) == 0x00)
  14.                         led_b = 0x80;
  15.         }
  16. }
 楼主| 雨果喝水 发表于 2021-2-25 22:32 | 显示全部楼层

  1. /*按键检测函数*/
  2. uint8_t key_c()
  3. {
  4.         static uint8_t key_o = 0x0f;
  5.         uint8_t i, key_n, x;
  6.         const uint16_t key_pin[SWN] = {N_K1, N_K2, N_K3, N_K4};                //各个按键的引脚
  7.         const GPIO_TypeDef* key_port[SWN] = {N_K1C, N_K2C, N_K3C, N_K4C};//各个按键的端口
  8.         for(key_n = 0, i = 0; i < SWN; i++)//当按键按下赋值到key_n中
  9.         {
  10.                 key_n <<= 1;
  11.                 if(GPIO_ReadInputDataBit((GPIO_TypeDef*)key_port[i], key_pin[i]))
  12.                         key_n |= 0x01;
  13.         }
  14.         x = (key_n ^ key_o) & key_o;//检测有无按键按下
  15.         key_o = key_n;//与下一次值比较
  16.         return x;
  17. }
 楼主| 雨果喝水 发表于 2021-2-25 22:35 | 显示全部楼层
//按键的处理

  1. void key_d(uint8_t x)
  2. {
  3.         if(x & 0x08)
  4.                 rl = !rl;
  5. }
 楼主| 雨果喝水 发表于 2021-2-25 22:36 | 显示全部楼层
//按键的处理

  1. void key_d(uint8_t x)
  2. {
  3.         if(x & 0x08)
  4.                 rl = !rl;
  5. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

1213

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部