#include <stdio.h>
#include <LPC21xx.H> /* LPC21xx definitions */
#include <stdarg.h>
#include <string.h>
/*********************** Hardware specific configuration **********************/
/*------------------------- Speed dependant settings -------------------------*/
/* If processor works on high frequency delay has to be increased, it can be
increased by factor 2^N by this constant */
#define DELAY_2N 0
/*------------------------- Text LCD size definitions ------------------------*/
#define LineLen 16 /* Width (in characters) */
#define NumLines 2 /* Hight (in lines) */
/*-------------------- LCD interface hardware definitions --------------------*/
/* PINS:
- DB4 = P1.24
- DB5 = P1.25
- DB6 = P1.26
- DB7 = P1.27
- E = P1.31
- RW = P1.29
- RS = P1.28 */
/*These need changing according to what pins YOU want to use */
/*These need changing according to what pins YOU want to use */
/*These need changing according to what pins YOU want to use */
/*These need changing according to what pins YOU want to use */
/*These need changing according to what pins YOU want to use */
/*These need changing according to what pins YOU want to use */
#define PIN_E 0x80000000
#define PIN_RW 0x20000000
#define PIN_RS 0x10000000
#define PINS_CTRL 0xB0000000
#define PINS_DATA 0x0F000000
/* pin E setting to 0 or 1 */
#define LCD_E(x) ((x) ? (IOSET1 = PIN_E) : (IOCLR1 = PIN_E) );
/* pin RW setting to 0 or 1 */
#define LCD_RW(x) ((x) ? (IOSET1 = PIN_RW) : (IOCLR1 = PIN_RW));
/* pin RS setting to 0 or 1 */
#define LCD_RS(x) ((x) ? (IOSET1 = PIN_RS) : (IOCLR1 = PIN_RS));
/* Reading DATA pins */
#define LCD_DATA_IN ((IOPIN1 >> 24) & 0xF)
/* Writing value to DATA pins */
#define LCD_DATA_OUT(x) IOCLR1 = PINS_DATA; IOSET1 = (x & 0xF) << 24;
/* Setting all pins to output mode */
#define LCD_ALL_DIR_OUT IODIR1 |= PINS_CTRL | PINS_DATA;
/* Setting DATA pins to input mode */
#define LCD_DATA_DIR_IN IODIR1 &= ~PINS_DATA;
/* Setting DATA pins to output mode */
#define LCD_DATA_DIR_OUT IODIR1 |= PINS_DATA;
/******************************************************************************/
/* 8 user defined characters to be loaded into CGRAM (used for bargraph) */
const unsigned char UserFont[8][8] = {
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
{ 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 },
{ 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C },
{ 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E },
{ 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
};
/************************ Global function definitions *************************/
/*******************************************************************************
* Delay in while loop cycles *
* Parameter: cnt: number of while cycles to delay *
* Return: *
*******************************************************************************/
static void delay (int cnt)
{
cnt <<= DELAY_2N;
while (cnt--);
}
/*******************************************************************************
* Read status of LCD controller *
* Parameter: none *
* Return: Status byte contains busy flag and address pointer *
*******************************************************************************/
static unsigned char lcd_read_status (void)
{
unsigned char status;
LCD_DATA_DIR_IN
LCD_RS(0)
LCD_RW(1)
delay(10);
LCD_E(1)
delay(10);
status = LCD_DATA_IN << 4;
LCD_E(0)
delay(10);
LCD_E(1)
delay(10);
status |= LCD_DATA_IN;
LCD_E(0)
LCD_DATA_DIR_OUT
return (status);
}
/*******************************************************************************
* Wait until LCD controller busy flag is 0 *
* Parameter: *
* Return: Status byte of LCD controller (busy + address) *
*******************************************************************************/
static unsigned char wait_while_busy (void)
{
unsigned char status;
do {
status = lcd_read_status();
} while (status & 0x80); /* Wait for busy flag */
return (status);
}
/*******************************************************************************
* Write 4-bits to LCD controller *
* Parameter: c: command to be written *
* Return: *
*******************************************************************************/
void lcd_write_4bit (unsigned char c)
{
LCD_RW(0)
LCD_E(1)
LCD_DATA_OUT(c&0x0F)
delay(10);
LCD_E(0)
delay(10);
}
/*******************************************************************************
* Write command to LCD controller *
* Parameter: c: command to be written *
* Return: *
*******************************************************************************/
void lcd_write_cmd (unsigned char c)
{
wait_while_busy();
LCD_RS(0)
lcd_write_4bit (c>>4);
lcd_write_4bit (c);
}
/*******************************************************************************
* Write data to LCD controller *
* Parameter: c: data to be written *
* Return: *
*******************************************************************************/
static void lcd_write_data (unsigned char c)
{
wait_while_busy();
LCD_RS(1)
lcd_write_4bit (c>>4);
lcd_write_4bit (c);
}
/*******************************************************************************
* Print Character to current cursor position *
* Parameter: c: character to be printed *
* Return: *
*******************************************************************************/
void lcd_putchar (char c)
{
lcd_write_data (c);
}
/*******************************************************************************
* Initialize the LCD controller *
* Parameter: *
* Return: *
*******************************************************************************/
void lcd_init (void)
{
int i;
unsigned char const *p;
/* Set all pins for LCD as outputs */
LCD_ALL_DIR_OUT
delay (15000);
LCD_RS(0)
lcd_write_4bit (0x3); /* Select 4-bit interface */
delay (4100);
lcd_write_4bit (0x3);
delay (100);
lcd_write_4bit (0x3);
lcd_write_4bit (0x2);
lcd_write_cmd (0x28); /* 2 lines, 5x8 character matrix */
lcd_write_cmd (0x0C); /* Display ctrl:Disp=ON,Curs/Blnk=OFF */
lcd_write_cmd (0x06); /* Entry mode: Move right, no shift */
/* Load user-specific characters into CGRAM */
lcd_write_cmd(0x40); /* Set CGRAM address counter to 0 */
p = &UserFont[0][0];
for (i = 0; i < sizeof(UserFont); i++, p++)
lcd_putchar (*p);
lcd_write_cmd(0x80); /* Set DDRAM address counter to 0 */
}
/*******************************************************************************
* Set cursor position on LCD display *
* Parameter: column: column position *
* line: line position *
* Return: *
*******************************************************************************/
void set_cursor (unsigned char column, unsigned char line)
{
unsigned char address;
address = (line * 40) + column;
address = 0x80 + (address & 0x7F);
lcd_write_cmd(address); /* Set DDRAM address counter to 0 */
}
/*******************************************************************************
* Clear the LCD display *
* Parameter: *
* Return: *
*******************************************************************************/
void lcd_clear (void)
{
lcd_write_cmd(0x01); /* Display clear */
set_cursor (0, 0);
}
/*******************************************************************************
* Print sting to LCD display *
* Parameter: string: pointer to output string *
* Return: *
*******************************************************************************/
void lcd_print (unsigned char const *string)
{
while (*string) {
lcd_putchar (*string++);
}
}
/******************************************************************************/
void lcd_printf ( int x, int y,const char * format, ... )
{
va_list argptr;
char buffer[20];
va_start(argptr, format);
vsprintf(buffer, format, argptr);
va_end(argptr);
set_cursor (x,y);
lcd_print((unsigned char*)buffer);
}
extern void lcd_init (void);
extern void lcd_clear (void);
extern void lcd_putchar (char c);
extern void set_cursor (unsigned char column, unsigned char line);
extern void lcd_print (unsigned char const *string);
void lcd_printf ( int x, int y,const char * format, ... );
lcd_printf("rf-id %d",1234);
Yes what pins do you want to use for your LCD, you need 4 data lines and 4 control lines
View attachment 62994
then create an empty file called lcd.c
and paste the following code.
Code:#include <stdio.h> #include <LPC21xx.H> /* LPC21xx definitions */ #include <stdarg.h> #include <string.h> /*********************** Hardware specific configuration **********************/ /*------------------------- Speed dependant settings -------------------------*/ /* If processor works on high frequency delay has to be increased, it can be increased by factor 2^N by this constant */ #define DELAY_2N 0 /*------------------------- Text LCD size definitions ------------------------*/ #define LineLen 16 /* Width (in characters) */ #define NumLines 2 /* Hight (in lines) */ /*-------------------- LCD interface hardware definitions --------------------*/ /* PINS: - DB4 = P1.24 - DB5 = P1.25 - DB6 = P1.26 - DB7 = P1.27 - E = P1.31 - RW = P1.29 - RS = P1.28 */ /*These need changing according to what pins YOU want to use */ /*These need changing according to what pins YOU want to use */ /*These need changing according to what pins YOU want to use */ /*These need changing according to what pins YOU want to use */ /*These need changing according to what pins YOU want to use */ /*These need changing according to what pins YOU want to use */ #define PIN_E 0x80000000 #define PIN_RW 0x20000000 #define PIN_RS 0x10000000 #define PINS_CTRL 0xB0000000 #define PINS_DATA 0x0F000000 /* pin E setting to 0 or 1 */ #define LCD_E(x) ((x) ? (IOSET1 = PIN_E) : (IOCLR1 = PIN_E) ); /* pin RW setting to 0 or 1 */ #define LCD_RW(x) ((x) ? (IOSET1 = PIN_RW) : (IOCLR1 = PIN_RW)); /* pin RS setting to 0 or 1 */ #define LCD_RS(x) ((x) ? (IOSET1 = PIN_RS) : (IOCLR1 = PIN_RS)); /* Reading DATA pins */ #define LCD_DATA_IN ((IOPIN1 >> 24) & 0xF) /* Writing value to DATA pins */ #define LCD_DATA_OUT(x) IOCLR1 = PINS_DATA; IOSET1 = (x & 0xF) << 24; /* Setting all pins to output mode */ #define LCD_ALL_DIR_OUT IODIR1 |= PINS_CTRL | PINS_DATA; /* Setting DATA pins to input mode */ #define LCD_DATA_DIR_IN IODIR1 &= ~PINS_DATA; /* Setting DATA pins to output mode */ #define LCD_DATA_DIR_OUT IODIR1 |= PINS_DATA; /******************************************************************************/ /* 8 user defined characters to be loaded into CGRAM (used for bargraph) */ const unsigned char UserFont[8][8] = { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 }, { 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 }, { 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C }, { 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E }, { 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }; /************************ Global function definitions *************************/ /******************************************************************************* * Delay in while loop cycles * * Parameter: cnt: number of while cycles to delay * * Return: * *******************************************************************************/ static void delay (int cnt) { cnt <<= DELAY_2N; while (cnt--); } /******************************************************************************* * Read status of LCD controller * * Parameter: none * * Return: Status byte contains busy flag and address pointer * *******************************************************************************/ static unsigned char lcd_read_status (void) { unsigned char status; LCD_DATA_DIR_IN LCD_RS(0) LCD_RW(1) delay(10); LCD_E(1) delay(10); status = LCD_DATA_IN << 4; LCD_E(0) delay(10); LCD_E(1) delay(10); status |= LCD_DATA_IN; LCD_E(0) LCD_DATA_DIR_OUT return (status); } /******************************************************************************* * Wait until LCD controller busy flag is 0 * * Parameter: * * Return: Status byte of LCD controller (busy + address) * *******************************************************************************/ static unsigned char wait_while_busy (void) { unsigned char status; do { status = lcd_read_status(); } while (status & 0x80); /* Wait for busy flag */ return (status); } /******************************************************************************* * Write 4-bits to LCD controller * * Parameter: c: command to be written * * Return: * *******************************************************************************/ void lcd_write_4bit (unsigned char c) { LCD_RW(0) LCD_E(1) LCD_DATA_OUT(c&0x0F) delay(10); LCD_E(0) delay(10); } /******************************************************************************* * Write command to LCD controller * * Parameter: c: command to be written * * Return: * *******************************************************************************/ void lcd_write_cmd (unsigned char c) { wait_while_busy(); LCD_RS(0) lcd_write_4bit (c>>4); lcd_write_4bit (c); } /******************************************************************************* * Write data to LCD controller * * Parameter: c: data to be written * * Return: * *******************************************************************************/ static void lcd_write_data (unsigned char c) { wait_while_busy(); LCD_RS(1) lcd_write_4bit (c>>4); lcd_write_4bit (c); } /******************************************************************************* * Print Character to current cursor position * * Parameter: c: character to be printed * * Return: * *******************************************************************************/ void lcd_putchar (char c) { lcd_write_data (c); } /******************************************************************************* * Initialize the LCD controller * * Parameter: * * Return: * *******************************************************************************/ void lcd_init (void) { int i; unsigned char const *p; /* Set all pins for LCD as outputs */ LCD_ALL_DIR_OUT delay (15000); LCD_RS(0) lcd_write_4bit (0x3); /* Select 4-bit interface */ delay (4100); lcd_write_4bit (0x3); delay (100); lcd_write_4bit (0x3); lcd_write_4bit (0x2); lcd_write_cmd (0x28); /* 2 lines, 5x8 character matrix */ lcd_write_cmd (0x0C); /* Display ctrl:Disp=ON,Curs/Blnk=OFF */ lcd_write_cmd (0x06); /* Entry mode: Move right, no shift */ /* Load user-specific characters into CGRAM */ lcd_write_cmd(0x40); /* Set CGRAM address counter to 0 */ p = &UserFont[0][0]; for (i = 0; i < sizeof(UserFont); i++, p++) lcd_putchar (*p); lcd_write_cmd(0x80); /* Set DDRAM address counter to 0 */ } /******************************************************************************* * Set cursor position on LCD display * * Parameter: column: column position * * line: line position * * Return: * *******************************************************************************/ void set_cursor (unsigned char column, unsigned char line) { unsigned char address; address = (line * 40) + column; address = 0x80 + (address & 0x7F); lcd_write_cmd(address); /* Set DDRAM address counter to 0 */ } /******************************************************************************* * Clear the LCD display * * Parameter: * * Return: * *******************************************************************************/ void lcd_clear (void) { lcd_write_cmd(0x01); /* Display clear */ set_cursor (0, 0); } /******************************************************************************* * Print sting to LCD display * * Parameter: string: pointer to output string * * Return: * *******************************************************************************/ void lcd_print (unsigned char const *string) { while (*string) { lcd_putchar (*string++); } } /******************************************************************************/ void lcd_printf ( int x, int y,const char * format, ... ) { va_list argptr; char buffer[20]; va_start(argptr, format); vsprintf(buffer, format, argptr); va_end(argptr); set_cursor (x,y); lcd_print((unsigned char*)buffer); }
create another file called lcd.h
and paste
Code:extern void lcd_init (void); extern void lcd_clear (void); extern void lcd_putchar (char c); extern void set_cursor (unsigned char column, unsigned char line); extern void lcd_print (unsigned char const *string); void lcd_printf ( int x, int y,const char * format, ... );
now to use it call lcd_init(); to setup the lcd code and call
Code:lcd_printf("rf-id %d",1234);
to print to the lcd.
#include "lcd.h"
Then all the functions are avalible to you so..
Inside main
int main()
{
lcd_init();
lcd_printf("hello");
while(i)
{
...... whatever you want inside you main loop
}
}
I have to interface 16x2 LCD with arm7 lpc2129 too to show the unique no on RFID tag. How can i do that?? Can u give the circuit diagram and coding???
In the last line where you have said call lcd_printf("rf-id %d",1234); to print to the LCD. Wont it print 1234??? I want to print the unique value of the rfid tag when i place the tag on the reader. How to relate RFID coding to LCD coding???
---------- Post added at 22:24 ---------- Previous post was at 22:17 ----------
One More thing how do i connect LCD to Arm7 processor. The diagram of the arm7 processor is given in first post. I am not able to configure where will i connect it. Plz help.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?