MUX7SEG/SegMux.c
2026-02-25 15:36:28 +01:00

102 lines
1.5 KiB
C

#include <armv30_std.h>
#include <stm32f10x.h>
void portConfig()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Takt für Port A
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // Takt für Port B
GPIOA->CRL &= 0x00000000;
GPIOA->CRL |= 0x22222222; // PA0 - PA7 Output
GPIOB->CRL &= 0x00000000;
GPIOB->CRL |= 0x00000022; // PB0 - PB1 Output
}
void set7Seg(uint8_t zahl)
{
const uint8_t segmente[10] =
{
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
if (zahl < 10)
{
GPIOA->ODR &= 0xFFFFFF00;
GPIOA->ODR |= segmente[zahl];
}
}
void segEnable(uint8_t zahl)
{
if(zahl == 1)
{
GPIOB->ODR &= 0b00000000;
GPIOB->ODR |= 0b00000001;
}
else if(zahl == 2)
{
GPIOB->ODR &= 0b00000000;
GPIOB->ODR |= 0b00000010;
}
}
uint8_t varTo7Seg(uint8_t zahl)
{
uint8_t einer = 0;
uint8_t zehner = 0;
int i = 0;
if(zahl > 99)
{
set7Seg(0);
}
else
{
einer = zahl % 10;
zehner = zahl / 10;
}
for(i = 0; i < 51; i++)
{
segEnable(1);
set7Seg(zehner);
wait_ms(5);
segEnable(2);
set7Seg(einer);
wait_ms(5);
}
return zahl;
}
int main(void)
{
portConfig();
uint8_t zahl = 99;
uint16_t tick = 0;
int i = 0;
while(1)
{
for(i = 0; i < 100; i++)
{
varTo7Seg(i);
}
wait_ms(2000);
i = 0;
}
}