|
|
View previous topic :: View next topic |
Author |
Message |
cbarberis
Joined: 01 Oct 2003 Posts: 172 Location: Punta Gorda, Florida USA
|
LCD Driver for Microchip Explorer16 using PMP module |
Posted: Tue Jul 01, 2008 8:13 am |
|
|
The following code will allow those of you who own a Microchip Explorer16 development board to easily adapt the PCD compiler to drive the Explorer16 lcd module using the PMP module of the PIC24 series in 8bit mode rather than nibble mode. Note, that this code will only work with devices that have the PMP port module only. The advantages of using the PMP module are very clear, as there is no need to bit-bang all the LCD control lines, like: EN, RD/WR..etc which makes the driver code far simpler and more streamlined.
Also for those of you that have the Explorer16 development boards; I will shortly have available a couple of new prototyping extension boards that will interface with the Explorer board, see my web at:
http://www.bartek.com/Bartek/PTB-X.html
CODE:
Code: | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// EXPLCD.C
//// Driver for PIC Explorer16 Board LCD module using PMP Module
////
//// 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
////
//// Modified and improved version of LCD.C by C. Barberis July,1 2008
//// Works only on Explorer16 Board with PIC24 pimm, does NOT work on devices without PMP.
////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Special Display Functions:
#define Write_Inc_LtoR lcd_send_byte(0,0x06) // increments the cursor after writing data from L to R **(normal)
#define Write_Inc_RtoL lcd_send_byte(0,0x07) // increments the cursor after writing data from R to L
#define Write_Dec_LtoR lcd_send_byte(0,0x05) // decrements the cursor after writing data from R to L
#define Write_Dec_RtoL lcd_send_byte(0,0x04) // decrements the cursor after writing data from R to L
#define Display_Blank_No_Clr lcd_send_byte(0,0x08) //display off, without clearing
#define Display_No_Cursor lcd_send_byte(0,0x0C) //display on, cursor off
#define Display_Cursor_On lcd_send_byte(0,0x0E) //display on, cursor on
#define Display_On_Blink lcd_send_byte(0,0x0F) //display on, blinking cursor
#define MoveCursorRight lcd_send_byte(0,0x10) //Move cursor one char to the left, same as '\b'
#define MoveCursorLeft lcd_send_byte(0,0x14) //Move cursor one char to the right
#define MoveCursorHome lcd_send_byte(0,0x02) //Move cursor to top left char position (1,1)
#define ClearScreen lcd_send_byte(0,0x01) //clears the screen an alternate to '\f'
//Define PMP Registers
#word PMCON = 0x600
#word PMMODE = 0x602
#word PMAEN = 0x60C
#word PMADDR = 0x604
#byte PMDIN1 = 0x608
#bit BUSY_BIT = PMMODE.15
#define LCDCMD 0x0 // RS = 0
#define LCDDATA 0x1 // RS =1
#define PMDATA PMDIN1
#define busyLCD() lcd_read_byte(LCDCMD) & 0x80 //BUSY_BIT is used instead
#define lcd_line_two 0x40 // LCD RAM address for the second line
//////// Function Prototypes ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int8 lcd_read_byte(int8 address);
void lcd_init();
void lcd_gotoxy( unsigned int8 x, unsigned int8 y);
void LCDCursor_gotoxy( unsigned int8 x, unsigned int8 y);
void lcd_send_byte( unsigned int8 address, unsigned int8 n );
void lcd_putc( char c);
char lcd_getc( unsigned int8 x, unsigned int8 y);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int8 lcd_read_byte(int8 address)
{
unsigned int8 dummy,data;
while(BUSY_BIT);
PMADDR = address;
dummy = PMDATA;
while(BUSY_BIT);
return(PMDATA);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd_init()
{
unsigned int8 i;
PMCON = 0x83BF; //enable the PMP, long waits
PMMODE = 0x3FF; // PMP set to master mode1
PMAEN = 0x0001; // PMA0 enabled
PMADDR = LCDCMD;
PMDATA = 0x38; // Function set: 8 bit interface, 2 lines, 5X7
delay_us(50);
PMDATA = 0xC; // Function set: display ON ,cursor OFF, blink OFF
delay_us(50);
PMDATA = 0x6; // Function set: increment cursor, no shift
delay_us(50);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd_gotoxy( unsigned int8 x, unsigned int8 y)
{
unsigned int8 address;
if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void LCDCursor_gotoxy( unsigned int8 x, unsigned int8 y)
{
unsigned int8 address;
address+=x-1;
lcd_send_byte(0,0x40|address);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd_send_byte( unsigned int8 address, unsigned int8 n )
{
while(BUSY_BIT);
PMADDR = address;
delay_us(50);
PMDATA = n;
delay_us(50);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void lcd_putc( char c)
{
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(10);
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( unsigned int8 x, unsigned int8 y)
{
char value;
lcd_gotoxy(x,y);
value = lcd_read_byte(LCDDATA);
return(value);
}
void lcd_setcursor_vb(short visible, short blink) // new routine to make cursor visible or blink
{
lcd_send_byte(0, 0xC|(visible<<1)|blink);
}
//////////////////////////////////////////// End of File ///////////////////////////////////////////////////////////////////////////////////////////// |
Last edited by cbarberis on Tue Jun 05, 2012 9:11 am; edited 1 time in total |
|
|
1Razorbill
Joined: 26 Jun 2008 Posts: 2 Location: Phoenix
|
|
Posted: Mon Aug 04, 2008 11:04 am |
|
|
Can you please post an example of how to properly call this code from main?
Also, in the PDM Project Wizard, is it necessary to check the interrupt box labeled "PMP" to activate the Parallel Master Port, or your code will manage the PMP by itself?
Thanks! |
|
|
cbarberis
Joined: 01 Oct 2003 Posts: 172 Location: Punta Gorda, Florida USA
|
|
Posted: Mon Aug 04, 2008 11:23 am |
|
|
You do NOT require the use of the PMP interrupt
From your main() you would call first; lcd_init() also make sure to include EXPLCD.C in your main source file
then, like any other lcd application you can call any of the following functions:
lcd_gotoxy( unsigned int8 x, unsigned int8 y);
LCDCursor_gotoxy( unsigned int8 x, unsigned int8 y);
lcd_send_byte( unsigned int8 address, unsigned int8 n );
lcd_putc( char c);
lcd_getc( unsigned int8 x, unsigned int8 y); |
|
|
1Razorbill
Joined: 26 Jun 2008 Posts: 2 Location: Phoenix
|
|
Posted: Mon Aug 04, 2008 11:40 am |
|
|
Beautifiul.
Thanks! |
|
|
samil
Joined: 21 Aug 2007 Posts: 1
|
|
Posted: Sat Apr 25, 2009 12:27 pm |
|
|
Thanks a lot. It works seamlessly. |
|
|
krys
Joined: 15 Jul 2010 Posts: 1
|
int8.h nt found |
Posted: Thu Jul 15, 2010 4:34 am |
|
|
Hi,
I tried your code here on MPLAB IDE for pic32 but it says int8.h is missing. Can u plz tell me whr I can get this header file.
Thanks
Krys |
|
|
Cityboy
Joined: 09 Jul 2010 Posts: 3
|
Re: LCD Driver for Microchip Explorer16 using PMP module |
Posted: Thu Aug 05, 2010 1:22 am |
|
|
Will it work with dspic33fj? |
|
|
cbarberis
Joined: 01 Oct 2003 Posts: 172 Location: Punta Gorda, Florida USA
|
|
Posted: Tue Jun 05, 2012 9:18 am |
|
|
This driver was intended only to be used using the CCS compiler, it will NOT work on the PIC32 microchip compiler (unless major changes are made). Additionally CCS does not support PIC32 and there is plenty of LCD drivers using the pmp module from Microchip. There is also source code to support the Explorer 16 equipped with a PIC32 pim. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|