一、前言
### 數(shù)碼管
數(shù)碼管(Digital Display)是一種用來顯示數(shù)字和一些字符的電子元件。它通常由多個發(fā)光二極管(LED)組成,這些LED排列成一定的形狀,例如圓形、棒狀或條狀,通過不同的排列組合來表示不同的數(shù)字和符號。根據(jù)LED的排列方式,數(shù)碼管可以分為一位數(shù)碼管、兩位數(shù)碼管、四位數(shù)碼管等。### 74HC595
74HC595是一款8位串行輸入、并行輸出的移位寄存器芯片。它內(nèi)部包含8個串入、串/并出移位寄存器和8位三態(tài)輸出鎖存器。其主要引腳包括:- SER:串行數(shù)據(jù)輸入端
- SRCLK:移位寄存器時鐘輸入端
- RCLK:輸出寄存器時鐘輸入端
- OE:輸出使能控制端
- Q0~Q7:8位并行輸出端74HC595的工作原理是:在SRCLK的上升沿時,串行輸入數(shù)據(jù)(SER)移入寄存器;在RCLK的上升沿時,寄存器的數(shù)據(jù)置入鎖存器。通過控制SER、SRCLK、RCLK三個引腳,可以實現(xiàn)對數(shù)碼管的控制。
### 74HC595數(shù)碼管驅動電路
在使用74HC595驅動數(shù)碼管時,通常需要將數(shù)碼管的各個段(Segment)連接到74HC595的并行輸出端(Q0~Q7),同時將數(shù)碼管的位選(Common)引腳連接到74HC595的某個輸出端,用于控制數(shù)碼管的顯示。
二、資料獲取
關注微信公眾號--星之援工作室 發(fā)送關鍵字(74HC595)
網(wǎng)上資料很多,但是大部分都不是特別全面,我這里是在他們的基礎上優(yōu)化和改進了一下
可以判斷多位顯示以及小數(shù)點顯示等
????
?三、設備使用
接線
接線方式如下,可根據(jù)個人喜好進行引腳的切換
?演示
這里我采用的兩位數(shù)碼管進行顯示
這是沒有小數(shù)點的顯示 效果
這是顯示小數(shù)點的顯示 效果,小數(shù)點我設置在第二位的
四、代碼編寫
main.c
在主程序可更改顯示的數(shù)據(jù)
/*接線
VCC------------>供電
DIO------------>PB9
SCLK------------>PB8
LOAD------------>PB7
GND------------>接地
可自動判斷顯示的位數(shù)
可設置小數(shù)點顯示的位置,也可以不顯示
*/
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "HC595.h"
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
// LED 端口初始化
LED_GPIO_Config();
// 串口初始化
uart_init(115200);
//數(shù)碼管初始化
HC595_Init();
printf("init okn");
while ( 1 )
{
HC595_Send_Data(0,66);
}
}
HC595.h
可更改配置的IO口
#ifndef __HC595_H
#define __HC595_H
#include "stm32f10x.h"
/* 定義IIC連接的GPIO端口, 用戶只需要修改下面的代碼即可改變控制的LED引腳 */
#define HC595_DIO_GPIO_PORT GPIOB /* GPIO端口 */
#define HC595_DIO_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口時鐘 */
#define HC595_DIO_GPIO_PIN GPIO_Pin_9
#define HC595_CLK_GPIO_PORT GPIOB /* GPIO端口 */
#define HC595_CLK_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口時鐘 */
#define HC595_CLK_GPIO_PIN GPIO_Pin_8
#define HC595_LOA_GPIO_PORT GPIOB /* GPIO端口 */
#define HC595_LOA_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口時鐘 */
#define HC595_LOA_GPIO_PIN GPIO_Pin_7
#define HC595_DIO_OUT PBout(9)
#define HC595_SCK_OUT PBout(8)
#define HC595_LOA_OUT PBout(7)
// 端口初始化
void HC595_Init( void );
// 串入
void HC595_Send_Byte(unsigned char byte);
// 并出
// X 表示小數(shù)點顯示的位置 Y表示顯示的數(shù)據(jù)
void HC595_Send_Data( u8 x, u16 y);
#endif /* __HC595_H */
HC595.c
#include "HC595.h"
#include "delay.h"
unsigned char LED_table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0x00};//0 1 2 3 4 5 6 7 8 9 A B C D F // 共陽數(shù)碼管
//端口初始化
void HC595_Init( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( HC595_CLK_GPIO_CLK | HC595_DIO_GPIO_CLK | HC595_LOA_GPIO_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = HC595_CLK_GPIO_PIN | HC595_DIO_GPIO_PIN|HC595_LOA_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( HC595_CLK_GPIO_PORT, &GPIO_InitStructure );
HC595_DIO_OUT = 0;
HC595_SCK_OUT = 0;
HC595_LOA_OUT = 0;
}
//串入
void HC595_Send_Byte(unsigned char byte)
{
uint8_t i;
for(i=0;i<8;i++)
{
HC595_SCK_OUT = 0;
delay_ms(10);
if(0x80&byte)
HC595_DIO_OUT = 1;
else
HC595_DIO_OUT = 0;
byte = byte <<1 ;
delay_ms(10);
HC595_SCK_OUT =1;
delay_ms(10);
}
HC595_DIO_OUT = 0;
HC595_SCK_OUT = 0;
}
// 并出
// X 表示小數(shù)點顯示的位置 Y表示顯示的數(shù)據(jù)
void HC595_Send_Data(u8 x, u16 y)
{
static unsigned int thousand_bit, hundred_bit, ten_bit, single_bit;
thousand_bit = y / 1000;
hundred_bit = (y % 1000) / 100;
ten_bit =y % 1000 % 100 / 10;
single_bit = y % 10;
// 自動反饋位數(shù) , 選擇小數(shù)點
switch(x){
case 0: {
if(y>9){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]);
}else if(y>99){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]);
HC595_Send_Byte(LED_table[hundred_bit]);
}else if(y>999){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]);
HC595_Send_Byte(LED_table[hundred_bit]);
HC595_Send_Byte(LED_table[thousand_bit]);
}else{
HC595_Send_Byte(LED_table[single_bit]);
}
}break;
case 1: {
if(y>9){
HC595_Send_Byte(LED_table[single_bit]+0x80);
HC595_Send_Byte(LED_table[ten_bit]);
}else if(y>99){
HC595_Send_Byte(LED_table[single_bit]+0x80);
HC595_Send_Byte(LED_table[ten_bit]);
HC595_Send_Byte(LED_table[hundred_bit]);
}else if(y>999){
HC595_Send_Byte(LED_table[single_bit]+0x80);
HC595_Send_Byte(LED_table[ten_bit]);
HC595_Send_Byte(LED_table[hundred_bit]);
HC595_Send_Byte(LED_table[thousand_bit]);
}else{
HC595_Send_Byte(LED_table[single_bit]+0x80);
}
}break;
case 2: {
if(y>9){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]+0x80);
}else if(y>99){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]+0x80);
HC595_Send_Byte(LED_table[hundred_bit]);
}else if(y>999){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]+0x80);
HC595_Send_Byte(LED_table[hundred_bit]);
HC595_Send_Byte(LED_table[thousand_bit]);
}else{
HC595_Send_Byte(LED_table[single_bit]);
}
}break;
case 3: {
if(y>9){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]);
}else if(y>99){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]);
HC595_Send_Byte(LED_table[hundred_bit]+0x80);
}else if(y>999){
HC595_Send_Byte(LED_table[single_bit]);
HC595_Send_Byte(LED_table[ten_bit]);
HC595_Send_Byte(LED_table[hundred_bit]+0x80);
HC595_Send_Byte(LED_table[thousand_bit]);
}else{
HC595_Send_Byte(LED_table[single_bit]);
}
}
}
HC595_LOA_OUT = 1;
delay_ms(10);
HC595_LOA_OUT = 0;
}
?五、參考
STM32學習記錄——74HC595四位數(shù)碼管顯示https://blog.csdn.net/stm_white/article/details/116039956?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171651582716800211575717%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171651582716800211575717&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-116039956-null-null.142%5Ev100%5Epc_search_result_base7&utm_term=stm332%2074hc595%E6%95%B0%E7%A0%81%E7%AE%A1%E6%98%BE%E7%A4%BA&spm=1018.2226.3001.4187
【STM32學習】(14)兩個74HC595控制四個數(shù)碼管顯示https://blog.csdn.net/XiaoCaiDaYong/article/details/105584177?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171651960616800211557784%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171651960616800211557784&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-7-105584177-null-null.nonecase&utm_term=stm332%2074hc595%E6%95%B0%E7%A0%81%E7%AE%A1%E6%98%BE%E7%A4%BA&spm=1018.2226.3001.4450
聯(lián)系方式 微信號:13648103287