中断方式实现数码管显示(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. 运行结果


版权声明:本文为weixin_45785022原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>