Click here to Skip to main content
15,891,828 members
Please Sign up or sign in to vote.
5.00/5 (1 vote)
See more:
i have to write a code for lcd 16*2 using two potentiometers two read two analog values and display the on lcd on two lines



Analog voltage of the first potentiometer is only updated on the first line of the LCD when the push button is pressed



Analog voltage of the second potentiometer is updated on the second line of the LCD automatically every second (hint you can use timer 1 with overflow interrupt routine to update the voltage value)

i wrote this code but when the button is pressed

both of two potentiometers are changing values !!

What I have tried:

#include <mega328p.h>

#include <stdio.h>

#include <delay.h>



// Alphanumeric LCD functions

#include <alcd.h>



// Declare your global variables here

char lcd[5];

char lcd2[5];

unsigned int Result;

unsigned int Result2;

float x;

float b;



// Timer1 overflow interrupt service routine





// Voltage Reference: AREF pin

#define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))



// Read the AD conversion result

unsigned int read_adc(unsigned char adc_input)

{

ADMUX=adc_input | ADC_VREF_TYPE;

// Delay needed for the stabilization of the ADC input voltage

delay_us(10);

// Start the AD conversion

ADCSRA|=(1<<ADSC);

// Wait for the AD conversion to complete

while ((ADCSRA & (1<<ADIF))==0);

ADCSRA|=(1<<ADIF);

return ADCW;

}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{





TCNT1H=0xBDC >> 8;

TCNT1L=0xBDC & 0xff;

lcd_gotoxy(0,1);

lcd_puts("Pot2=");

lcd_gotoxy(5,1);

Result2=read_adc(1);

x=Result2*5.0/1023;



sprintf(lcd2,"%.2f",x);

lcd_puts(lcd2);

lcd_gotoxy(10,1);

lcd_puts("Volt");

// Place your code here



// Reinitialize Timer1 value





}











void main(void)

{

// Declare your local variables here





// Crystal Oscillator division factor: 1

#pragma optsize-

CLKPR=(1<<CLKPCE);

CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif





// Input/Output Ports initialization

// Port B initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T

PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);



// Port C initialization

// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);

// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T

PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);



// Port D initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=P Bit1=T Bit0=T

PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (1<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);



// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=0xFF

// OC0A output: Disconnected

// OC0B output: Disconnected

TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);

TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);

TCNT0=0x00;

OCR0A=0x00;

OCR0B=0x00;



// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 62.500 kHz

// Mode: Normal top=0xFFFF

// OC1A output: Disconnected

// OC1B output: Disconnected

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer Period: 1 s

// Timer1 Overflow Interrupt: On

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);

TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10);

TCNT1H=0x0B;

TCNT1L=0xDC;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;



// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer2 Stopped

// Mode: Normal top=0xFF

// OC2A output: Disconnected

// OC2B output: Disconnected

ASSR=(0<<EXCLK) | (0<<AS2);

TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);

TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);

TCNT2=0x00;

OCR2A=0x00;

OCR2B=0x00;



// Timer/Counter 0 Interrupt(s) initialization

TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);



// Timer/Counter 1 Interrupt(s) initialization

TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);



// Timer/Counter 2 Interrupt(s) initialization

TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);



// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// Interrupt on any change on pins PCINT0-7: Off

// Interrupt on any change on pins PCINT8-14: Off

// Interrupt on any change on pins PCINT16-23: Off

EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

EIMSK=(0<<INT1) | (0<<INT0);

PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);



// USART initialization

// USART disabled

UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);



// Analog Comparator initialization

// Analog Comparator: Off

// The Analog Comparator's positive input is

// connected to the AIN0 pin

// The Analog Comparator's negative input is

// connected to the AIN1 pin

ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

// Digital input buffer on AIN0: On

// Digital input buffer on AIN1: On

DIDR1=(0<<AIN0D) | (0<<AIN1D);



// ADC initialization

// ADC Clock frequency: 125.000 kHz

// ADC Voltage Reference: AREF pin

// ADC Auto Trigger Source: Free Running

// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On

// ADC4: On, ADC5: On

DIDR0=(0<<ADC5D) | (0<<ADC4D) | (0<<ADC3D) | (0<<ADC2D) | (0<<ADC1D) | (0<<ADC0D);

ADMUX=ADC_VREF_TYPE;

ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);

ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);



// SPI initialization

// SPI disabled

SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);



// TWI initialization

// TWI disabled

TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);



// Alphanumeric LCD initialization

// Connections are specified in the

// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:

// RS - PORTD Bit 0

// RD - PORTD Bit 1

// EN - PORTD Bit 3

// D4 - PORTD Bit 4

// D5 - PORTD Bit 5

// D6 - PORTD Bit 6

// D7 - PORTD Bit 7

// Characters/line: 16





// Global enable interrupts



#asm("sei")

lcd_init(16);



while (1)



{

while( (PIND & ( 1 << PIND2)) == 0){

lcd_gotoxy(0,0);

lcd_puts("Pot1=");

lcd_gotoxy(5,0);

Result=read_adc(0);

b=Result*5.0/1023;



sprintf(lcd,"%.2f",b);

lcd_puts(lcd);

lcd_gotoxy(10,0);

lcd_puts("Volt");

delay_ms(250);







}



}

}
Posted
Comments
Member 15078716 20-Jul-22 0:31am    
You might not have everything working, but what you have done so far I consider impressive. I think that I have learned from it.

Thank you.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900