首先打开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); // 延时2msdisplay_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); // 十位置1HAL_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); // 十位置0HAL_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单片机还要简单不少,好多代码根本就不用自己写!