AVR reads button state and indicates on LED

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
//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
//Enable Transmitter and Receiver
	DDRA=0x00;	//all A port pins as input
	PORTA=0xFF;	//Enable internal Pull-Up resistors
	DDRB=0xFF;	//All B port pins as output
			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.

Comments are closed.