This is a simple demo program of reading button state, lighting LEDs, sending information via USART. 8 buttons are connected to Atmega16 port A, 8 LEDs to port B via current limiting resistors. While none of the buttons aren’t pressed, there is a running light on LEDs performed, but when any of the buttons are pressed, LEDs display the current 8 bit counter value in binary format. The same value is sent via USART – you can see a number in the terminal is connected.

The program is very simple:
#include <avr/io.h> #include <util/delay.h> #include <stdio.h> #ifndef F_CPU #define F_CPU 1000000 #endif //set desired baud rate #define BAUDRATE 9600 //calculate UBRR value #define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1) char n, //number c; //current state of display int main(void) { //Set baud rate UBRRL=UBRRVAL; //low byte UBRRH=(UBRRVAL>>8); //high byte //Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)| (0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0); //Enable Transmitter and Receiver UCSRB=(1<<RXEN)|(1<<TXEN); DDRA=0x00; //all A port pins as input PORTA=0xFF; //Enable internal Pull-Up resistors DDRB=0xFF; //All B port pins as output while(1) { c=1; //start with first LED while(PINA==0xFF) //wait for button to be pressed { if (c==0) c=1; //if light passed all leds start over PORTB=~c; //LED on _delay_ms(100);//short delay n++; //increase number value c=c<<1; //shift li9ghted LED } //wait for empty transmit buffer while (!(UCSRA&(1<<UDRE))){}; UDR=n; //send number to USART PORTB=~n; //and dislpaly number with led(binary) _delay_ms(200); //long delay PORTB=0xFF; //All LEDs OFF } return 0; }
You can compile it with AVRStudio4. If you want to simulate the circuit by yourself, you can download the Proteus design file. The only limitation is that the Atmega16 model doesn’t support USART (only UART), so no terminal modeling is present.