Herculesheld
17.10.2009, 23:21
hi.
Ich habe Probleme mit meinem Display. Ich versuche es nach AN_118 von der MCS electronics Seite mit einem PCF8574P über I²c anzusteuern.Funktioniert aber nicht. Nachdem ich alle Fehlerquellen ausschließen kann, bleibt mir nur eine Möglichkeit zur Lösung des Problems: ich muss die zugehörige Library "Lcd_i2c.lib" ändern.
Ich selbst programmiere in Bascom.
Da Librarys in Assembler geschrieben sind, richte ich mich an alle in diesem Forum die denken dass sie sowas hingekommen könnten:
Ich muss in der Library die Displayinitialisierung für mein Display mit dem Controller KS0066 ändern.
Das ist der Quellcode der .lib:
[_Init_LCD]
_Init_LCD:
*BASIC: waitms 50
ldi r16,&hc0 ; this is to make the initialization on both halfs of a 4-line LCD
Ldi _temp1, &h03 ; at init-time I call all routines before _lcd_e is loaded into r16
Rcall _Send_to_LCD
*BASIC: waitms 4
Rcall _Send_to_LCD
Rcall _Send_to_LCD
Ldi _temp1, &h02
Rcall _Send_to_LCD
Ldi _temp1, &h28
Rcall _Write_lcd_byte ;RS flag should to be 0, so jump directly to write byte
Ldi _temp1, &h08
Rcall _Write_lcd_byte
Ldi _temp1, &h0c
Rcall _Write_lcd_byte
Ldi _temp1, &h01
Rjmp _Write_lcd_byte
[END]
[_Write_lcd]
_Write_lcd:
* lds r16,{_lcd_e}
sbr r16,&h10 ;set RS flag (4 high bits is used as control)
rjmp _write_lcd_byte
_Lcd_Control:
* lds r16,{_lcd_e}
_write_lcd_byte:
push r24
Swap _temp1
Rcall _Write_lcd_Nibble
pop r24
_Write_lcd_nibble:
Cbr _temp1,&HF0 ; E1, E2, RW, RS low
_Send_to_LCD:
push r26
push r27
ldi r25,3
_send_3_times:
*BASIC: i2csend pcf8574_LCD,_temp1
eor _temp1,R16 ; Xor E1 and/or E2 to set them
; @genus(250)
ldi r26,0
_LCD_delay:
dec R26
brne _LCD_delay
Dec R25
Brne _send_3_times
eor _temp1,R16 ; Xor to restore to initial state (even number of times)
pop r27
pop r26
ret
[END]
Es gab vor einiger Zeit ein solches Projekt von Guenter1604, der dieselbe .lib für ein PCA9555D geändert hat.
Ich hoffe mir kann jemand helfen.
Ich habe Probleme mit meinem Display. Ich versuche es nach AN_118 von der MCS electronics Seite mit einem PCF8574P über I²c anzusteuern.Funktioniert aber nicht. Nachdem ich alle Fehlerquellen ausschließen kann, bleibt mir nur eine Möglichkeit zur Lösung des Problems: ich muss die zugehörige Library "Lcd_i2c.lib" ändern.
Ich selbst programmiere in Bascom.
Da Librarys in Assembler geschrieben sind, richte ich mich an alle in diesem Forum die denken dass sie sowas hingekommen könnten:
Ich muss in der Library die Displayinitialisierung für mein Display mit dem Controller KS0066 ändern.
Das ist der Quellcode der .lib:
[_Init_LCD]
_Init_LCD:
*BASIC: waitms 50
ldi r16,&hc0 ; this is to make the initialization on both halfs of a 4-line LCD
Ldi _temp1, &h03 ; at init-time I call all routines before _lcd_e is loaded into r16
Rcall _Send_to_LCD
*BASIC: waitms 4
Rcall _Send_to_LCD
Rcall _Send_to_LCD
Ldi _temp1, &h02
Rcall _Send_to_LCD
Ldi _temp1, &h28
Rcall _Write_lcd_byte ;RS flag should to be 0, so jump directly to write byte
Ldi _temp1, &h08
Rcall _Write_lcd_byte
Ldi _temp1, &h0c
Rcall _Write_lcd_byte
Ldi _temp1, &h01
Rjmp _Write_lcd_byte
[END]
[_Write_lcd]
_Write_lcd:
* lds r16,{_lcd_e}
sbr r16,&h10 ;set RS flag (4 high bits is used as control)
rjmp _write_lcd_byte
_Lcd_Control:
* lds r16,{_lcd_e}
_write_lcd_byte:
push r24
Swap _temp1
Rcall _Write_lcd_Nibble
pop r24
_Write_lcd_nibble:
Cbr _temp1,&HF0 ; E1, E2, RW, RS low
_Send_to_LCD:
push r26
push r27
ldi r25,3
_send_3_times:
*BASIC: i2csend pcf8574_LCD,_temp1
eor _temp1,R16 ; Xor E1 and/or E2 to set them
; @genus(250)
ldi r26,0
_LCD_delay:
dec R26
brne _LCD_delay
Dec R25
Brne _send_3_times
eor _temp1,R16 ; Xor to restore to initial state (even number of times)
pop r27
pop r26
ret
[END]
Es gab vor einiger Zeit ein solches Projekt von Guenter1604, der dieselbe .lib für ein PCA9555D geändert hat.
Ich hoffe mir kann jemand helfen.