时间紧迫,还是直接学习扩展板资源吧
目录
一. 原理
1. 原理图
只需要注意图中标记的三个引脚就能实现数码管的功能
2. 解释
SER:理解为数据位
SCK:给一个上升沿,将数据移位,比如图中的U1里QA的数据移位到U1的QB。同时也是将数码管之间的数据进行了移位,比如U1里QH的数据移位到U2的QA。
RCLK:给一个上升沿,将移位寄存器SN74LS595N的数据转到存储寄存器,就写进了数码管。
3. 注意事项
(1)数据移位方向是从U1的QA开始,一直移到U3的QH,多出来的丢弃。
(2)数码管是共阳数码管
(3)扩展板的跳线帽要接上,接P3与P4的
(4)PA1-SER,PA2-RCK,PA3-SCK
二. 代码编写
在cubemx的引脚配置很简单,就是将PA1-PA3设为输出模式即可,其他都默认,直接上代码。
1. leds.c 文件
LEDS_Display是数码管显示函数,以第十届真题为例写的,带有字母,想必以后考也不会考纯数字的显示,就发了这个比较长的代码,不过原理很简单。
#include "leds.h"
unsigned char LEDS[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; // 0-9,A-F,灭
void LEDS_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
/*Configure GPIO pins : PA1 PA2 PA3 */
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void LEDS_Display(int data,uint8_t a) // data 十进制三位数,a 选择展示方式 0 纯数字 1 Axx 2 Cxx
{
int i,j;
unsigned char tem = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
for(j = 0; j < 2; j++)
{
tem = LEDS[data%10];
if((data == 0) && (j > 0))tem = LEDS[16];
data/=10;
for(i = 0; i < 8; i++)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
if(tem & 0x80)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
}
tem = tem << 1;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
}
}
if(a == 0)
tem = LEDS[data%10];
else if(a == 1)
tem = LEDS[10]; // A
else
tem = LEDS[12]; // C
data/=10;
for(i = 0; i < 8; i++)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
if(tem & 0x80)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
}
tem = tem << 1;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
}
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
}
2. leds.h 文件
#include "main.h"
void LEDS_Init(void);
void LEDS_Display(int data,uint8_t a); //数码管显示数字
3. main.c 文件
#include "leds.h"
int main(void)
{
HAL_Init();
SystemClock_Config();//系统时钟设置
LEDS_Init();
LEDS_Display(123,2);
while (1)
{
// HAL_Delay(500);
}
}