#define RCC_IOPENR      (*(volatile unsigned int*)(0x40021034))
#define GPIOA_MODER     (*(volatile unsigned int*)(0x50000000))
#define GPIOA_ODR       (*(volatile unsigned int*)(0x50000014))

void delay(volatile unsigned int t) {
  while(t--);
}

// Segment order: a b c d e f g dp -> connected to PA10, PA9, PA7, PA6, PA5, PA4, PA3, PA2
const unsigned int segmentPins[8] = {10, 9, 7, 6, 5, 4, 3, 2};

// Segment patterns for digits 0–9 (Common Cathode — HIGH = ON)
const unsigned char digits[10][8] = {
  {1,1,1,1,1,1,0,0}, // 0
  {0,1,1,0,0,0,0,0}, // 1
  {1,1,0,1,1,0,1,0}, // 2
  {1,1,1,1,0,0,1,0}, // 3
  {0,1,1,0,0,1,1,0}, // 4
  {1,0,1,1,0,1,1,0}, // 5
  {1,0,1,1,1,1,1,0}, // 6
  {1,1,1,0,0,0,0,0}, // 7
  {1,1,1,1,1,1,1,0}, // 8
  {1,1,1,1,0,1,1,0}  // 9
};

// Set segment state
void setSegment(int seg, int value) {
  if (value)
    GPIOA_ODR |= (1 << segmentPins[seg]);
  else
    GPIOA_ODR &= ~(1 << segmentPins[seg]);
}

// Display a single digit
void displayDigit(int digit) {
  for (int i = 0; i < 8; i++) {
    setSegment(i, digits[digit][i]);
  }
}

int main() {
  // Enable GPIOA clock
  RCC_IOPENR |= (1 << 0);

  // Set PA2–PA10 as output
  for (int i = 2; i <= 10; i++) {
    GPIOA_MODER &= ~(3 << (i * 2)); // Clear mode
    GPIOA_MODER |= (1 << (i * 2));  // Set as output
  }

  while (1) {
    for (int d = 0; d <= 9; d++) {
      displayDigit(d);
      delay(800000);  // Delay between digits
    }
  }

  return 0;
}
Loading
st-nucleo-c031c6
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP