找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1086|回复: 18
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
你们好,各位老师,在之前买的普中开发板A7,将之前的C51换成STM32f103cb模块,教程里面按键输入程序都和原来不一样了,我没有按着教程那样写程序,教程都是一个按键控制一个灯,我的想法是两个按键控制多个灯,结果是无法控制,没有反应,这个在C51很正常的程序,这里失灵了,比较过两种开发板,就是以前的开发板外接IO口有上拉电阻,不过我在网上找的是没有影响,请教各位师傅,不知道是否没有影响,如果没有影响,是程序有问题吗?同时使用过,硬件仿真,里面的变量数值不变,硬件仿真不是很会用,没有观察到按键输入IO口的波形,

51hei浏览器截图20220819231202.png (19.49 KB, 下载次数: 52)

51hei浏览器截图20220819231202.png

51hei浏览器截图20220819231232.png (30.28 KB, 下载次数: 42)

51hei浏览器截图20220819231232.png

1.jpg (4.61 MB, 下载次数: 95)

1.jpg

4按键输入.7z

211.08 KB, 下载次数: 15

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:451718 发表于 2022-8-20 13:05 | 只看该作者
两个按键控制8个灯?  2个按键,只有4种状态吧,没弄明白你是如何实现的。 如果不是通过状态来控制,那就是通过按键触发的时长来控制,51的速度和 STM32的速度是完全不同的,如果用delay来约束,恐怕不行。
回复

使用道具 举报

板凳
ID:883242 发表于 2022-8-20 15:57 | 只看该作者
难道是delay()时间不对?
回复

使用道具 举报

地板
ID:731755 发表于 2022-8-21 09:04 | 只看该作者
robinsonlin 发表于 2022-8-20 13:05
两个按键控制8个灯?  2个按键,只有4种状态吧,没弄明白你是如何实现的。 如果不是通过状态来控制,那就是 ...

你好,老师,抱歉,这是自己改过的程序,最早的程序,有个自++,一个按键按一次,变量加一次,另外一个按键按一次,变量减一次,主程序通过变量值判断来灯闪烁的。由于程序没有成功,看了一本改成现在这样,目的只是控制两个灯,可惜两个灯都不成功。
回复

使用道具 举报

5#
ID:161164 发表于 2022-8-22 09:53 | 只看该作者
led1()到led7()是怎么写的?
回复

使用道具 举报

6#
ID:123289 发表于 2022-8-22 15:40 | 只看该作者
假设控制8个灯,方案:
1、用一个字节LT(可以是变量),LT的8个位分别表示 8个灯的明暗。
2、建立两个键的组合状态,有几种显示方式,就必须有几种组合状态。
3、将键的组合状态,与LT(对应的显示形式)值做成一个(按键与显示)的【对应表】。
4、当按键出现某种组合时,就从【对应表】中取出对应的LT值。
5、将LT送到灯的接口上显示。
回复

使用道具 举报

7#
ID:646520 发表于 2022-8-22 19:56 | 只看该作者
51和32是不一样的哦,IO初始化需要使能相应的时钟和IO,需要配置IO模式,速度等。你的key_Init()函数一看就没配对,建议你先跟着32教程配置一遍初始化,后面就很轻松啦,加油!!
回复

使用道具 举报

8#
ID:731755 发表于 2022-8-23 08:59 | 只看该作者
lkc8210 发表于 2022-8-22 09:53
led1()到led7()是怎么写的?

在led.c文件里面,采用gpio的置0或者置1的两个函数,同时采用了延时函数
回复

使用道具 举报

9#
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文件,不过没有按照教程一模一样的写而已
回复

使用道具 举报

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

是,最开始的确和师傅写的那样,设置一个变量,按压按键一次,变量自加一次,另外一个按键,按压一次,自减一次,最后没有反应,改成图片中那个样子,
回复

使用道具 举报

11#
ID:161164 发表于 2022-8-23 09:39 | 只看该作者
13872888583 发表于 2022-8-23 08:59
在led.c文件里面,采用gpio的置0或者置1的两个函数,同时采用了延时函数

代码~请贴代码
回复

使用道具 举报

12#
ID:550613 发表于 2022-8-23 10:22 | 只看该作者
时钟配置错了,按键是GPIOB,你配置成GPIOA了
回复

使用道具 举报

13#
ID:550613 发表于 2022-8-23 10:36 | 只看该作者
把按键时钟使能从GPIOA改成GPIOB

评分

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

查看全部评分

回复

使用道具 举报

14#
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
回复

使用道具 举报

15#
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;               
}       
回复

使用道具 举报

16#
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);
}
回复

使用道具 举报

17#
ID:731755 发表于 2022-8-23 11:35 | 只看该作者
vca 发表于 2022-8-23 10:22
时钟配置错了,按键是GPIOB,你配置成GPIOA了

谢谢,我再找找看
回复

使用道具 举报

18#
ID:731755 发表于 2022-8-23 11:36 | 只看该作者
vca 发表于 2022-8-23 10:36
把按键时钟使能从GPIOA改成GPIOB

谢谢,我再找找看
回复

使用道具 举报

19#
ID:731755 发表于 2022-8-24 08:45 | 只看该作者
vca 发表于 2022-8-23 10:36
把按键时钟使能从GPIOA改成GPIOB

的确是那里错了。谢谢了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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