|
|
View previous topic :: View next topic |
Author |
Message |
demonspells
Joined: 06 Jan 2011 Posts: 26
|
Problem in Flex_420 LCD Driver |
Posted: Fri Mar 25, 2011 1:13 pm |
|
|
I'm trying to interface my 20x4 LCD to 18F452 using flex_lcd driver posted on this forum
it won't show anything, just blanks forever !!
I've already tried the built-in LCD420.c
and checked the wiring million times, just nothing
I also tried to add delays to the flex_lcd functions, also didn't work
the only way I could get something on my lcd is by using MicroC Lcd8 library (8Bit interface), this works perfect
I also tried the 8-Bit code in this forum
http://www.ccsinfo.com/forum/viewtopic.php?t=38367
modified it to work on 4 lines, still nothing
P.S. all of my codes worked fine in simulation
my lcd uses KS0066 Controller |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Mar 25, 2011 1:17 pm |
|
|
Post the manufacturer and part number of the LCD.
Post a link to the website for the LCD. |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Mar 25, 2011 1:37 pm |
|
|
Batron has a special init code, just for their 4x20 lcd. See the last
two posts in this thread. Note that in addition to my code, the array
size must be increased to 7.
http://www.ccsinfo.com/forum/viewtopic.php?t=38076 |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
Posted: Fri Mar 25, 2011 1:44 pm |
|
|
did it
nothing happened |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Mar 25, 2011 1:50 pm |
|
|
Quote: |
the only way I could get something on my lcd is by using MicroC Lcd8
library (8Bit interface), this works perfect |
Post a link to this source code. |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
Posted: Fri Mar 25, 2011 1:53 pm |
|
|
it's a built-in library (.mcl), it cannot be opened using text editors |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
Posted: Fri Mar 25, 2011 2:48 pm |
|
|
i've tried adding the 3 extra commands to lcd420.c
it was the same
I also checked the datasheet for KS0066U, these commands are not the same as the comment says |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Mar 25, 2011 4:16 pm |
|
|
What happens if you use the MikroC lcd4 library ? (not lcd8)
Post a list of the connections between your PIC and the LCD.
Post the list of #define statements that you edited for the pin numbers
in the Flex_lcd_420.c file. Also post the #define statement for the RW
pin. (if you commented it out, then post it as a commented out line).
In other words, show your code. (Do not post the complete 4x20
driver file. It's already in the code library. I don't need to see it here). |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
Posted: Sat Mar 26, 2011 2:15 am |
|
|
When I used MicroC lcd4 library i got the same problem, a blank LCD
when I used MicroC lcd8 I used this connection
Port B >> LCD_Data (DB0-DB7)
PIN_D4 >> RS
PIN_D5 >> RW
PIN_D6 >> Enable
this worked fine, the only problem is that I has a huge routine and I can't just convert it to MicroC simply because I can't run the LCD there !!
for the Flex_lcd_420.c i tried many connections, finally I kept trying this one
Code: | #define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_B1
#define LCD_RW PIN_B2
#define LCD_E PIN_B0
#define USE_RW_PIN 1
|
the same connection as LCD420.c, to switch faster between them
the RW pin was commented sometimes, I tried every update I made to flex_lcd_420.c with and without the use of RW
whenever I comment RW usage, I tie the pin to the ground. |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
Posted: Sat Mar 26, 2011 3:50 am |
|
|
I've got the lcd8_init commands from the asm file, can I post it here?
it shows a longer list of commands
Code: |
0x30, 0x30, 0x30 , 0x38 , 0x08, 0x01, 0x0c, 0x06
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 26, 2011 11:23 am |
|
|
Quote: |
I've got the lcd8_init commands from the asm file, can I post it here?
it shows a longer list of commands
Code:
0x30, 0x30, 0x30 , 0x38 , 0x08, 0x01, 0x0c, 0x06
|
See the explanation below. The commands shown above put the LCD in 8-bit mode.
This is the normal HD44780-compatible lcd start-up sequence.
Set the lcd interface for 8-bit mode. (0x28 = 4-bit mode).
Display off.
Clear display.
Display on.
Select "increment cursor" mode. |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
Posted: Sat Mar 26, 2011 11:54 am |
|
|
yes I've noticed that I followed SAMSUNG KS0066U and understood those codes
now that we know mikroC uses the same sequence, what's your suggestions??
I managed to convert your flex_420 library to handle 8-Bit interface
works fine on the simulator, still nothing on the hardware
here is the edit code:
Code: |
#define LCD_RS PIN_D4
#define LCD_E PIN_D6
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x40
#define LCD_LINE_3_ADDRESS 0x14
#define LCD_LINE_4_ADDRESS 0x54
int8 lcd_line;
int8 const LCD_INIT_STRING[8] =
{ 0x30,0x30,0x30,
0x38, // Set mode: 8-bit, 2+ lines, 5x8 dots
8,
1,
12,
6
};
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
delay_us(50);
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
output_low(LCD_E);
delay_us(50);
output_b(n);
delay_us(1);
output_high(LCD_E);
delay_us(1);
output_low(LCD_E);
delay_us(50);
}
//----------------------------
void lcd_init(void)
{
int8 i;
lcd_line = 1;
output_low(LCD_RS);
output_low(LCD_E);
delay_ms(50);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
delay_ms(5);
}
}
//----------------------------
void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
switch(y)
{
case 1:
address = LCD_LINE_1_ADDRESS;
break;
case 2:
address = LCD_LINE_2_ADDRESS;
break;
case 3:
address = LCD_LINE_3_ADDRESS;
break;
case 4:
address = LCD_LINE_4_ADDRESS;
break;
default:
address = LCD_LINE_1_ADDRESS;
break;
}
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
//-----------------------------
void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
lcd_line = 1;
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1, ++lcd_line);
break;
case '\b':
lcd_send_byte(0,0x10);
break;
default:
lcd_send_byte(1,c);
break;
}
}
//------------------------------
|
RW is tied to the ground |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 26, 2011 1:50 pm |
|
|
Does your current hardware run OK with the 8-bit MikroC LCD library code ?
If it does, then there is still a difference between the drivers, somewhere. |
|
|
demonspells
Joined: 06 Jan 2011 Posts: 26
|
|
Posted: Sat Mar 26, 2011 2:03 pm |
|
|
yes it still works
here is the .asm file for Lcd8_Init(&PORTD, &PORTB);
Code: |
; ADDRESS OPCODE ASM
; ----------------------------------------------
$0000 $EF90 F000 GOTO _main
$0142 $ _Delay_1us:
;Delays.c,7 :: void Delay_1us() {
;Delays.c,8 :: Delay_us(1);
$0142 $0000 NOP
;Delays.c,9 :: }
$0144 $0012 RETURN
$0102 $ _Delay_5500us:
;Delays.c,31 :: void Delay_5500us() {
;Delays.c,32 :: Delay_us(5500);
$0102 $0E08 MOVLW 8
$0104 $6E0B MOVWF STACK_11, 0
$0106 $0EFF MOVLW 255
$0108 $6E0A MOVWF STACK_10, 0
$010A $2E0B DECFSZ STACK_11, F, 0
$010C $D001 BRA $+2
$010E $D003 BRA $+4
$0110 $2E0A DECFSZ STACK_10, F, 0
$0112 $D7FE BRA $-1
$0114 $D7FA BRA $-5
$0116 $0E1E MOVLW 30
$0118 $6E0A MOVWF STACK_10, 0
$011A $2E0A DECFSZ STACK_10, F, 0
$011C $D7FE BRA $-1
;Delays.c,33 :: }
$011E $0012 RETURN
$0136 $ _Delay_50us:
;Delays.c,19 :: void Delay_50us() {
;Delays.c,20 :: Delay_us(50);
$0136 $0E10 MOVLW 16
$0138 $6E0A MOVWF STACK_10, 0
$013A $2E0A DECFSZ STACK_10, F, 0
$013C $D7FE BRA $-1
$013E $0000 NOP
;Delays.c,21 :: }
$0140 $0012 RETURN
$00A4 $ _Lcd8_Cmd:
$00A4 $C015 FFE9 MOVFF Lcd8bit_main_global_dataAddress, FSR0L
$00A8 $C016 FFEA MOVFF Lcd8bit_main_global_dataAddress+1, FSR0H
$00AC $C017 FFE1 MOVFF Lcd8bit_main_global_ctrlAddress, FSR1L
$00B0 $C018 FFE2 MOVFF Lcd8bit_main_global_ctrlAddress+1, FSR1H
$00B4 $6AEF CLRF INDF0, 0
$00B6 $521E MOVF FARG_Lcd8_Cmd+0, 1, 0
$00B8 $E000 BZ L_Lcd8_Cmd_0
$00BA $ L_Lcd8_Cmd_0:
$00BA $BE1E BTFSC FARG_Lcd8_Cmd+0, 7, 0
$00BC $8EEF BSF INDF0, __LCD8_DB7, 0
$00BE $BC1E BTFSC FARG_Lcd8_Cmd+0, 6, 0
$00C0 $8CEF BSF INDF0, __LCD8_DB6, 0
$00C2 $BA1E BTFSC FARG_Lcd8_Cmd+0, 5, 0
$00C4 $8AEF BSF INDF0, __LCD8_DB5, 0
$00C6 $B81E BTFSC FARG_Lcd8_Cmd+0, 4, 0
$00C8 $88EF BSF INDF0, __LCD8_DB4, 0
$00CA $B61E BTFSC FARG_Lcd8_Cmd+0, 3, 0
$00CC $86EF BSF INDF0, __LCD8_DB3, 0
$00CE $B41E BTFSC FARG_Lcd8_Cmd+0, 2, 0
$00D0 $84EF BSF INDF0, __LCD8_DB2, 0
$00D2 $B21E BTFSC FARG_Lcd8_Cmd+0, 1, 0
$00D4 $82EF BSF INDF0, __LCD8_DB1, 0
$00D6 $B01E BTFSC FARG_Lcd8_Cmd+0, 0, 0
$00D8 $80EF BSF INDF0, __LCD8_DB0, 0
$00DA $5019 MOVF Lcd8bit_main_global_cmd, 0, 0
$00DC $0A01 XORLW 1
$00DE $E103 BNZ L_Lcd8_Cmd_1
$00E0 $98E7 BCF INDF1, __LCD8_RS, 0
$00E2 $EF74 F000 GOTO L_Lcd8_Cmd_2
$00E6 $ L_Lcd8_Cmd_1:
$00E6 $88E7 BSF INDF1, __LCD8_RS, 0
$00E8 $ L_Lcd8_Cmd_2:
$00E8 $8CE7 BSF INDF1, __LCD8_ENABLE, 0
$00EA $ECA1 F000 CALL _Delay_1us
$00EE $9CE7 BCF INDF1, __LCD8_ENABLE, 0
$00F0 $5019 MOVF Lcd8bit_main_global_cmd, 0, 0
$00F2 $0A01 XORLW 1
$00F4 $E103 BNZ L_Lcd8_Cmd_3
$00F6 $EC81 F000 CALL _Delay_5500us
$00FA $D002 BRA L_Lcd8_Cmd_4
$00FC $ L_Lcd8_Cmd_3:
$00FC $EC9B F000 CALL _Delay_50us
$0100 $ L_Lcd8_Cmd_4:
$0100 $0012 RETURN
$0008 $ _Lcd8_Init:
$0008 $EC81 F000 CALL _Delay_5500us
$000C $EC81 F000 CALL _Delay_5500us
$0010 $EC81 F000 CALL _Delay_5500us
$0014 $C01C F015 MOVFF FARG_Lcd8_Init+2, Lcd8bit_main_global_dataAddress
$0018 $C01D F016 MOVFF FARG_Lcd8_Init+3, Lcd8bit_main_global_dataAddress+1
$001C $C01A F017 MOVFF FARG_Lcd8_Init+0, Lcd8bit_main_global_ctrlAddress
$0020 $C01B F018 MOVFF FARG_Lcd8_Init+1, Lcd8bit_main_global_ctrlAddress+1
$0024 $C01A FFE9 MOVFF FARG_Lcd8_Init+0, FSR0L
$0028 $C01B FFEA MOVFF FARG_Lcd8_Init+1, FSR0H
$002C $9AEF BCF INDF0, __LCD8_RW, 0
$002E $C01C FFE1 MOVFF FARG_Lcd8_Init+2, FSR1L
$0032 $C01D FFE2 MOVFF FARG_Lcd8_Init+3, FSR1H
$0036 $6AE6 CLRF POSTINC1, 0
$0038 $0E11 MOVLW 17
$003A $24E1 ADDWF FSR1L, 0, 0
$003C $6E00 MOVWF STACK_0, 0
$003E $C000 FFE1 MOVFF STACK_0, FSR1L
$0042 $6AE7 CLRF INDF1, 0
$0044 $0E12 MOVLW 18
$0046 $5C00 SUBWF STACK_0, 0, 0
$0048 $6EE1 MOVWF FSR1L, 0
$004A $0E12 MOVLW 18
$004C $26E9 ADDWF FSR0L, 1, 0
$004E $9CEF BCF INDF0, __LCD8_ENABLE, 0
$0050 $98EF BCF INDF0, __LCD8_RS, 0
$0052 $9AEF BCF INDF0, __LCD8_RW, 0
$0054 $0E12 MOVLW 18
$0056 $5EE9 SUBWF FSR0L, 1, 0
$0058 $98EF BCF INDF0, __LCD8_RS, 0
$005A $9CEF BCF INDF0, __LCD8_ENABLE, 0
$005C $9AEF BCF INDF0, __LCD8_RW, 0
$005E $0E30 MOVLW 48
$0060 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$0062 $EC52 F000 CALL _Lcd8_Cmd
$0066 $0E30 MOVLW 48
$0068 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$006A $EC52 F000 CALL _Lcd8_Cmd
$006E $0E30 MOVLW 48
$0070 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$0072 $EC52 F000 CALL _Lcd8_Cmd
$0076 $0E38 MOVLW 56
$0078 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$007A $EC52 F000 CALL _Lcd8_Cmd
$007E $0E08 MOVLW 8
$0080 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$0082 $EC52 F000 CALL _Lcd8_Cmd
$0086 $0E01 MOVLW 1
$0088 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$008A $EC52 F000 CALL _Lcd8_Cmd
$008E $0E06 MOVLW 6
$0090 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$0092 $EC52 F000 CALL _Lcd8_Cmd
$0096 $0E0C MOVLW 12
$0098 $6E1E MOVWF FARG_Lcd8_Cmd+0, 0
$009A $EC52 F000 CALL _Lcd8_Cmd
$009E $0E01 MOVLW 1
$00A0 $6E19 MOVWF Lcd8bit_main_global_cmd, 0
$00A2 $0012 RETURN
$0120 $ _main:
;microc_420.c,1 :: void main() {
;microc_420.c,3 :: Lcd8_Init(&PORTD, &PORTB);
$0120 $0E83 MOVLW PORTD
$0122 $6E1A MOVWF FARG_Lcd8_Init+0, 0
$0124 $0E0F MOVLW @PORTD
$0126 $6E1B MOVWF FARG_Lcd8_Init+1, 0
$0128 $0E81 MOVLW PORTB
$012A $6E1C MOVWF FARG_Lcd8_Init+2, 0
$012C $0E0F MOVLW @PORTB
$012E $6E1D MOVWF FARG_Lcd8_Init+3, 0
$0130 $EC04 F000 CALL _Lcd8_Init
;microc_420.c,6 :: }
$0134 $D7FF BRA $ |
_________________ Badr Ghatasheh |
|
|
|
|
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
|