目录
任务要求
使用两个595实现对三位数码管控制,实现三位值显示。


一、595的作用
74HC595的作用是将串行数据进行并行显示。主要功能是节约单片机的IO口,保证少量的IO口即可完成数码管显示。
二、电路设计
因为三位数码管涉及11个引脚(包含8个段位引脚和3个COM引脚),正常IO驱动的话,就需要11个引脚,这样就会消耗很多IO口。
这时就需要这两个595实现数码管控制。
一个595只有8个数据输出口,因此需要两个595级联实现数码管显示。
电路图设计如下。

图中STCP、SHCP、DS引脚需要接在STM32的引脚,这样就能实现3个IO口控制数码管显示。
| STM32引脚 | 595芯片引脚 |
| PB7 | STCP |
| PB6 | SHCP |
| PB5 | DS |
然后,绘制PCB板。


三、STM32选型
其实STM32选型,什么类型的单片机无所谓,因为使用HAL库开发能够实现代码的较好移植。只要配置好Cube MX生成工程就可以。
这里选用的是:STM32G030K8T6(再次说明一下,这里的单片机选型不重要,实现方法相同)
四、cubeMX配置

选择相应的引脚,其均设置成输出模式。
修改引脚的别名,这里也可以不修改。

五、代码实现
595驱动程序开发
/**********************************/
/** 函数名称:void HC595_Write_Data(unsigned char dis_data) **/
/** 输入参数:unsigned char dis_data 需要输入的数据 */
/** 函数功能:将数据写进74HC595中*/
/** ****************************** **/
void HC595_Write_Data(unsigned char dis_data)
{
unsigned char i;
unsigned char temp;
temp = dis_data;
for(i=0;i<8;i++) // 循环将一个字节的八位依次写入到寄存器
{
HAL_GPIO_WritePin(SRCLK_GPIO_Port,SRCLK_Pin,GPIO_PIN_RESET);// SRCLK低电平
if(temp & 0X80)
{
HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_RESET);
}
temp = temp<<1;
HAL_GPIO_WritePin(SRCLK_GPIO_Port,SRCLK_Pin,GPIO_PIN_RESET); // SRCLK低电平
HAL_GPIO_WritePin(SRCLK_GPIO_Port,SRCLK_Pin,GPIO_PIN_SET); // SRCLK高电平
}
}
/****************************************/
/**函数名称:void Disp_out(void)*/
/**函数参数:无参*/
/**函数功能:将写入到寄存器的数据输出到端口显示*/
/****************************************/
void Disp_out(void)
{
HAL_GPIO_WritePin(RCLK_GPIO_Port,RCLK_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(RCLK_GPIO_Port,RCLK_Pin,GPIO_PIN_SET);
}
数码管显示函数
void DispData(void)
{
HC595_Write_Data(table[gBai]);
HC595_Write_Data(0X0006); // 0000 0000 0000 0000
Disp_out();
/// 增加小数点
HC595_Write_Data(table[gShi]|0X80); // 加小数点 增加|0X80
HC595_Write_Data(0X0005);
Disp_out();
HC595_Write_Data(table[gGe]);
HC595_Write_Data(0X0003);
Disp_out();
// 保证数码管亮度一致
HC595_Write_Data(table[0]);
HC595_Write_Data(0X0007);
Disp_out();
}
到这就实现了数码管显示。
主函数代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* 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 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
DispData();
}
/* USER CODE END 3 */
}
六、实现效果(显示12.8)

代码链接: