/*
#define F_CPU 16000000UL
#include<avr/io.h>
#include<util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#define LCD_Dir DDRB
#define LCD_Port PORTB
#define RS PB0
#define EN PB1
volatile uint8_t button = 0;
//Sending a Command to LCD
void LCD_Command(unsigned char cmnd )
{
LCD_Port=(LCD_Port & 0x0F) | (cmnd & 0xF0);
LCD_Port &= ~ (1<<RS);
LCD_Port |= (1<<EN);
_delay_us(1);
LCD_Port &= ~ (1<<EN);
_delay_us(200);
LCD_Port = (LCD_Port & 0x0F) | (cmnd << 4);
LCD_Port |= (1<<EN);
_delay_us(1);
LCD_Port &= ~ (1<<EN);
_delay_ms(2);
}
//Data Writting on LCD
void LCD_Char( unsigned char data )
{
LCD_Port = (LCD_Port & 0x0F)|(data & 0xF0);
LCD_Port |= (1<<RS);
LCD_Port|= (1<<EN);
_delay_us(1);
LCD_Port &= ~ (1<<EN);
_delay_us(200);
LCD_Port = (LCD_Port & 0x0F)|(data << 4);
LCD_Port |= (1<<EN);
_delay_us(1);
LCD_Port &= ~ (1<<EN);
_delay_ms(2);
}
//LCD Initialization for 4-bit Mode
void LCD_Init (void)
{
LCD_Dir = 0xFF;
_delay_ms(20);
LCD_Command(0x33);
LCD_Command(0x32);
LCD_Command(0x28);
LCD_Command(0x0c);
LCD_Command(0x06);
LCD_Command(0x01);
_delay_ms(2);
}
//Display a String on LCD
void LCD_String (char *str)
{
int i;
for(i=0;str[i]!=0;i++)
{
LCD_Char (str[i]);
}
}
//Cleaning LCD
void LCD_Clear()
{
LCD_Command (0x01);
_delay_ms(2);
LCD_Command (0x80);
}
void Timer1_Init()
{
//TCNT1= 59286;
//TCNT1= 63973;
TCNT1= 61286;
TCCR1A = 0x00;
TCCR1B |= (1<<CS02);
TIFR1 |= (1<<TOV1);
while(((TIFR1)&(1<<TOV1))==0);
TCCR1B = 0x00;
TCCR1A = 0x00;
TIFR1 = 0x01;
}
void INT3_init()
{
cli();
DDRD &= ~(1<<PD3);
PORTD |= (1<<PD3);
EICRA |= (1<<ISC31);
EICRA &= ~(1<<ISC30);
EIMSK |= (1<<INT3);
sei();
}
ISR(INT3_VECT, ISR_NOBLOCK)
{
EIMSK &= ~(1<<INT3);
button = (button == 0) ? 1: 0;
EIFR |= (1<<INTF3);
EIMSK |= (1<<INT3);
}
int main()
{
LCD_Init();
cli();
INT3_init();
sei();
char TIME[10];
float time;
while(1)
{
if(button == 1)
{
while(button == 1)
{
Timer1_Init();
time += 0.1;
dtostrf(time, 5, 1, TIME);
LCD_Clear();
LCD_Command(0x80);
LCD_String(TIME);
LCD_Command(0xC0);
_delay_ms(500);
}
}
if(button == 0)
{
while(button == 0)
{
dtostrf(time, 5, 1, TIME);
LCD_Clear();
LCD_Command(0x80);
LCD_String(TIME);
LCD_Command(0xC0);
_delay_ms(500);
}
}
}
}
*/
#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#define LCD_Dir DDRB
#define LCD_Port PORTB
#define RS PB0
#define EN PB1
//uint8_t count=0;
volatile uint8_t button=0;
char Time[10];
float time = 0;
void LCD_Command(unsigned char cmnd) {
LCD_Port = (LCD_Port & 0x0F) | (cmnd & 0xF0);
LCD_Port &= ~(1<<RS);
LCD_Port |= (1<<EN);
_delay_us(1);
LCD_Port &= ~(1<<EN);
_delay_us(200); /* LCD Power ON delay always >15ms */
LCD_Port = (LCD_Port & 0x0F) | (cmnd << 4); /* sending lower nibble */
LCD_Port |= (1<<EN);
_delay_us(1);
LCD_Port &= ~(1<<EN);
_delay_ms(2);
}
void LCD_Char(unsigned char data) {
LCD_Port = (LCD_Port & 0x0F) | (data & 0xF0); /* sending upper nibble */
LCD_Port |= (1<<RS); /* RS=1, data reg. */
LCD_Port |= (1<<EN);
_delay_us(1);
LCD_Port &= ~(1<<EN);
_delay_us(1);
LCD_Port = (LCD_Port & 0x0F) | (data << 4); /* sending lower nibble */
LCD_Port |= (1<<EN);
_delay_us(1);
LCD_Port &= ~(1<<EN);
_delay_ms(2);
}
void LCD_String(char *str) {
while (*str) {
LCD_Char(*str++);
}
}
void LCD_Init(void) {
LCD_Dir = 0xFF; /* Make LCD command port direction as o/p */
_delay_ms(20); /* LCD Power ON delay always >15ms */
LCD_Command(0x33);
LCD_Command(0x32); /* send for 4 bit initialization of LCD */
LCD_Command(0x28); /* Use 2 line and initialize 5*7 matrix in (4-bit mode)*/
LCD_Command(0x0c); /* Display on cursor off*/
LCD_Command(0x06); /* Increment cursor (shift cursor to right)*/
LCD_Command(0x01); /* Clear display screen*/
_delay_ms(2);
LCD_Command(0x80); /* Cursor 1st row 0th position */
}
// External Interrupt
void port_init(void) {
// Declare PIN for external interrupt:
DDRE &= ~(1 << PD3); // Set PE5 as input
PORTE |= (1 << PD3); // Enable pull-up resistor on PE5
// External Interrupt 5, falling edge triggered
EICRA |= (1 << ISC31); // Set ISC51 for falling edge detection
EICRA &= ~(1 << ISC30); // Clear ISC50 for falling edge detection
EIMSK |= (1 << INT3); // Enable External Interrupt 5
}
void init_devices(void)
{
cli(); // disable all interrupts
port_init();
sei(); // re-enable interrupts
}
void Timer1_Delay(void);
void Timer1_Delay(int milisecond);
void Timer1_Delay()
{
TCNT1=63974;//from calculation
TCCR1A = 0x00;
TCCR1B = (1<<CS00)|(1<<CS02);//prescalar=1024
while(((TIFR1)&(1<<TOV1))==0); //wait for TF0 to roll over
TCCR1B=0;
TCCR1A=0;
TIFR1= 0x01;
}
void Timer1_Delay(int milisecond)
{
int count= ((65535*(4194-(milisecond))/4194));
TCNT1=count;
TCCR1A=0x00;
TCCR1B= (1<<CS00)|(1<<CS02);
while(((TIFR1)&(1<<TOV1))==0);
TCCR1B=0;
TCCR1A=0;
TIFR1=1;
}
ISR(INT3_vect, ISR_NOBLOCK) {
EIMSK &= ~(1 << INT3); // External Interrupt 5 Disable
button = (button==0) ? 1: 0;
EIFR |= (1 << INTF3); // Clear External Interrupt Flag
EIMSK |= (1 << INT3); // External Interrupt 5 enable
}
int main() {
LCD_Init();
cli(); // disable all interrupts
port_init();
sei(); // re-enable interrupts
while (1) {
if(button==1) {
LCD_Command(0x01); // Clear the LCD
LCD_String("Timing Started: ");
while(button==1)
{
Timer1_Delay(100);
time = time + 0.1;
dtostrf(time, 5, 2, Time);
LCD_Command(0xC0);
LCD_String(Time);
}
}
else if(button==0) {
LCD_Command(0x01); // Clear the LCD
LCD_String("Timing Stopped: ");
while(button==0)
{
dtostrf(time, 5, 2, Time);
LCD_Command(0xC0);//clear and write on 2nd line
LCD_String(Time);
}
}
}
return 0;
}