由电路图,控制数码管显示的关键,就是掌握这个“SN74LS595N” 移位数据锁存器的工作原理。
实验前,先连接对应跳帽 [A1->SER]、[A2->RCK] 、[A3->SCK]
之后分析数码管对应的原理图
三、编程
1、void SEG_GPIO_Config(void)
void SEG_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(SEG_GPIO_SER_CLK|
SEG_GPIO_RCK_CLK|
SEG_GPIO_SCK_CLK,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = SEG_GPIO_SER_PIN; //SER
GPIO_Init(SEG_GPIO_SER_PORT,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = SEG_GPIO_RCK_PIN; //RCK
GPIO_Init(SEG_GPIO_RCK_PORT,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = SEG_GPIO_SCK_PIN; //SCK
GPIO_Init(SEG_GPIO_SCK_PORT,&GPIO_InitStruct);
}
2、void SEG_Display(uint8_t Seg1,uint8_t Seg2,uint8_t Seg3)
uint8_t Seg7[17] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00};
void SEG_Display(uint8_t Seg1,uint8_t Seg2,uint8_t Seg3)
{
uint8_t i = 0;
uint8_t seg_temp = 0;
seg_temp = Seg7[Seg3]; //从码表读出Seg3对应的码值
for(i = 0;i<8;i++)
{
SCK_L; //先拉低,等待SER数据输入
if(seg_temp&0x80) //取出最高位
{
SER_H;
}
else
{
SER_L;
}
SCK_H; //高电平触发移位
seg_temp = seg_temp<<1;//左移一位
}
seg_temp = Seg7[Seg2];
for(i = 0;i<8;i++)
{
SCK_L;
if(seg_temp&0x80)
{
SER_H;
}
else
{
SER_L;
}
SCK_H;
seg_temp = seg_temp<<1;
}
seg_temp = Seg7[Seg1];
for(i = 0;i<8;i++)
{
SCK_L;
if(seg_temp&0x80)
{
SER_H;
}
else
{
SER_L;
}
SCK_H;
seg_temp = seg_temp<<1;
}
RCK_H;
RCK_L;
}
3、头文件
#ifndef _BSP_SEG_H
#define _BSP_SEG_H
#include "stm32f10x.h"
#define SEG_GPIO_SER_PORT GPIOA
#define SEG_GPIO_SER_PIN GPIO_Pin_1
#define SEG_GPIO_SER_CLK RCC_APB2Periph_GPIOA
#define SEG_GPIO_RCK_PORT GPIOA
#define SEG_GPIO_RCK_PIN GPIO_Pin_2
#define SEG_GPIO_RCK_CLK RCC_APB2Periph_GPIOA
#define SEG_GPIO_SCK_PORT GPIOA
#define SEG_GPIO_SCK_PIN GPIO_Pin_3
#define SEG_GPIO_SCK_CLK RCC_APB2Periph_GPIOA
#define SER_H GPIO_SetBits(SEG_GPIO_SER_PORT,SEG_GPIO_SER_PIN)
#define SER_L GPIO_ResetBits(SEG_GPIO_SER_PORT,SEG_GPIO_SER_PIN)
#define RCK_H GPIO_SetBits(SEG_GPIO_RCK_PORT,SEG_GPIO_RCK_PIN)
#define RCK_L GPIO_ResetBits(SEG_GPIO_RCK_PORT,SEG_GPIO_RCK_PIN)
#define SCK_H GPIO_SetBits(SEG_GPIO_SCK_PORT,SEG_GPIO_SCK_PIN)
#define SCK_L GPIO_ResetBits(SEG_GPIO_SCK_PORT,SEG_GPIO_SCK_PIN)
void SEG_GPIO_Config(void);
void SEG_Display(uint8_t Seg1,uint8_t Seg2,uint8_t Seg3);
#endif /*_BSP_SEG_H*/