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.

[General] Need help in MplabX and pic24f

Status
Not open for further replies.
i build also this project but when i m modify the configuraion of pin of LCD he doesnt work in isis i m modify
Code:
// LCD display ports etc
#define LCDdata LATE					// data port
#define LCDdataEnable	TRISE
#define RS LATBbits.LATB15				// RS bit in LCDstatus
#define RW LATDbits.LATD5				// read/write bit in LCDstatus
#define E  LATDbits.LATD4   			// enable bit in LCDstatus
#define Eenable TRISDbits.TRISD4
#define ERSenable TRISDbits.TRISD5
#define RWenable TRISBbits.TRISB15
with
Code:
#define LCDdata LATE					// data port
#define LCDdataEnable	TRISE
//#define RS LATBbits.LATB15				// RS bit in LCDstatus
#define RW LATDbits.LATD5				// read/write bit in LCDstatus
//#define E  LATDbits.LATD4   			// enable bit in LCDstatus
//#define Eenable TRISDbits.TRISD4
//#define ERSenable TRISDbits.TRISD5
#define RWenable TRISBbits.TRISB15

#define RS LATDbits.LATD0
#define E LATDbits.LATD1
#define LCD_D4 LATDbits.LATD2
#define LCD_D5 LATDbits.LATD3
#define LCD_D6 LATDbits.LATD4
#define LCD_D7 LATDbits.LATD5

#define ERSenable TRISDbits.TRISD0
#define Eenable TRISDbits.TRISD1
#define LCD_D4_Direction TRISDbits.TRISD2
#define LCD_D5_Direction TRISDbits.TRISD3
#define LCD_D6_Direction TRISDbits.TRISD4
#define LCD_D7_Direction TRISDbits.TRISD5
I dont know why in your configurtion you aven't define al the pin?
 

I dont know why in your configurtion you aven't define al the pin?

which pin? I don't have an explorer 16 with a working LCD at the moment but I seem to remember the code working

I certainly have code operating on a LCD on a Bytronic PIC24 mechatronics trianer
**broken link removed**

this is the working code (pins could be different to the explorer 16)
Code:
// lcd.c -  functions for the PC1602-J lcd display 4-bit mode
//
// see http://www.repairfaq.org/filipg/LINK/F_LCD_progr.html

#include "hardware.h"
#include "lcd.h"
#include <libpic30.h>	// for __delay_us FCY must be defined!

// LCD display ports etc
#define LCDdata LATE		// data port
#define LCDstatus LATEbits    	// control/status port
#define RS LATE4				// RS bit in LCDstatus
#define RW LATE5				// read/write bit in LCDstatus
#define E  LATE6   				// enable bit in LCDstatus

//void lcd_delay() { __delay_us(800); }//mSecDelay(1); }  // if LCD does not work make this longer

// Write a nibble to the LCD
// may have to adjust delays to suit the processor and clock
void lcdNibble(int n)
{
    int lcd=LCDdata;
//	lcd_delay();
	__delay_us(800); 
  	LCDdata = (lcd&0xfff0) | ((n & 0x0f));			// send out lower Nibble
	//lcd_delay();
// 	__delay_us(1); 
  	Nop();					// Wait E Pulse width time (min 230ns)
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();

  LCDstatus.E=1;					// take clock E high 
// 	__delay_us(1); 
	Nop();					// Wait E Pulse width time (min 230ns)
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();

	//lcd_delay();
    LCDstatus.E=0;
 	__delay_us(800); 
	//lcd_delay();
 }

// Write a Control Command to the LCD
// This is written as two nibbles
void lcdCmd(int c)
{
 	LCDstatus.RS=0;			        // Take RS pin low for command
	lcdNibble(c >>4);		        // Makeup Upper Nibble
	lcdNibble(c);			        // Makeup Lower Nibble
}

// write a data byte to LCD
int lcdPutchar(int d)
{
//    printf("%c", d);
	LCDstatus.RS=1; 				// Take RS pin high for data
	lcdNibble(d >>4);     		    // Makeup Upper Nibble
	lcdNibble(d);		            // Makeup Lower Nibble
    return 1;
}

// Initialise the LCD in 4bit Mode
void lcdInit()
{
   // TRISEbits.TRISE4=0;  	// set RS and E bits output
    //TRISDbits.TRISD1=0;  	// set RS and E bits output
    TRISE &= 0x0;          // set bits 0-3 output for data
    TRISE |= 0x80;
 	LCDstatus.RS=0;			// Take RS pin low for command
 	LCDstatus.RW=0;			// Take RS pin low for WRITE
	lcdNibble(0x3);		// This put the LCD into Soft Reset 
	lcdNibble(0x3);
	lcdNibble(0x3);
	lcdNibble(0x2);
	lcdCmd(0x28);			// 2 line, 4 bit mode 
    lcdCmd(0x6);			// increment cursor after each write
    lcdCmd(0x1);			// clear display
    lcdCmd(0x2);			// home
    lcdCmd(0xF);			// turn disply on
}

// move to line (1 or 2) at position >= 1
void lcdCursor(unsigned char line,unsigned char position)
{
#define lcd_line_1 0x00 // LCD RAM address for the 1st line
#define lcd_line_2 0x40 // LCD RAM address for the 2nd line
#define lcd_line_3 0x14 // LCD RAM address for the 3rd line
#define lcd_line_4 0x54 // LCD RAM address for the 4th line 
   char lineAddress[]={0x00, 0x40, 0x14, 0x54 };
   lcdCmd ((0x80 | lineAddress[line-1]) + position -1 );
 /*  switch (line)
	{
	  case 1:lcdCmd (0x80 + position -1 );lcdCmd (0x80 + position -1 ); break;
	  case 2:lcdCmd (0xc0 + position -1 ); lcdCmd (0xc0 + position -1 ); break;
	  default : break;
  	}*/
//  lcd_delay();
  
}

void lcdString(unsigned char line, unsigned char position, char *string)
{

	lcdCursor(line,position);
	while (*string)
	  lcdPutchar(*string++);

}

// display string on line starting at position 1, clear rest of line
void lcdStringOnLine(unsigned char line, char *string)
{
	lcdCursor(line,1);
	int i=0;
	for(i=0; (i<20) && (*string); i++, string++)
	  lcdPutchar(*string);
    while(i++<20)
	  lcdPutchar(' ');
}

void lcdStringAtCursor(char *string)
{
    //printf("lcdStringAtCursor %s\n", string);
	while (*string)
	  lcdPutchar(*string++);
}

void lcdClear(void)
{
	lcdCmd(0x01);
}

void lcdHome(void)
{
	lcdCmd(0x02);
}


// clear line 1 or line 2
void lcdClearLine(unsigned char line)
{
	unsigned char i;
	lcdCursor(line,1);
	for (i=0; i<20; i++) lcdPutchar(' ');
	lcdCursor(line,1);
}

void LCDtest(void)
{
	//mSecElapsed(const int counter, const int reset, const long unsigned int delay);
	mSecElapsed(2,3,0);
	int count=0;
	while(!mSecElapsed(2, 0, 10000))
		{ lcdString(2,1, "Mechatronics trainer"); ; count++; }
	printf("LCD count X %d\n", count);
}

FCY is defined in hradware.h as
Code:
#define SYSCLK  32000000UL		// 8MHz clock with FNOSC_PRIPLL (baud rate max is 115200)
#define FCY  (SYSCLK/2)		// 8MHz clock with FNOSC_PRIPLL (baud rate max is 115200)
 
  • Like
Reactions: ings

    ings

    Points: 2
    Helpful Answer Positive Rating
ah ok, i think that code work with your board card not with explorer 16 .
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top