Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- #define clockPin PD2 // Тактовый вход
- #define latchPin PD3 // Защелка
- #define dataPin PD4 // Данные
- enum segments { DP, G, F, E, D, C, B, A };
- #define zero (1<<G)|(1<<DP)
- #define one (1<<A)|(1<<D)|(1<<E)|(1<<F)|(1<<G)|(1<<DP)
- #define two (1<<C)|(1<<F)|(1<<DP)
- #define three (1<<E)|(1<<F)|(1<<DP)
- #define four (1<<A)|(1<<D)|(1<<E)|(1<<DP)
- #define five (1<<B)|(1<<E)|(1<<DP)
- #define six (1<<B)|(1<<DP)
- #define seven (1<<D)|(1<<E)|(1<<F)|(1<<G)|(1<<DP)
- #define eight (1<<DP)
- #define nine (1<<E)|(1<<DP)
- uint8_t numbers[] = { zero, one, two, three, four, five, six, seven, eight, nine };
- uint8_t digits[] = { 0b10000000, 0b01000000, 0b00100000, 0b00010000 };
- uint8_t csec = 0;
- uint8_t sec = 0;
- uint8_t min = 0;
- uint8_t lastdigit = 0;
- void begin_shift();
- void end_shift();
- void shift(uint8_t data);
- void drawtime();
- void drawdigit(uint8_t digit, uint8_t num);
- void drawdigit(uint8_t digit, uint8_t num,bool dot);
- int main(void)
- {
- // Конфигурируем пины в состояние Output
- DDRD = (1<<clockPin) | (1<<latchPin) | (1<<dataPin);
- TIMSK1 = (1<<OCIE1A);
- TCCR1B = (1<<CS10)|(1<<CS12)|(1<<WGM12);
- OCR1A = F_CPU/1024/200;
- sei();
- while (1)
- {
- if (sec == 59 && min == 59 && csec == 99)
- {
- sec = 0, min = 0;
- }
- if (csec == 99)
- {
- csec = 0;
- if (sec == 59)
- {
- sec = 0;
- ++min;
- }
- else
- {
- ++sec;
- }
- }
- ++csec;
- _delay_ms(10);
- }
- }
- ISR(TIMER1_COMPA_vect)
- {
- drawtime();
- }
- void drawtime()
- {
- if (lastdigit == 0)
- {
- drawdigit(1, sec / 10, false);
- }
- else if (lastdigit == 1)
- {
- drawdigit(2, min % 10, true);
- }
- else if (lastdigit == 2)
- {
- drawdigit(3, min / 10, false);
- }
- else
- {
- drawdigit(0, sec % 10, false);
- }
- }
- void drawdigit(uint8_t digit, uint8_t num, bool dot)
- {
- if (num>sizeof(numbers)-1 || digit>sizeof(digits)-1) return;
- shift(dot ? numbers[num]&~(1<<DP) : numbers[num]);
- shift(digits[digit]);
- lastdigit = digit;
- }
- void shift(uint8_t data)
- {
- PORTD &= ~(1<<latchPin);
- for (int i = 0; i < 8; i++){
- PORTD &= ~((1<<clockPin)|(1<<dataPin));
- PORTD |= ((data&1)<<dataPin);
- PORTD |= (1<<clockPin);
- data >>= 1;
- }
- PORTD |= (1<<latchPin);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement