首先打开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单片机还要简单不少,好多代码根本就不用自己写!