打印
[其他ST产品]

stm32利用CubeMX实现外部中断触发数码管加减数

[复制链接]
84|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
c17|  楼主 | 2024-2-29 18:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
首先打开proteus绘制电路图,如下:


然后打开CubeMX,配置晶振和GPIO:



使用特权

评论回复
沙发
c17|  楼主 | 2024-2-29 18:10 | 只看该作者
接下来就是生成keil工程文件,用keil打开。

新建一个desplay.h文件:下面是全部代码
#ifndef __DESPLAY_H
#define __DESPLAY_H
#endif

#include "main.h"

// 数码管显示函数
void display_all(uint8_t num);

// 实现数码管断码显示
void display(uint16_t shu);

// 实现数码管清屏
void display_clear(void);

// 实现数码管位选选通
void bitset(uint16_t wei);

使用特权

评论回复
板凳
c17|  楼主 | 2024-2-29 18:10 | 只看该作者
再新建一个desplay.c文件:下面是全部代码
#include "desplay.h"

uint8_t duan[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};


// 数码管显示函数
void display_all(uint8_t num)
{
    display_clear();  //清屏
    bitset(1);           // 选十位
    display(duan[num/10]);  // 显示十位
    HAL_Delay(2);              // 延时2ms
   
    display_clear();         //清屏
    bitset(2);                  //选个位
    display(duan[num%10]);  // 显示个位
    HAL_Delay(2);               //延时2ms
}

// 实现数码管断码显示
void display(uint16_t shu)
{
    GPIOA->ODR = shu;
}

// 实现数码管清屏
void display_clear(void)
{
    GPIOA->ODR = 0XFF;
}

// 实现数码管位选选通
void bitset(uint16_t wei)
{
    // 当位为1时,十位数码管选通; 当位为2时,个位数码管选通
    if(wei == 1)
    {
        HAL_GPIO_WritePin(shiwei_GPIO_Port, shiwei_Pin, GPIO_PIN_SET); // 十位置1
        HAL_GPIO_WritePin(gewei_GPIO_Port, gewei_Pin, GPIO_PIN_RESET); // 个位置0
    }
    if(wei == 2)
    {
        HAL_GPIO_WritePin(shiwei_GPIO_Port, shiwei_Pin, GPIO_PIN_RESET); // 十位置0
        HAL_GPIO_WritePin(gewei_GPIO_Port, gewei_Pin, GPIO_PIN_SET); // 个位置1
    }
}

使用特权

评论回复
地板
c17|  楼主 | 2024-2-29 18:10 | 只看该作者
再新建一个button.h文件:代码如下
#ifndef __BUTTON__H
#define __BUTTON__H

#endif

#include "main.h"


//  中断回调函数  从stm32f1xx_it.c 中赋值过来的
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

//  外部中断产生的计数值获取函数
int button_get(void);

使用特权

评论回复
5
c17|  楼主 | 2024-2-29 18:11 | 只看该作者
再新建一个button.c文件:代码如下
#include "button.h"

int button_flag = 0;


//  外部中断产生的计数值获取函数
int button_get(void)
{
    if(button_flag == 100)
    {
        button_flag = 0;
    }
    if(button_flag == -1)
    {
        button_flag = 99;
    }
   
    return button_flag;  // 返回按键中断的计数值
}

//  中断回调函数  从stm32f1xx_it.c 中赋值过来的
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(HAL_GPIO_ReadPin(key1_GPIO_Port, key1_Pin) == GPIO_PIN_RESET)
    {
        button_flag++;
        //while(HAL_GPIO_ReadPin(key1_GPIO_Port, key1_Pin) == GPIO_PIN_RESET);  //由于这是中断下降沿触发,所以这个等待可以不用了
    }
   
    if(HAL_GPIO_ReadPin(key2_GPIO_Port, key2_Pin) == GPIO_PIN_RESET)
    {
        button_flag--;
        //while(HAL_GPIO_ReadPin(key2_GPIO_Port, key2_Pin) == GPIO_PIN_RESET);  //由于这是中断下降沿触发,所以这个等待可以不用了
    }
}

使用特权

评论回复
6
c17|  楼主 | 2024-2-29 18:11 | 只看该作者
在工程文件夹里新建一个Mycode文件夹,把先前的四个文件放到这个文件夹中,将文件夹添加到工程中:

使用特权

评论回复
7
c17|  楼主 | 2024-2-29 18:11 | 只看该作者
这样后就能在工程左侧目录中看到自己新添加的文件夹了 ,双击各个问价夹就能添加新建的文件了,如图:

使用特权

评论回复
8
c17|  楼主 | 2024-2-29 18:11 | 只看该作者
加入desplay.c和button.c文件


使用特权

评论回复
9
c17|  楼主 | 2024-2-29 18:11 | 只看该作者
最后就是要在main函数中添加代码了:

第一处就是导入文件:

#include "desplay.h"
#include "button.h"

使用特权

评论回复
10
c17|  楼主 | 2024-2-29 18:12 | 只看该作者
第二处需要添加的代码:

uint8_t num;  //定义num变量

while循环中添加两句:

                num = button_get();
                 display_all(num);

使用特权

评论回复
11
c17|  楼主 | 2024-2-29 18:12 | 只看该作者
至此所有的代码都修改完成,生成hex文件导入到proteus中,就能模拟两个按键控制数码管加减数字了。

使用特权

评论回复
12
c17|  楼主 | 2024-2-29 18:12 | 只看该作者
至此整个过程还是很简单的,感觉比51单片机还要简单不少,好多代码根本就不用自己写!

使用特权

评论回复
13
FranklinUNK| | 2024-2-29 19:16 | 只看该作者
是的,图形化配置就是方便

使用特权

评论回复
14
yangjiaxu| | 2024-2-29 21:56 | 只看该作者
有些时候想说,如果cubemx要是能连把业务层都搞出来的话,就好了,哈哈

使用特权

评论回复
15
heisexingqisi| | 2024-2-29 22:02 | 只看该作者
有意思,学习学习。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

c17

31

主题

272

帖子

1

粉丝