中断方式实现数码管显示(IDE+Protuse)
实验条件:Cube IDE +Protuse
任务目标: STM32F103R6T6系列的MCU引脚上接有6个共阴极的七段数码管和两个按键,原理图见如下Protuse图,编程实现当KEY1按下时数码管显示123456,当KEY2按下时,数码管显示HELLO-。
一 、Protuse模型的搭建
1. 使用的元器件
2. 使用线标连接原理图
线表可以简化连线,相同的线标自动连接在一起,具体方法:点击需要添加的线,点击右键,然后选择“Place Wire Label”
输入对应线标。
为了能够引出连线,需要添加终端模块下的“DEFAULT”
3. 电源及接地的设置
在“Design”下选择“Configure Power Rails...”
设置结果如下图所示。
二、Cube MX的设置
1. 芯片选择“STM32F103R6T6”
2.引脚配置
按键引脚: PA4、PA6 (中断输入)
数码管位码操作:PB10~PB15 (输出)
数码管段码操作:PC1-PC8 (输出)
3. 外设配置
3.1 复位及时钟控制
按照下图设置RCC(图1)中的HSE为BYPASS Clock Source(图2)
3.2 调试接口
按照下图设置SYS(图1)中的Serial Wire(图2)
3.3 中断的优先级设置
4.时钟配置(如图所示)
输入频率为8MHz,最高为72MHz
5.工程配置(建议勾选如下图所示选项)
二 、Cube IDE程序编写
1. 添加User文件夹;(点击项目名称后点击右键调出菜单,按照1-3新建文件夹并命名为User)
2. 添加.c和.h文件。(点击User后选择右键,调出菜单,按照1-3新建.c和.h文件,并分别命名为display.c和display.h)
3. display.h程序如下
#ifndef DISPLAY_H
#define DISPLAY_H
#include "gpio.h"
#define t 2
void display_0 ();
void display_1 ();
void display_2 ();
void display_3 ();
void display_4 ();
void display_5 ();
void display_6 ();
void display_7 ();
void display_8 ();
void display_9 ();
void display_H ();
void display_L ();
void display_E ();
void display_O ();
void display_ ();
void display_1_6 ();
void display_HELLO ();
#endif
4. display.c程序如下
#include "display.h"
#include "gpio.h"
void display_0 ()
{
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_1 ()
{
HAL_GPIO_WritePin(GPIOC, B_Pin|C_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, A_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_2 ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|D_Pin|E_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, C_Pin||F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_3 ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin|D_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, E_Pin|F_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_4 ()
{
HAL_GPIO_WritePin(GPIOC, B_Pin|C_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, A_Pin|D_Pin|E_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_5 ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|C_Pin|D_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, B_Pin|E_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_6 ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, B_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_7 ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_8 ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, DP_Pin, GPIO_PIN_RESET);
}
void display_9 ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin|D_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, E_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_H ()
{
HAL_GPIO_WritePin(GPIOC, B_Pin|C_Pin|E_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, A_Pin|D_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_E ()
{
HAL_GPIO_WritePin(GPIOC, A_Pin|D_Pin|E_Pin|F_Pin|G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, B_Pin|C_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_L ()
{
HAL_GPIO_WritePin(GPIOC, D_Pin|E_Pin|F_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, A_Pin|B_Pin|C_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_O ()
{
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_ ()
{
HAL_GPIO_WritePin(GPIOC,G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_1_6 ()
{
display_1 ();
HAL_GPIO_WritePin(GPIOB,W1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W2_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_2 ();
HAL_GPIO_WritePin(GPIOB,W2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_3 ();
HAL_GPIO_WritePin(GPIOB,W3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W4_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_4 ();
HAL_GPIO_WritePin(GPIOB,W4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_5 ();
HAL_GPIO_WritePin(GPIOB,W5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_6 ();
HAL_GPIO_WritePin(GPIOB,W6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W5_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
void display_HELLO ()
{
display_H ();
HAL_GPIO_WritePin(GPIOB,W1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W2_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_E ();
HAL_GPIO_WritePin(GPIOB,W2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W3_Pin|W4_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_L ();
HAL_GPIO_WritePin(GPIOB,W3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W4_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_L ();
HAL_GPIO_WritePin(GPIOB,W4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W5_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_O ();
HAL_GPIO_WritePin(GPIOB,W5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W6_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
display_ ();
HAL_GPIO_WritePin(GPIOB,W6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,W1_Pin|W2_Pin|W3_Pin|W4_Pin|W5_Pin, GPIO_PIN_SET);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOC,A_Pin|B_Pin|C_Pin|D_Pin|E_Pin|F_Pin|G_Pin|DP_Pin, GPIO_PIN_RESET);
}
4. 将User文件夹添加到项目中,具体流程为1-6找到添加位置,分别在7-8下加“User”文件夹。(添加为6-7下点击“Add,然后选择文件夹的存储位置,添加成功显示结果为6/8)
5. 主函数的编写
5.1 添加头文件
/* USER CODE BEGIN Includes */
#include "display.h"
/* USER CODE END Includes */
5.2 定义变量
/* USER CODE BEGIN PV */
volatile uint8_t flag=0;
/* USER CODE END PV */
5.3 编写while函数
/* USER CODE BEGIN 3 */
if(flag==1)
{
display_1_6();
}
else if(flag==2)
{
display_HELLO();
}
}
/* USER CODE END 3 */
5.4 编写中断回调函数
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case KEY_1_Pin:
flag=1;
break;
case KEY_2_Pin:
flag=2;
break;
}
}
/* USER CODE END 4 */
6. 编译程序并生成hex文件。
7. 运行结果