#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
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