#include <avr/io.h>
#include <util/delay.h>
#define SEGMENT_PORT PORTB
#define SEGMENT_DDR DDRB
#define SEGMENT_A 0
#define SEGMENT_B 1
#define SEGMENT_C 2
#define SEGMENT_D 3
#define SEGMENT_E 4
#define SEGMENT_F 5
#define SEGMENT_G 6
#define COMMON_CATHODE 7
void displayDigit(uint8_t digit)
{
const uint8_t segmentCodes[] =
{
0b0111111,
0b0000110,
0b1011011,
0b1001111,
0b1100110,
0b1101101,
0b1111101,
0b0000111,
0b1111111,
0b1101111
};
SEGMENT_PORT &= ~(1 << COMMON_CATHODE);
SEGMENT_PORT = (SEGMENT_PORT & 0xF8) | (segmentCodes[digit] & 0x07);
_delay_ms(5);
SEGMENT_PORT |= (1 << COMMON_CATHODE);
SEGMENT_PORT |= 0x07;
}
int main()
{
SEGMENT_DDR |= 0x87;
while (1) {
for (uint8_t i = 0; i <= 9; ++i)
{
displayDigit(i);
_delay_ms(1000);
}
}
return 0;
}