1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

LCD Display + Push Button (C Programming) Problem

Discussion in 'C' started by Salcybercat, Mar 20, 2011.

  1. Salcybercat

    Salcybercat New Member

    Joined:
    Apr 13, 2010
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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.
     
  2. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,012
    Likes Received:
    203
    Trophy Points:
    0
    Occupation:
    Senior Support Engineer
    Location:
    England

Share This Page