0% found this document useful (0 votes)
139 views6 pages

Reloj Digital Con Atmega16

The document describes an ATMega16 microcontroller-based digital clock project that uses an LCD display. It includes a circuit diagram and AVR C code to initialize the LCD, update the displayed time every second using interrupts, and allow the hours and minutes to be set using buttons. When powered on, the clock starts at 00:00:00 and counts up, displaying the time on the LCD.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
139 views6 pages

Reloj Digital Con Atmega16

The document describes an ATMega16 microcontroller-based digital clock project that uses an LCD display. It includes a circuit diagram and AVR C code to initialize the LCD, update the displayed time every second using interrupts, and allow the hours and minutes to be set using buttons. When powered on, the clock starts at 00:00:00 and counts up, displaying the time on the LCD.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

The ATMega16 LCD Digital Clock

In this ATMega16 AVR project we will be designing and implementing a digital clock with the aid of a Atmel AVR ATMega16 microcontroller and an alphanumeric liquid crystal display (LCD).

Note: Although this AVR project was designed around the ATMega16 the project could have utilized another microcontroller such as an ATMega32, ATMega8515, etc.

ATMega16 LCD Digital Clock Operation Our digital clock operates as follows. When the circuit is powered up the clock starts at "00:00:00" for "HH:MM:SS". There are two push-button switches used to set the time. Switch SW1 is for setting the minutes, when this button is pressed the minutes in increase until it reaches 59 then reset and start counting from 0. Switch SW2 is for setting the hours.

Hardware Description for the ATMega16 LCD Digital Clock The figure below gives the circuit diagram for the ATmega16 LCD Digital Clock.

Important Note: In order for our digital clock to work correctly the internal oscillator of the ATMega16 AVR microcontroller must be enabled and set to 4MHz. Software for the ATMega16 LCD Digital Clock Below is the AVR C implementation of the entire code for the ATMega16 based LCD digital clock. The code was implemented and built using AVR Studio 5. Be reminded that the internal clock of the ATMega16 microcontroller should be enabled and programmed to operate at 4MHz for the AVR C code to operate correctly. A video of the LCD digital clock in operation is presented at the end of this page.

/* * LCD-Digital-Clock.c * * Written in AVR Studio 5 * Compiler: AVR GNU C Compiler (GCC) *

* Created: 12/22/2011 6:34:36 PM * Author: AVR Tutorials * Website: www.AVR-Tutorials.com */ #define F_CPU 4000000UL #include <avr/delay.h> #include <avr/io.h> #include <string.h> #include <avr/interrupt.h> /*Global Variables Declarations*/ unsigned char hours = 0; unsigned char minutes = 0; unsigned char seconds = 0; char time[] = "00:00:00"; /*LCD function declarations */ void LCD_send_command(unsigned char cmnd); void LCD_send_data(unsigned char data); void LCD_init(); void LCD_goto(unsigned char y, unsigned char x); void LCD_print(char *string); void LCD_update_time(void); /*Timer Counter 1 Compare Match A Interrupt Service Routine/Interrupt Handler*/ ISR(TIMER1_COMPA_vect); #define LCD_DATA_PORT #define LCD_DATA_DDR #define LCD_DATA_PIN PORTB DDRB PINB

#define LCD_CNTRL_PORT PORTC #define LCD_CNTRL_DDR DDRC #define LCD_CNTRL_PIN PINC #define #define #define #define #define LCD_RS_PIN LCD_RW_PIN LCD_ENABLE_PIN SET_HOUR SET_MINUTE 5 6 7 3 4

int main(void) { unsigned char i; LCD_init(); LCD_goto(1,2); LCD_print("AVR-Tutorials"); LCD_goto(2,4); LCD_print(time); LCD_CNTRL_PORT = (1<<SET_HOUR | 1<<SET_MINUTE); TCCR1B = (1<<CS12|1<<WGM12); OCR1A = 15625-1; TIMSK = 1<<OCIE1A; sei(); while(1)

{ if(!(LCD_CNTRL_PIN & (1<<SET_HOUR))) { hours++; if(hours > 23) hours = 0; } if(!(LCD_CNTRL_PIN & (1<<SET_MINUTE))) { minutes++; if(minutes > 59) minutes = 0; } _delay_ms(250); } } /* This function sends a command 'cmnd' to the LCD module*/ void LCD_send_command(unsigned char cmnd) { LCD_DATA_PORT = cmnd; LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN); LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN); LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN); _delay_us(2); LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN); _delay_us(100); } /* This function sends the data 'data' to the LCD module*/ void LCD_send_data(unsigned char data) { LCD_DATA_PORT = data; LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN); LCD_CNTRL_PORT |= (1<<LCD_RS_PIN); LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN); _delay_us(2); LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN); _delay_us(100); } void LCD_init() { LCD_CNTRL_DDR = 0xFF; LCD_CNTRL_PORT = 0x00; LCD_DATA_DDR = 0xFF; LCD_DATA_PORT = 0x00; _delay_ms(10); LCD_send_command(0x38); LCD_send_command(0x0C); LCD_send_command(0x01); _delay_ms(10); LCD_send_command(0x06); } /* This function moves the cursor the line y column x on the LCD module*/ void LCD_goto(unsigned char y, unsigned char x)

{ unsigned char firstAddress[] = {0x80,0xC0,0x94,0xD4}; LCD_send_command(firstAddress[y-1] + x-1); _delay_ms(10); } void LCD_print(char *string) { unsigned char i; while(string[i]!=0) { LCD_send_data(string[i]); i++; } } void LCD_update_time() { unsigned char temp; LCD_goto(2,4); itoa(hours/10,temp,10); LCD_print(temp); itoa(hours%10,temp,10); LCD_print(temp); LCD_print(":"); itoa(minutes/10,temp,10); LCD_print(temp); itoa((minutes%10),temp,10); LCD_print(temp); LCD_print(":"); itoa(seconds/10,temp,10); LCD_print(temp); itoa(seconds%10,temp,10); LCD_print(temp); } /*Timer Counter 1 Compare Match A Interrupt Service Routine/Interrupt Handler*/ ISR(TIMER1_COMPA_vect) { seconds++; if(seconds == 60) { seconds = 0; minutes++; } if(minutes == 60) { minutes = 0; hours++; } if(hours > 23) hours = 0; LCD_update_time(); }

You might also like