Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Port A not working when LCD.c is included??

Status
Not open for further replies.

ZS1BFE

Member level 1
Joined
Nov 17, 2007
Messages
40
Helped
1
Reputation
2
Reaction score
0
Trophy points
1,286
Location
Cape Town South Africa
Activity points
1,612
I use Pic16f877 with LCD.c

When I include LCD.c, I cannot use Port A as an output??

I have configured LCD.c for C1,C2,C3.
All is working fine with LCD.
I cannot see that LCD.c use port A at all.
Please help??
THX
 

sorry i didn't get it post some code may be help and which compiler u used?
 

Sorry, forgot the code>>>

Code:
#fuses NOLVP

#include <LCD.C>

set_tris_a(0b00000);

void main() {

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   
  lcd_init();
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_RB);
   enable_interrupts(global);
while(1)
{
output_A(0b11111);
delay_ms(100);
output_A(0b00000);
delay_ms(100);
}
}

- - - Updated - - -

I use PIC C (PCW)

Code included, sorry...
 

ok u say i include LCD.C so which place u include that file is that any other code to related this file and also put purly 8bit binary form like set_tris_a(0b00000); to set_tris_a(0b00000000); and any other place that us used.
 

Post CCS C LCD.c file and mention how your LCD is connected to PORTC.

PORTA can be used for LCD DATA.


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//include device header here
 
#fuses NOLVP
#fuses NOWDT
 
//fuses related to clock here
//Clock should be mentioned here
 
 
#define LCD_ENABLE_PIN  PIN_C2                                   
#define LCD_RS_PIN      PIN_C0                                    
#define LCD_RW_PIN      PIN_C1                                    
#define LCD_DATA4       PIN_A0                                    
#define LCD_DATA5       PIN_A1                                    
#define LCD_DATA6       PIN_A2                                    
#define LCD_DATA7       PIN_A3 
 
#include <LCD.C>
 
 
void main() {
 
    
   setup_adc_ports(NO_ANALOGS);
   
   
   lcd_init();
   lcd_putc("\fEdaboard\n");
  
   while(1);
}

 
Last edited:

I ahve made mistake in my 1st post. I did not change anything to Port C. All LCD connections are as it was on Port D and connected as in LCD.c
The LCD.c is the standard file that comes with PCW.

Works 100%.

But cannot get Port A to flash>>>

- - - Updated - - -

The code from LCD.c here

Code:
////////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                 ////
////                 Driver for common LCD modules                      ////
////                                                                    ////
////  lcd_init()   Must be called before any other function.            ////
////                                                                    ////
////  lcd_putc(c)  Will display c on the next position of the LCD.      ////
////                     The following have special meaning:            ////
////                      \f  Clear display                             ////
////                      \n  Go to start of second line                ////
////                      \b  Move back one position                    ////
////                                                                    ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)     ////
////                                                                    ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD          ////
////                                                                    ////
////////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,1997 Custom Computer Services            ////
//// This source code may only be used by licensed users of the CCS C   ////
//// compiler.  This source code may only be distributed to other       ////
//// licensed users of the CCS C compiler.  No other use, reproduction  ////
//// or distribution is permitted without written permission.           ////
//// Derivative programs created using this software in object code     ////
//// form are not restricted in any way.                                ////
////////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map {                 // This structure is overlayed
           boolean enable;           // on to an I/O port to gain
           boolean rs;               // access to the LCD pins.
           boolean rw;               // The bits are allocated from
           boolean unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;



#if defined(__PCH__)
#if defined use_portb_lcd
   #byte lcd = 0xF81                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
   #byte lcd = 6                  // on to port B (at address 6)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_portb_lcd
   #define set_tris_lcd(x) set_tris_b(x)
#else
   #define set_tris_lcd(x) set_tris_d(x)
#endif



#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40    // LCD RAM address for the second line


byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

STRUCT lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in




byte lcd_read_byte() {
      byte low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( byte n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( byte address, byte n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    byte i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( byte x, byte y) {
   byte address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( byte x, byte y) {
   char value;

    lcd_gotoxy(x,y);
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
 

ok then first of make try to porta is output so related analog pin make disable and your code
Code:
set_tris_a(0b00000);
this line set to the main function and before while(1) loop.have u tried or not?
 

The code in post #3 makes no sense.

You are enabling interrupts without defining an interrupt function. Most likely the processor gets stuck and code execution never reaches the point where port A is accessed.
 

Can't help you without knowing the device, Fosc, connections of LCD and LEDs. Maybe you have set to use External OSC and PORTA is conected to LEDs. See if that is the reason then see if PORTA has OSCx pins. If internal OSC is used then OSCx pins if any on PORTA should be an IO pin to use for LEDs.

Also blinking delays should be >= 500 ms.


Code C - [expand]
1
2
3
4
output_high(PORTA);
delay_ms(500);
output_low(PORTA);
delay_ms(500);




Edit:

Above code is wrong. Sorry for my mistake.


Code C - [expand]
1
2
3
4
output_high(PIN_A0);
delay_ms(500);
output_low(PIN_A0);
delay_ms(500);




Code C - [expand]
1
2
3
4
output_a(0xff);
delay_ms(500);
output_a(0x00);
delay_ms(500);

 
Last edited:

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top