Output number when button is pressed
This is 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 buttons arent pressed there is running light on LEDs performed, but when any of buttons is pressed then LEDs display current 8 buit counter value in binary format. Same value is sent via USART – you can see number in terminal if 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 Proteus design file . The only limitation is that Atmega16 model doesn't support USART (only UART), so no terminal modeling is present.
Comments
good proj
good proj
avrs
how could i get that code in assmbly??
UDR=n;
Hi,
thanks for nice tutorial. I'm trying on Atmega1281 to send the char number via usart(same as u did), however receive false chars, not corresponding with the number sent. Usart is initialized,I wrote simple USARTWriteChar function:
void USARTWriteChar(char data){
//Wait until transmitter is ready
while (!(UCSR0A & (1<<UDRE0))){}
UDR0=data;
}
main function looks like this:
int main(void)
{
//Variable declaration
char n;
//Usart initialization with 9600 baud rate, UBRR=8MHz/(16*9600)-1=51
USARTInit(51);
DDRA=0xFF; //LEDS
while(1)
{
n++;
USARTWriteChar(n);
PORTA=0x05;
_delay_ms(1000);
PORTA=0x07;
_delay_ms(1000);
}
Thanks for comment.
Add new comment