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

首先打开proteus绘制电路图,如下:

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

接下来就是生成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);

再新建一个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
    }
}

再新建一个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);

再新建一个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);  //由于这是中断下降沿触发,所以这个等待可以不用了
    }
}

 在工程文件夹里新建一个Mycode文件夹,把先前的四个文件放到这个文件夹中,将文件夹添加到工程中:

这样后就能在工程左侧目录中看到自己新添加的文件夹了 ,双击各个问价夹就能添加新建的文件了,如图:

加入desplay.c和button.c文件

最后就是要在main函数中添加代码了:

第一处就是导入文件:

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

第二处需要添加的代码:

uint8_t num;  //定义num变量

while循环中添加两句:

                num = button_get();
                 display_all(num);

至此所有的代码都修改完成,生成hex文件导入到proteus中,就能模拟两个按键控制数码管加减数字了。

至此整个过程还是很简单的,感觉比51单片机还要简单不少,好多代码根本就不用自己写!

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚久龙

你的鼓励是我最大的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值