// Управление семисегментными индикаторами через регистр сдвига 74HC164(ОК) #define F_CPU 1000000UL #include #include // Массив чисел 0, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 unsigned char SEGMENTE[] ={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f}; volatile unsigned int volt =589; // Функция сдвига void write_byte(unsigned char data) { for(unsigned char i = 0; i < 8 ; i++) { if((data & 0x80) != 0) // Сравниваем 8-й бит с нулем PORTB |= (1 << PB0); // DATA 1 else PORTB &= ~(1 << PB0); // DATA 0 data = data << 1; // Сдвигаем биты PORTB |= (1 << PB1); // CLK 1 PORTB &= ~(1 << PB1); // CLK 0 } } int main(void) { DDRB |= 0xff; PORTB = 0x00; while(1) { PORTB =0x00; // Выключаем индикатор write_byte(SEGMENTE[volt/100]); // Выводим разряд PORTB |= (1 << PB2); // Включаем индикатор _delay_ms(8); PORTB =0x00; // Выключаем индикатор write_byte(SEGMENTE[volt%100/10]); // Выводим 2 разряд PORTB |= (1 << PB3); // Включаем индикатор _delay_ms(8); PORTB = 0x00; // Выключаем индикатор write_byte(SEGMENTE[volt%10]); // Выводим разряд PORTB |= (1 << PB4); // Включаем индикатор _delay_ms(8); } }