#include <stdint.h>
#include "stm32c0xx.h"
//Rcc_IOPENER_GPIAEN = (1<<0)
const uint8_t segment_map[10] = {
0b00111111, // 0-> segments a, b,c, d, e, f
0b00000110, // 1-> segments b,c
0b01011011, // 2-> segments a, b, d ,e, g
0b01001111, // 3-> segments a, b, c, d, f
0b01100110, // 4-> segments b, c, f, g
0b01101101, // 5-> segments a, c, d, f, g
0b01111101, // 6-> segments a, c, d, e, f, g
0b00000111, // 7-> segments a, b, c
0b01111111, // 8-> all segments on (except DP)
0b01101111, // 9-> segments a, b, c, d, f, g0
};
//Function declarations
void SystmClock_config(void);
void GPIOA_Init(void);
int main(void)
{
SystmeClock_Config(); // configure system clock(enables GPIOA)
GPIOA_Init(); //Initialize PA0 - PA6 as output
while(1)
{
for (uint8_t num = 0 < 10; num++) {
DisplayNumber(num); //Display current digit on 7-segment
Delay(1000000); //wait using a software delay
}
}
}
void GPIOA_Init(void)
{
RCC->IOPENR |= RCC_IOPENR_GPIAEN; //Enable GPIOA clock
//configure PA0 to PA6 as general-purpose output
for (int i = 0; i<=6; i++) {
GPIOA->MODER &= ~(3<<(i*2)); //clear mode bits(2 per pin)
GPIOA->MODER |= (1<<(i*2)); //Set mode to 01: output
GPIOA->OTYPER &= ~(1<<i); //push-pull output
GPIOA->ODSPEEDR |= (3<<(i*2)); //Set speed to very high (11)
GPIOA->PUPDR &= ~(3 << (i*2)); //No Pull-up/ pull-down
}
}
void DiplayNumber(uint8_t number)
{
uint9_t pattern = segment_map[number]; //Get pattern for digit 0-9
GPIOA->ODR &= ~0x7F; //Clear PA0-PA6 (0x7F = 0b01111111)
GPIOA
}Loading
st-nucleo-c031c6
st-nucleo-c031c6