数码管原理
数码管存在共阴极和共阳极两种方式点亮,蓝桥杯嵌入式采用的是共阴极的接线方法(1点亮),共阳极(0点亮)的数码管的段码与共阴极的是互补的
链接: 上图出处
74LS595原理
SCK是上升沿的时侯要把数据写入;
RCK是上升沿的时候数据才能锁存显示;
SER高低电平写入数据
需要用跳线帽把P3排针的前三个和P4排针的前三个连接在一起。
PA1->SER
PA2->RCK
PA3->SCK
程序代码
HAL库实现
将三个引脚设置为推挽输出GPIO_Mode_Out_PP。
#define ser_h HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET)
#define ser_l HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET)
#define rck_h HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)
#define rck_l HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)
#define sck_h HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET)
#define sck_l HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET)
u8 seg17[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void seg_show(u8 num1,u8 num2,u8 num3)
{
u8 temp=seg17[num3];
for(int i=0;i<8;i++)
{
if(temp&0x80)
{
ser_h;
}
else
{
ser_l;
}
sck_l;
sck_h;
temp=temp<<1;
}
temp=seg17[num2];
for(int i=0;i<8;i++)
{
if(temp&0x80)
{
ser_h;
}
else
{
ser_l;
}
sck_l;
sck_h;
temp=temp<<1;
}
temp=seg17[num1];
for(int i=0;i<8;i++)
{
if(temp&0x80)
{
ser_h;
}
else
{
ser_l;
}
sck_l;
sck_h;
temp=temp<<1;
}
rck_l;
rck_h;
}
因为74LS595采用的是移位寄存器和存储寄存器,并且三个数码管采用的是级联的方式,移位时三个74LS595一起变化,把数码管的段码从最高位一位一位移动到QA到QH,在移动到下一片级联的74LS595.
第一个for循环:此时数码管3的段码存放在数码管1的移位寄存器中。
第二个for循环:数码管3的段码移动到数码管2的移位寄存器中,数码管2的段码存放在数码管1的移位寄存器中。
第三个for循环:数码管3的段码移动到了数码管3的移位寄存器中,数码管2的段码移动到了数码管2的移位寄存器中,数码管1的段码移动到了数码管1 的移位寄存器中。
再通过RCK的上升沿将移位寄存器的值传到存储寄存器并输出。
标准库
只是对gpio的调用函数和初始化有些许不同,原理一样
#define RCLK_PIN GPIO_PIN_2
#define RCLK_PORT GPIOA
#define SER_PIN GPIO_PIN_1
#define SER_PORT GPIOA
#define SCK_PIN GPIO_PIN_3
#define SCK_PORT GPIOA
#define RCLK_H HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_SET)
#define RCLK_L HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_RESET)
#define SER_H HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_SET)
#define SER_L HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_RESET)
#define SCK_H HAL_GPIO_WritePin(SCK_PORT, SCK_PIN, GPIO_PIN_SET)
#define SCK_L HAL_GPIO_WritePin(SCK_PORT, SCK_PIN, GPIO_PIN_RESET)
uc8 Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
void SEG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct ;
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
//
void SEG_DisplayValue(u8 Bit1, u8 Bit2, u8 Bit3)
{
u8 i = 0;
u8 code_tmp = 0;
code_tmp = Seg7[Bit3];
for(i = 0; i < 8; i++)
{
if(code_tmp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
code_tmp = code_tmp << 1;
SCK_L;
SCK_H;
}
code_tmp = Seg7[Bit2];
for(i = 0; i < 8; i++)
{
if(code_tmp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
code_tmp = code_tmp << 1;
SCK_L;
SCK_H;
}
code_tmp = Seg7[Bit1];
for(i = 0; i < 8; i++)
{
if(code_tmp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
code_tmp = code_tmp << 1;
SCK_L;
SCK_H;
}
RCLK_L;
RCLK_H;
}