Jag försöker med en MikroC liknande funktion
"lcd_out(Rad,Position,"TEXT")"
Rad 1,2,3 fungerar som dom ska,
men skriver jag "123456789"
till rad 4 ser det ut så här.
------------------------
| |
|56789 |
| 4|
|123 |
------------------------
Skriver 123 på rad 4 hoppar till rad 3 och fortsätter,
Varför??
Skriver jag utan att flytta cursor
så fungerar hela LCDn.
Annväner PIC 18F4550 och 4 raders LCD Från Kjell.com
Borde kanske nämna att jag inte är någon expert
har programmerat PIC i 1 år som hobby.
Så här ser min LCD kod ut:
Kod: Markera allt
#define LCD_RS LATAbits.LATA5
#define LCD_EN LATAbits.LATA4
#define LCD_D7 LATAbits.LATA3
#define LCD_D6 LATAbits.LATA2
#define LCD_D5 LATAbits.LATA1
#define LCD_D4 LATAbits.LATA0
void LCD_STROBE(void){
LCD_EN = 1;
Delay10TCYx(1); // 5uS
LCD_EN = 0;
}
void lcd_write(unsigned char c){
LCD_D4 = ( ( c >> 4 ) & 0x01 );
LCD_D5 = ( ( c >> 5 ) & 0x01 );
LCD_D6 = ( ( c >> 6 ) & 0x01 );
LCD_D7 = ( ( c >> 7 ) & 0x01 );
Delay100TCYx(1); // 54uS
LCD_STROBE();
LCD_D4 = ( c & 0x01 );
LCD_D5 = ( ( c >> 1 ) & 0x01 );
LCD_D6 = ( ( c >> 2 ) & 0x01 );
LCD_D7 = ( ( c >> 3 ) & 0x01 );
Delay100TCYx(1); // 54uS
LCD_STROBE();
}
void lcd_out(unsigned char r,unsigned char p,const rom char *f){
LCD_RS = 0;
switch(r){
case 1:lcd_write(0x80+p);break; // Rad 1 + Position
case 2:lcd_write(0xA8+p);break; // Rad 2 + Position
case 3:lcd_write(0x94+p);break; // Rad 3 + Position
case 4:lcd_write(0xBC+p);break; // Rad 4 + Position
default: break;
}
LCD_RS = 1;
while(*f)lcd_write(*f++);
}
void lcd_clear(void){
LCD_RS = 0;
lcd_write(0x01);
Delay100TCYx(40); // 2ms
}
void LCD_Init(void){
LCD_RS = 0;
LCD_EN = 0;
Delay1KTCYx(30); // 15mS
LCD_D4 = 1;
LCD_D5 = 1;
LCD_D6 = 0;
LCD_D7 = 0;
LCD_STROBE();
Delay100TCYx(100); // 5mS
LCD_STROBE();
Delay100TCYx(10); // 0,5mS
LCD_STROBE();
Delay100TCYx(10); // 0,5mS
LCD_D4 = 0;
LCD_D5 = 1;
LCD_D6 = 0;
LCD_D7 = 0;
LCD_STROBE();
lcd_write(0x28); // Function set: (4Bit Mode,Display Lines=1,Character Font=0)
lcd_write(0x0C); // Display on/off control: (Display On, Cursor OFF, Cursor Blink OFF)
lcd_clear(); // Clear screen
lcd_write(0x06); // Entry Mode set:(Cursor moves to the right)
}
//****************************************************************************************
void main(void){
PIC_Init();
LCD_Init();
while(1==1){
lcd_clear();
Delay10KTCYx(200);
lcd_out(4,0,"123456789");
Delay10KTCYx(200);
}
}
Tack för ett bra forum!!