LCD Display + Push Button (C Programming) Problem

Salcybercat's Avatar, Join Date: Apr 2010
Newbie Member
Hello! I'm new in PIC programming in C. I was given an FM Radio assignment that required me to write a program to increase and decrease the digits when push buttons are pressed. The microcontroller I'm using PIC18F6490. Below is the part of the program that I have created. I warn you, it is lengthy!

Initialization

Code:
void Init() {

int i;
//	buttons = 0;
	OSCCON = 0b01110010;        	// Select 8 MHz internal oscillator
	LCDSE0 = 0b11111111;        	// Enable  LCD segments 07-00
	LCDSE1 = 0b11111111;        	// Enable  LCD segments 15-08
	LCDSE2 = 0b11111111;        	// Enable  LCD segments 23-16
	LCDSE3 = 0b00000000;        	// Disable LCD segments 31-24
	LCDCON = 0b10001000;         	// Enab LC controller. Static mode. INTRC clock
	LCDPS  = 0b00110110;         	// 37 Hz frame frequency
	ADCON1 = 0b00111111;        	// Make all ADC/IO pins digital
	TRISA = 0b00000011;             // RA0 and RA1 pbutton
	TRISB = 0b00100001;				// RB0 and RB5 pbutton
	TRISC = 0b00011000;				// RC3 and RC4 do the I2C bus
	TRISG = 0b11111111;				// RG0, RG1 & RG3 pbutton
	PORTA = 0;
	PORTB = 0;
	PORTC = 0;
    INTCONbits.TMR0IF = 0;          // Clear timer flag
	T0CON = 0b00000011;				// Prescale by 16
    T0CON = 0b00001000;             // No prescale
    TMR0H = 0;                      // Clear timer count
    TMR0L = 0;
    T0CONbits.TMR0ON = 1;           // Start timer
	OpenI2C( MASTER, SLEW_OFF);
	SSPADD = 0x3F;
//	vi = 8;
}
Assigning bits to LCD segments
Code:
void digwrt(int num1, int num2, int num3)
{


	switch (num1){
		case 0: LCDDATA0 = 0b00111111; 
				LCDDATA2 = 0b01000000;break;
		case 1: LCDDATA0 = 0b00000110; 	LCDDATA2 = 0b01000000;break;
		case 2: LCDDATA0 = 0b01011011; 	LCDDATA2 = 0b01000000;break;
		case 3: LCDDATA0 = 0b01001111; 	LCDDATA2 = 0b01000000;break;
		case 4: LCDDATA0 = 0b01100110; 	LCDDATA2 = 0b01000000;break;	
		case 5: LCDDATA0 = 0b01101101;	LCDDATA2 = 0b01000000;break;	
		case 6: LCDDATA0 = 0b01111101; 	LCDDATA2 = 0b01000000;break;	
		case 7: LCDDATA0 = 0b00000111; 	LCDDATA2 = 0b01000000;break;	
		case 8: LCDDATA0 = 0b01111111; 	LCDDATA2 = 0b01000000;break;	
		case 9: LCDDATA0 = 0b01101111; 	LCDDATA2 = 0b01000000;break;	
	}			
		
		switch (num2){
		
		case 0: LCDDATA1 = 0b00011111; 
		`		LCDDATA0 = LCDDATA0 ^= 0b10000000;
				LCDDATA2 = 0b01000000; break;
	
		case 1: LCDDATA1 = 0b00000011; 	LCDDATA2 = 0b01000000;break;
				
		case 2: LCDDATA1 = 0b00101101; 
				LCDDATA0 = LCDDATA0 ^= 0b10000000; 	LCDDATA2 = 0b01000000;break;
		case 3: LCDDATA1 = 0b00100111; 
				LCDDATA0 = LCDDATA0 ^= 0b10000000; 	LCDDATA2 = 0b01000000;break;
		
		case 4: LCDDATA1 = 0b00110011; 
				 	LCDDATA2 = 0b01000000;break;
				
		case 5: LCDDATA1 = 0b00110110;
				LCDDATA0 = LCDDATA0 ^= 0b10000000;	LCDDATA2 = 0b01000000;break;
				
		case 6: LCDDATA1 = 0b00111110;
				LCDDATA0 = LCDDATA0 ^= 0b10000000;	LCDDATA2 = 0b01000000;break;
				
		case 7: LCDDATA1 = 0b00000011;
				LCDDATA0 = LCDDATA0 ^= 0b10000000;	LCDDATA2 = 0b01000000;break;
					
		case 8: LCDDATA1 = 0b00111111; 
				LCDDATA0 = LCDDATA0 ^= 0b10000000;	LCDDATA2 = 0b01000000;break;		
		
		case 9: LCDDATA1 = 0b00110111;
				LCDDATA0 = LCDDATA0 ^= 0b10000000; 	LCDDATA2 = 0b01000000;break;	
		}
		
	
		switch (num3){
		case 0: LCDDATA0 = LCDDATA0 ^= 0b10000000; 
				LCDDATA2 = 0b01001111; 
				LCDDATA1 = LCDDATA1 ^= 0b11000000; break;
	
		case 1:	LCDDATA2 = 0b01000001;
				LCDDATA1 = LCDDATA1 ^= 0b10000000; break;
		
		case 2: 
				LCDDATA2 = 0b01010110; 
				LCDDATA1 = LCDDATA1 ^= 0b11000000; break;
				
		case 3: 
				LCDDATA2 = 0b01010011; 
				LCDDATA1 = LCDDATA1 ^= 0b11000000; break;
		
		case 4: LCDDATA2 = 0b01011001;
				LCDDATA1 = LCDDATA1 ^= 0b10000000; break;
				
		case 5: LCDDATA2 = 0b01011011;
				LCDDATA1 = LCDDATA1 ^= 0b01000000; break;
				
		case 6: LCDDATA2 = 0b01011111;
				LCDDATA1 = LCDDATA1 ^= 0b01000000; break;
					
		case 7: LCDDATA2 = 0b01000001;
				LCDDATA1 = LCDDATA1 ^= 0b11000000; break;
					
		case 8: LCDDATA2 = 0b01011111; 
				LCDDATA1 = LCDDATA1 ^= 0b11000000; break;			
		
		case 9: LCDDATA2 = 0b01011011;
				LCDDATA1 = LCDDATA1 ^= 0b11000000; break;	
		
		case 10:
				LCDDATA2 = 0b01101111; 
				LCDDATA1 = LCDDATA1 ^= 0b11000000; break;
	}
}
Increment & Decrement of Digits (By pressing push button RA0 and RA1 respectively)

Code:
void main(void) {

	unsigned char in=0,m=0,n=0;
	
	int c, gerr, x, y, z;

	
	int f;
	dly(20);
	Init();	
	FMinit();
	
x=5;
y=8;
z=8;
digwrt(x,y,z);

for (;;) {

dly(200);

 if (!PORTAbits.RA0){	
 		x++;
 			if((x==1)&&(y==8)&&(z==10)){
				x=5;
				y=7;
				z=8;
			digwrt(x,y,z);
			}
			
		   else if(x==10){
		  	x=0;
 			y++;
 				if(y==10){
				y=0;
				z++;
					if(z==10){
						z=10;
					}
	}
	
 			
 			digwrt(x,y,z);
 		}
 		else{
  		digwrt(x,y,z);
 		dly(100);
 	
 		}
	
	f = (x+(10*y)+(100*z))+690;
 		FMfrequenc(f);
	
	}
	
	
	else if(!PORTAbits.RA1){
	
		x--;	
		
		if((x==4)&&(y==7)&&(z==8)){
				x=0;
				y=8;
				z=10;
			digwrt(0,8,10);
		}		
	
		 else if(x==-1){
		  	x=9;
 			y--;
 				if(y==-1){
				y=9;
				z--;
	}
 			digwrt(x,y,z);
 		}
 		else{
  		digwrt(x,y,z);
 		dly(100);
 		}
 		
 			f = (x+(10*y)+(100*z))+690;
 			FMfrequenc(f);
	}
This third part is where the problem is located. When power is supplied to the LCD, the program starts counting automatically from 88.5 to 108.1 automatically with continuous looping and there is no effect when we pushed the RA0/RA1 button. There is no hardware issues with the pushbutton (the voltage goes from Vdd to 0v when pressed), so I am quite confused.

Any help is very much appreciated I could also supply the whole code if it is necessary to help you guys analyze the program.
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
You might find this place more helpful:
http://www.electro-tech-online.com/microcontrollers/