找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

已解决:谢谢各位师傅,请教STM32按键输入程序问题

查看数: 2585 | 评论数: 18 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-8-20 09:24

正文摘要:

你们好,各位老师,在之前买的普中开发板A7,将之前的C51换成STM32f103cb模块,教程里面按键输入程序都和原来不一样了,我没有按着教程那样写程序,教程都是一个按键控制一个灯,我的想法是两个按键控制多个灯,结果 ...

回复

ID:731755 发表于 2022-8-24 08:45
vca 发表于 2022-8-23 10:36
把按键时钟使能从GPIOA改成GPIOB

的确是那里错了。谢谢了
ID:731755 发表于 2022-8-23 11:36
vca 发表于 2022-8-23 10:36
把按键时钟使能从GPIOA改成GPIOB

谢谢,我再找找看
ID:731755 发表于 2022-8-23 11:35
vca 发表于 2022-8-23 10:22
时钟配置错了,按键是GPIOB,你配置成GPIOA了

谢谢,我再找找看
ID:731755 发表于 2022-8-23 11:33

ifndef _led_H
#define _led_H
#include "stm32f10x.h"
#define LED_PORT       GPIOA
#define LED_1       GPIO_Pin_0
#define LED_2       GPIO_Pin_1
#define LED_3       GPIO_Pin_2
#define LED_4       GPIO_Pin_3
#define LED_5       GPIO_Pin_4
#define LED_6       GPIO_Pin_5
#define LED_7       GPIO_Pin_6


#define LED_PORT_RCC   RCC_APB2Periph_GPIOA
   
void LED_Init(void);
void led1(void);
void led2(void);
void led3(void);
void led4(void);
void led5(void);
void led6(void);
void led7(void);

#endif

#include "led.h"
#include "delay.h"
/*******************************************************************************
* 函 数 名         : LED_Init
* 函数功能                   : LED初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void LED_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
       
        RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin=LED_1|LED_2|LED_3|LED_4|LED_5|LED_6|LED_7;  //选择你要设置的IO口
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;         //设置推挽输出模式
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;          //设置传输速率
        GPIO_Init(LED_PORT,&GPIO_InitStructure);            /* 初始化GPIO */
       
       
        GPIO_SetBits(LED_PORT,LED_1|LED_2|LED_3|LED_4|LED_5|LED_6|LED_7);//??D1
       
}

void led1()
{
    GPIO_ResetBits(LED_PORT,LED_1);  
                Delay_ms(500);
                GPIO_SetBits(LED_PORT,LED_1);//点亮D1
                Delay_ms(500);
}
void led2()
{
    GPIO_ResetBits(LED_PORT,LED_2);   
                Delay_ms(500);
                GPIO_SetBits(LED_PORT,LED_2);
                Delay_ms(500);
}
void led3()
{
    GPIO_ResetBits(LED_PORT,LED_3);  
                Delay_ms(500);
                GPIO_SetBits(LED_PORT,LED_3);
                Delay_ms(500);
}
void led4()
{
    GPIO_ResetBits(LED_PORT,LED_4);  
                Delay_ms(500);
                GPIO_SetBits(LED_PORT,LED_4);//
                Delay_ms(500);
}
void led5()
{
    GPIO_ResetBits(LED_PORT,LED_5);  
                Delay_ms(500);
                GPIO_SetBits(LED_PORT,LED_5);
                Delay_ms(500);
}
void led6()
{
    GPIO_ResetBits(LED_PORT,LED_6);   
                Delay_ms(500);
                GPIO_SetBits(LED_PORT,LED_6);
                Delay_ms(500);
}
void led7()
{
    GPIO_ResetBits(LED_PORT,LED_7);   
                Delay_ms(500);
                GPIO_SetBits(LED_PORT,LED_7);
                Delay_ms(500);
}
ID:731755 发表于 2022-8-23 11:32

#ifndef _KEY_H
#define _KEY_H

#include "stm32f10x.h"

#define key_PORT       GPIOB
#define key_1        GPIO_Pin_8
#define key_2        GPIO_Pin_9

#define key_PORT_RCC   RCC_APB2Periph_GPIOA
   
void key_Init(void);
u8 key(void);

#endif
#include "key.h"
#include "delay.h"

void key_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
       
        RCC_APB2PeriphClockCmd(key_PORT_RCC,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin=key_1|key_2;  //选择你要设置的IO口
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;         //设置输入模式
       
        GPIO_Init(key_PORT,&GPIO_InitStructure);            /* 初始化GPIO */
}

        u8 key(void)
        {
   
                if(GPIO_ReadInputDataBit(key_PORT,key_1)==0)
          {
                  Delay_ms(10);
                  if(GPIO_ReadInputDataBit(key_PORT,key_1)==0)
                        {
                     
                    
                                 while(GPIO_ReadInputDataBit(key_PORT,key_1)==0);
                                 return 1;
                        }
                        else
                        return 0;
                 }
          else  if(GPIO_ReadInputDataBit(key_PORT,key_2)==0)
        {
                  Delay_ms(10);
                  if(GPIO_ReadInputDataBit(key_PORT,key_2)==0)
                        {  
                     
                        while(GPIO_ReadInputDataBit(key_PORT,key_2==0));
                        return 2;
                 }       
     else                       
           return 0;                                  
        }
        else
        return 0;               
}       
ID:731755 发表于 2022-8-23 11:31

#ifndef _DALAY_H
#define _DELAY_H
#include "stm32f10x.h"

void Delay_ms(u16 a);
void Delay_us(u16 b);
#endif
ID:550613 发表于 2022-8-23 10:36
把按键时钟使能从GPIOA改成GPIOB

评分

参与人数 1黑币 +10 收起 理由
13872888583 + 10

查看全部评分

ID:550613 发表于 2022-8-23 10:22
时钟配置错了,按键是GPIOB,你配置成GPIOA了
ID:161164 发表于 2022-8-23 09:39
13872888583 发表于 2022-8-23 08:59
在led.c文件里面,采用gpio的置0或者置1的两个函数,同时采用了延时函数

代码~请贴代码
ID:731755 发表于 2022-8-23 09:09
yzwzfyz 发表于 2022-8-22 15:40
假设控制8个灯,方案:
1、用一个字节LT(可以是变量),LT的8个位分别表示 8个灯的明暗。
2、建立两个键 ...

是,最开始的确和师傅写的那样,设置一个变量,按压按键一次,变量自加一次,另外一个按键,按压一次,自减一次,最后没有反应,改成图片中那个样子,
ID:731755 发表于 2022-8-23 09:03
最后一个夏天1 发表于 2022-8-22 19:56
51和32是不一样的哦,IO初始化需要使能相应的时钟和IO,需要配置IO模式,速度等。你的key_Init()函数一看就 ...

是一样的,还有key.h的h文件,里面有这几个KEY端口的宏定义,几个C文件都有和教程一样的H文件,不过没有按照教程一模一样的写而已
ID:731755 发表于 2022-8-23 08:59
lkc8210 发表于 2022-8-22 09:53
led1()到led7()是怎么写的?

在led.c文件里面,采用gpio的置0或者置1的两个函数,同时采用了延时函数
ID:646520 发表于 2022-8-22 19:56
51和32是不一样的哦,IO初始化需要使能相应的时钟和IO,需要配置IO模式,速度等。你的key_Init()函数一看就没配对,建议你先跟着32教程配置一遍初始化,后面就很轻松啦,加油!!
ID:123289 发表于 2022-8-22 15:40
假设控制8个灯,方案:
1、用一个字节LT(可以是变量),LT的8个位分别表示 8个灯的明暗。
2、建立两个键的组合状态,有几种显示方式,就必须有几种组合状态。
3、将键的组合状态,与LT(对应的显示形式)值做成一个(按键与显示)的【对应表】。
4、当按键出现某种组合时,就从【对应表】中取出对应的LT值。
5、将LT送到灯的接口上显示。
ID:161164 发表于 2022-8-22 09:53
led1()到led7()是怎么写的?
ID:731755 发表于 2022-8-21 09:04
robinsonlin 发表于 2022-8-20 13:05
两个按键控制8个灯?  2个按键,只有4种状态吧,没弄明白你是如何实现的。 如果不是通过状态来控制,那就是 ...

你好,老师,抱歉,这是自己改过的程序,最早的程序,有个自++,一个按键按一次,变量加一次,另外一个按键按一次,变量减一次,主程序通过变量值判断来灯闪烁的。由于程序没有成功,看了一本改成现在这样,目的只是控制两个灯,可惜两个灯都不成功。
ID:883242 发表于 2022-8-20 15:57
难道是delay()时间不对?
ID:451718 发表于 2022-8-20 13:05
两个按键控制8个灯?  2个按键,只有4种状态吧,没弄明白你是如何实现的。 如果不是通过状态来控制,那就是通过按键触发的时长来控制,51的速度和 STM32的速度是完全不同的,如果用delay来约束,恐怕不行。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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