野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9218|回复: 2

求助大佬(简单按键控制LED灯)

[复制链接]
发表于 2022-1-15 00:03:10 | 显示全部楼层 |阅读模式
  1.    //stm32f103VCT6 指南者#include "stm32f10x.h"

  2. #define KEY1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)        //读取按键K1
  3. #define KEY2  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)        //读取按键K2

  4. int dis[]={0x0001,0x0002,0x0020,0x0003,0x0022,0x0021,0x0023};
  5. //延时函数
  6. void Delay(unsigned int count)                                                         
  7. {
  8.         unsigned int i;
  9.         for(;count!=0;count--)
  10.         {
  11.                 i=5000;
  12.                 while(i--);
  13.         }       
  14. }

  15. //按键初始化
  16. void KEY_Init(void)
  17. {
  18.         GPIO_InitTypeDef GPIO_InitStructure;               
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
  20.        
  21.         GPIO_InitStructure.GPIO_Pin = 0x0000; //选择按键的引脚        PA0
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);       
  24.        
  25.         GPIO_InitStructure.GPIO_Pin = 0x0400; //选择按键的引脚        PC13
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  27.         GPIO_Init(GPIOC, &GPIO_InitStructure);       
  28. }
  29. //按键获取
  30. int Key_Scan1(void)
  31. {                               
  32.         int n=0;
  33.        
  34.         if(KEY1==0)
  35.         {
  36.                 Delay(20);
  37.                 while(!KEY1);
  38.                 if(n==8)
  39.                 {
  40.                         n=8;
  41.                         return n;
  42.                 }else
  43.                         return ++n;                               
  44.         }
  45.         if(KEY2==0)
  46.         {
  47.                 Delay(20);
  48.                 while(!KEY2);
  49.                 if(n==0)
  50.                 {
  51.                         n=0;
  52.                         return n;
  53.                 }else
  54.                         return --n;
  55.         }
  56.         return n;
  57. }


  58. //LED灯初始化
  59. void LED_Init(void)       
  60. {                       
  61.                 GPIO_InitTypeDef GPIO_InitStructure;       
  62.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  63.        
  64.                 GPIO_InitStructure.GPIO_Pin = 0x0023;        //PB0,PB1,PB5(绿,蓝,红)
  65.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  66.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67.                 GPIO_Init(GPIOB, &GPIO_InitStructure);       
  68.        
  69.                 GPIO_SetBits(GPIOB, 0x0023);
  70. }


  71. int main(void)
  72. {       
  73.         int count;
  74.        
  75.         LED_Init();
  76.         KEY_Init();
  77.        
  78.         while(1)
  79.         {
  80.                 count=Key_Scan1();
  81.                
  82.                 if(count)
  83.                 {
  84.                         switch(count)
  85.                         {
  86.                            case 1: GPIO_ResetBits(GPIOB,dis[0]);break;
  87.                            case 2: GPIO_ResetBits(GPIOB,dis[1]);break;
  88.                            case 3: GPIO_ResetBits(GPIOB,dis[2]);break;                       
  89.                            case 4: GPIO_ResetBits(GPIOB,dis[3]);break;                               
  90.                            case 5: GPIO_ResetBits(GPIOB,dis[4]);break;                               
  91.                            case 6: GPIO_ResetBits(GPIOB,dis[5]);break;                               
  92.                            case 7: GPIO_ResetBits(GPIOB,dis[6]);break;                               
  93.                         }
  94.                 }else Delay(10);
  95.                
  96. //          
  97. //                GPIO_ResetBits(GPIOB,0x0001);        //只开启PB0,绿
  98. //                Delay(2000);GPIO_SetBits(GPIOB,0x0023);
  99. //               
  100. //                GPIO_ResetBits(GPIOB,0x0002);        //只开启PB1,蓝
  101. //                Delay(2000);GPIO_SetBits(GPIOB,0x0023);
  102. //               
  103. //                GPIO_ResetBits(GPIOB,0x0020);        //只开启PB5,红
  104. //                Delay(2000);GPIO_SetBits(GPIOB,0x0023);
  105. //               
  106. //                GPIO_ResetBits(GPIOB,0x0003);        //开启PB0,PB1,青
  107. //                Delay(2000);GPIO_SetBits(GPIOB,0x0023);
  108. //               
  109. //                GPIO_ResetBits(GPIOB,0x0022);        //开启PB1,PB5,紫
  110. //                Delay(2000);GPIO_SetBits(GPIOB,0x0023);
  111. //               
  112. //                GPIO_ResetBits(GPIOB,0x0021);        //开启PB0,PB5,黄
  113. //                Delay(2000);GPIO_SetBits(GPIOB,0x0023);
  114. //               
  115. //                GPIO_ResetBits(GPIOB,0x0023);        //开启PB0,PB1,PB5,白
  116. //                Delay(2000);GPIO_SetBits(GPIOB,0x0023);

  117.         }
  118.        
  119. }

复制代码





回复

使用道具 举报

 楼主| 发表于 2022-1-15 00:06:39 | 显示全部楼层
我的按键获取函数有问题,按键大多数得不到反馈。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-15 22:04:02 | 显示全部楼层
你不行啊,兄弟!还是新手吧?我看出问题了,你这个按键扫描函数里面的n要定义为静态或者定义在这个函数外面,这是第一个逻辑错误,不然你的n永远只能为1.第二,这块板子是野火指南者f103吧,回去好好看下板子的原理图,按键按下为上拉输入,或者浮空都行,所以你那个if(KEY==0)这里,这是第二个逻辑问题。加油年轻人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 05:30 , Processed in 0.863312 second(s), 108 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表