#include "stm32f10x.h"
// Define the pins connected to the 74HC595 shift registers
#define DATA_PIN GPIO_Pin_12 // Example pin, adjust as needed
#define CLOCK_PIN GPIO_Pin_13 // Example pin, adjust as needed
#define LATCH_PIN GPIO_Pin_14 // Example pin, adjust as needed
// Define the segment patterns for digits 0-9
const uint8_t digit_patterns[10] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};
// Function to send data to the 74HC595 shift registers
void shift_out(uint16_t data) {
    for (int i = 15; i >= 0; i--) {
        // Set the data pin value
        if ((data >> i) & 1) {
            GPIO_SetBits(GPIOB, DATA_PIN);
        } else {
            GPIO_ResetBits(GPIOB, DATA_PIN);
        }
        // Pulse the clock pin
        GPIO_SetBits(GPIOB, CLOCK_PIN);
        GPIO_ResetBits(GPIOB, CLOCK_PIN);
    }
}
// Function to display a 4-digit number
void display_number(uint16_t number) {
    uint8_t digits[4];
    // Extract individual digits
    digits[0] = number % 10;
    digits[1] = (number / 10) % 10;
    digits[2] = (number / 100) % 10;
    digits[3] = (number / 1000) % 10;
    // Prepare data for shift registers
    uint16_t data = 0;
    for (int i = 0; i < 4; i++) {
        data |= (digit_patterns[digits[i]] << (i * 7));
    }
      // Latch low
    GPIO_ResetBits(GPIOB, LATCH_PIN);
    // Shift out the data
    shift_out(data);
    // Latch high to display the number
    GPIO_SetBits(GPIOB, LATCH_PIN);
}
int main(void) {
    // Enable GPIOB clock
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    // Configure the pins as output push-pull
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DATA_PIN | CLOCK_PIN | LATCH_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    // Initialize the pins
    GPIO_ResetBits(GPIOB, DATA_PIN | CLOCK_PIN | LATCH_PIN);
    // Display numbers in a loop
    int number = 0;
    while (1) {
        display_number(number);
        number++;
        if (number > 9999) {
            number = 0;
        }
        // Delay for a short time (adjust as needed)
        for (int i = 0; i < 100000; i++);
    }
}
Loading
st-nucleo-l031k6
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
sevseg1:DIG1
sevseg1:DIG2
sevseg1:DIG3
sevseg1:DIG4
sevseg1:COM
sevseg1:CLN
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
74HC595
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
vcc2:VCC
gnd4:GND
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
DIO
RCLK
SCLK
GND
4-Bit LED Digital Tube