hi i am trying to interface an 16x2 lcd onto an arm7 board lpc2148. the pins i am using for the data is p0.16-p0.23 and for control signals ie rs rw e i am using p1.24 p1.25 p1.26 respectively.When i dump the following code nothing is getting changed in the display .can anybody help me out...i am attaching the code here ..kindly do the needful
#include<LPC214x.h> void init_PLL(void); void init_GPIO(void); void lcd_data(unsigned char); void lcd_cmd(unsigned char); void lcd_init(void); void delay(unsigned int); #define E 0x04000000 #define RW 0x02000000 #define RS 0x01000000 int main(void) { init_PLL(); init_GPIO(); lcd_init(); while(1) { lcd_data('A'); lcd_data('B'); lcd_data(96); lcd_data('d'); delay(0xffffff); } } void init_PLL(void) { PLL0CFG=0x00000024; // TO GENERATE 60 MHZ CCLK PLL0CON=0x00000001; PLL0FEED=0x000000AA;//UPDATE THE PLL REGISTER PLL0FEED=0x00000055; while(!(PLL0STAT & 0x00000400)); // CHECK WHETHRT THE CCLK IS GENERATED EXAXT VALUE PLL0CON=0x00000003; // CONNECT PLL PLL0FEED=0x000000AA; //UPDATE THE PLL REGISTER PLL0FEED=0x00000055; VPBDIV=0x00000002; //PCLK=1/2*CCLK } void init_GPIO( void) { PINSEL0=0x00FF0000; PINSEL1=0x07000000; IODIR0=0x00FF0000; IODIR1=0x07000000; } void lcd_init(void) { lcd_cmd(0x380000); delay(0xffffff); lcd_cmd(0x0e0000); delay(0xffffff); lcd_cmd(0x800000); delay(0xffffff); lcd_cmd(0x060000); delay(0xffffff); } unsigned int adjust_portbit(unsigned char c) { unsigned char j; unsigned int result; result=c; for(j=0;j<16;j++) { result=result<<1; } return result; } void lcd_data(unsigned char ldata) { unsigned int temp,z; temp=adjust_portbit(ldata); init_GPIO(); z=~temp; IOCLR1=z; IOSET0=ldata; delay(0xffffff); IOCLR1=RW; IOSET1=RS; delay(0xffffff); IOSET1=E; delay(0xffffff); IOCLR1=E; } void lcd_cmd(unsigned char lcmd) { unsigned int temp,z; temp=adjust_portbit(lcmd); init_GPIO(); z=~temp; IOCLR1=z; IOSET0=lcmd; delay(0xffffff); IOCLR1=RW; IOCLR1=RS; IOSET1=E; delay(0xffffff); IOCLR1=E; } void delay(unsigned int value) { unsigned int i; for(i=0;i<value;i++); { } }
void delay(unsigned int value) { unsigned int i; for(i=0;i<value;i++); { } } <end> How long is yo're delay? It is not acurate and can be a big problem. I have the assembler here;
//* The delay is in R0 FOR us DELAY //* THIS IS FOR 48MHZ //* YOU CAN USE THIS CODE IN YO'RE PROJECT AND MENTION ME DoUsDELAY P1 MOV R1,#11 ;R1 = 11 P2 SUBS R1,R1,#1 ;R1 = R1-1 BNE P2 ;Branch if not now nullified NOP ;A more delaying SUBS R0,R0,#1 ;R0 = R0-1 BNE P1 ;BRANCH if NOW NOT NULLIFIED BX LR ;GO TO WHERE YOU CAME FROM <end> Zeusti. Always yo're freind
what a mess professor, this is a little better (I think):
// time measurement in microseconds for an LPC2478 running at 72[MHz]. use for short delays only that depend // only on the speed of the processor. #define MICROSECONDS(x) (x*15) __asm void delay(int32u a_microseconds) { loop MOVS R1, R0 SUB R0, R0, #1 BNE loop BX LR } Usage: delay(MICROSECONDS(10) ) ;
what is missing if saving and restoring the values of R0 and R1 upon entry and exit.
Note the use of the __asm keyword in Tamir's reply...
www.keil.com/.../armccref_babfdcgd.htm
Tapir
Yo're work is quite acceptable but the macro ?
I'm proud you approve...take another look at the beginning of the code excerpt - the macro is there!
Timar
yes i see the macro but why do u use? *15?
my code is us as paramereter. and i donnot need the *15 :)
Zeusti.
Always your freind (and yors)
I'll let you think about it.
<qupote> I'll let you think about it. <end>
must be becoz my code is designed better!
Zeusti/
Always the friend.
no. think again. you are a professor, after all.
<qiote> no. think again. you are a professor, after all. <end>
i have already seen b4. you need macro bcoz you're code wants delay/15 . ok for beginer. if you have time to learn@ I can teach you.
Always Your freind.
Aha.
View all questions in Keil forum