基于stm32G431 HAL库数码管例程
数码管原理图
数码管是共阴极的,所以当输入为1时,数码管亮。
74HC595是一个8位串行输入、并行输出的位移缓存器
RCLK引脚 :当RCLK到上升沿时,移位寄存器进入存储寄存器,也就是负责将数据传到数码管。
SCK 引脚到上升沿时:数据寄存器移位
SER 引脚是串行数据输入端
简单概括就是 SER负责写数据(0或1)然后写一位sck存储,然后sck移位,数据写完RCLK负责把数据传到数码管进行显示。
用赛点资源包中的液晶驱动程序进行编写例程
打开stm32cubemx
由于我们用扩展板,所以我索性将PA1~PA7都打开了,数码管是PA1到PA3,模式为输出。
然后生成文件,到keil里,为了方便,也不独立写seg.c和seg.h文件了,直接在main函数里写,也方便比赛的时候节省时间。
先创建一个数组,用来存放0~F对应的显示数码管16进制数。
i用于下面主函数循环。
下面写数码管的显示函数:
三个参数对应的就是三组数码管,code_tmp = Seg7[Bit3];将对应的16进制数赋给code_tmp,进入for循环,移位数码管有八位,所以循环八次,code_tmp与上0x80,从code_tmp的最高位开始判断一下code_tmp是1还是0,如果是1,SER写1,else写0 。然后code_tmp向左移1位,SCK来一个上升沿,让数据寄存器移移位,。重复循环8次,一个数码管就写好了。三个数码管组就需要三个循环来做。
下面展示显示函数 内联代码片
。
uc8 Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
u8 i=0;
void SEG_DisplayValue(u8 Bit1, u8 Bit2, u8 Bit3)
{
u8 code_tmp = 0; //存放数组Seg7[]对应的16进制数
u8 a=0;//用于循环
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2对应RCLK,用于存储寄存器
code_tmp = Seg7[Bit3];
for(a=0;a<8;a++)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//PA3对应SCK,用于数据寄存器移位
if(code_tmp&0x80)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1对应SER,用于向数据寄存器写数据
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
}
code_tmp = code_tmp << 1;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
}
code_tmp = Seg7[Bit2];
for(a=0;a<8;a++)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
if(code_tmp&0x80)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
}
code_tmp = code_tmp << 1;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
}
code_tmp = Seg7[Bit1];
for(a=0;a<8;a++)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
if(code_tmp&0x80)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
}
code_tmp = code_tmp << 1;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//来一个上升沿,将三组数据送入数码管
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
}
主函数里,首先需要一个用于显示的数组display。
下面展示一些 内联代码片
。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(i = 0; i < 17; i++)
{
SEG_DisplayValue(i, i, i);
sprintf(display, "SEG display:%d %d %d", i, i, i);
LCD_DisplayStringLine(Line6, (u8 *)display);
HAL_Delay(1000);
}
if(i == 17)
{
sprintf(display, "SEG display: ");
LCD_DisplayStringLine(Line6, (u8 *)display);
i = 0;
}
}
显示函数就放在主函数上面
main函数全部代码。
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uc8 Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
u8 i=0;
void SEG_DisplayValue(u8 Bit1, u8 Bit2, u8 Bit3)
{
u8 code_tmp = 0; //存放数组Seg7[]对应的16进制数
u8 a=0;//用于循环
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2对应RCLK,用于存储寄存器
code_tmp = Seg7[Bit3];
for(a=0;a<8;a++)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//PA3对应SCK,用于数据寄存器移位
if(code_tmp&0x80)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1对应SER,用于向数据寄存器写数据
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
}
code_tmp = code_tmp << 1;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
}
code_tmp = Seg7[Bit2];
for(a=0;a<8;a++)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
if(code_tmp&0x80)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
}
code_tmp = code_tmp << 1;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
}
code_tmp = Seg7[Bit1];
for(a=0;a<8;a++)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
if(code_tmp&0x80)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
}
code_tmp = code_tmp << 1;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
}
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
char display[20];
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
LCD_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0, (uint8_t *)" ");
LCD_DisplayStringLine(Line1, (uint8_t *)" ");
LCD_DisplayStringLine(Line2, (uint8_t *)" SEG Demo ");
LCD_DisplayStringLine(Line3, (uint8_t *)" ");
LCD_DisplayStringLine(Line4, (uint8_t *)" ");
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
LCD_DisplayStringLine(Line5, (uint8_t *)" ");
LCD_DisplayStringLine(Line6, (uint8_t *)" ");
LCD_DisplayStringLine(Line7, (uint8_t *)" ");
LCD_DisplayStringLine(Line8, (uint8_t *)" ");
LCD_DisplayStringLine(Line9, (uint8_t *)" ");
SEG_DisplayValue(0,0,0);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(i = 0; i < 17; i++)
{
SEG_DisplayValue(i, i, i);
sprintf(display, "SEG display:%d %d %d", i, i, i);
LCD_DisplayStringLine(Line6, (u8 *)display);
HAL_Delay(1000);
}
if(i == 17)
{
sprintf(display, "SEG display: ");
LCD_DisplayStringLine(Line6, (u8 *)display);
i = 0;
}
}
/* USER CODE END 3 */
}