Jag sitter o försöker få till en bra kod för en lcd. Jag kör med en 16f887 som jag kör på 20Mhz och en 4x20 lcd.
Problemet jag har att texten på lcd blinkar och då är den så svår att läsa. Den översta raden är ok men den nedre är himla svår. Jag är ganska säker på att det finns en bättre kod än den jag använt men jag lyckas inte hitta den. Är det någon som kan ge mig tips om hur jag får bort blinkandet?
Kod: Markera allt
while(1)
{
ADCON0 = 0b0.0.0010.0.1; /* vilken som ska omvandlas AN2 */
delay(20);
GO=1; /* start AD */
while(GO); /* wait for done */
Pid = ADRESH; /* plaserar värdet i char Pid */
ADCON0 = 0b0.0.0111.0.1; /* vilken som ska omvandlas AN7 */
delay(20);
GO=1; /* start AD */
while(GO); /* wait for done */
pId = ADRESH; /* plaserar värdet i char pId */
/* analog 3 */
ADCON0 = 0b0.0.0101.0.1; /* vilken som ska omvandlas AN5 */
delay(20);
GO=1; /* start AD */
while(GO); /* wait for done */
piD = ADRESH; /* plaserar värdet i char piD */
ADCON0 = 0b0.0.0110.0.1; /* vilken som ska omvandlas AN6 */
delay(20);
GO=1; /* start AD */
while(GO); /* wait for done */
bor = ADRESH; /*plaserar värdet i char bor */
/* beräkning varvtal */
varvtal_1 = 7000000/tid_1; /* beräkning av varvtal ej rätt!!!*/
ar = varvtal_1 - varvtal_2; /* beräkning av är varvtalet */
varvtal_2 = varvtal_1; /* flyttar senaste varvtalet till varvtal 2 */
if (TMR1IF == 1 )
{
varvtal_1 = 0;
}
delay(100);
chartoa1(Pid); /* skickar char för omvandling till ascci */
chartoa2(pId); /* skickar char för omvandling till ascci */
chartoa3(piD); /* skickar char för omvandling till ascci */
chartoa4(bor); /* skickar char för omvandling till ascci */
chartoa5(fel); /* skickar char för omvandling till ascci */
unslongtoa( varvtal_1 ); /* skickar char för omvandling till ascci */
string_out(); /* skickar till lcd */
}
}
char text1( char x) /* text 1 */
{
skip(x); /* internal function CC5x. */
#pragma return[] = " P = "
}
char text2( char x) /* text 2 */
{
skip(x); /* internal function CC5x. */
#pragma return[] = " I = "
}
char text3( char x) /* text 3 */
{
skip(x); /* internal function CC5x. */
#pragma return[] = " D = "
}
char text4( char x) /* text 4 */
{
skip(x); /* internal function CC5x. */
#pragma return[] = "bor= "
}
char text5( char x) /* text 5 */
{
skip(x); /* internal function CC5x. */
#pragma return[] = " fel= "
}
char text6( char x) /* text 6 */
{
skip(x); /* internal function CC5x. */
#pragma return[] = " RPM= "
}
void string_out(void) /* utskrift till lcd */
{
char i;
lcd_init();
RS = 1;
for(i=0; i<5; i++) lcd_putchar(text1(i));
RS = 1;
for(i=5; i<8; i++) lcd_putchar(s[i]);
RS = 1;
for(i=0; i<5; i++) lcd_putchar(text2(i));
RS = 1;
for(i=5; i<8; i++) lcd_putchar(I[i]);
RS = 0; /* skiftar till rad 2 */
lcd_putchar( 0b11000000 );
RS = 1;
for(i=0; i<5; i++) lcd_putchar(text3(i));
RS = 1;
for(i=5; i<8; i++) lcd_putchar(D[i]);
RS = 0; /* skiftar till rad 3 */
lcd_putchar( 0b10010100 );
RS = 1;
for(i=0; i<5; i++) lcd_putchar(text4(i));
RS = 1;
for(i=5; i<8; i++) lcd_putchar(L[i]);
RS = 1;
for(i=0; i<5; i++) lcd_putchar(text5(i));
RS = 1;
for(i=5; i<8; i++) lcd_putchar(F[i]);
RS = 0; /* skiftar till rad 4 */
lcd_putchar( 0b11010100 );
RS = 1;
for(i=0; i<6; i++) lcd_putchar(text6(i));
RS = 1;
for(i=1; i<5; i++) lcd_putchar(V[i]);
}
void chartoa1(char p) /* gör om till ascci */
{
char i,temp;
s[8]='\0';
for (i = 7; ;i--)
{
temp = p % 10;
temp += '0';
s[i]=temp;
if (i==0) break;
p /= 10;
}
}
void chartoa2(char p) /* gör om till ascci */
{
char i,temp;
I[8]='\0';
for (i = 7; ;i--)
{
temp = p % 10;
temp += '0';
I[i]=temp;
if (i==0) break;
p /= 10;
}
}
void chartoa3(char p) /* gör om till ascci */
{
char i,temp;
D[8]='\0';
for (i = 7; ;i--)
{
temp = p % 10;
temp += '0';
D[i]=temp;
if (i==0) break;
p /= 10;
}
}
void chartoa4(char p) /* gör om till ascci */
{
char i,temp;
L[8]='\0';
for (i = 7; ;i--)
{
temp = p % 10;
temp += '0';
L[i]=temp;
if (i==0) break;
p /= 10;
}
}
void chartoa5(char p) /* gör om till ascci */
{
char i,temp;
F[8]='\0';
for (i = 7; ;i--)
{
temp = p % 10;
temp += '0';
F[i]=temp;
if (i==0) break;
p /= 10;
}
}
void unslongtoa(unsigned long u16) /* gör om till ascci */
{
char i,temp;
V[5] = '\0';
for (i = 4; ;i--)
{
temp = u16 % 10;
temp += '0';
V[i]=temp;
if (i==0) break;
u16 /= 10;
}
}
void delay( char millisec) /* fördröjningen 1 millisekunder vid 4 Mhz */
{
OPTION = 2; /* prescaler divide by 8 */
do {
TMR0 = 0;
while ( TMR0 < 125) /* 125 * 8 = 1000 */
;
} while ( -- millisec > 0);
}
void lcd_init( void ) /* måstes köras innan lcd används */
{
delay(20); /* lcd får tid att ställa in sig 40 */
RS = 0; /* lcd i kommando läge */
lcd_putchar(0b0011.0011); /* LCD starts in 8 bit mode */
lcd_putchar(0b0011.0010); /* change to 4 bit mode */
lcd_putchar(0b00101000); /* two line (8+8 chars in the row) */
lcd_putchar(0b00001100); /* display on, cursor off, blink off */
lcd_putchar(0b00000001); /* display clear */
lcd_putchar(0b00000110); /* increment mode, shift off */
RS = 1; /* lcd i skrivar läge */
}
void lcd_putchar( char data )
{
// must set LCD-mode before calling this function!
// RS = 1 LCD in character-mode
// RS = 0 LCD in command-mode
// upper Nybble
D7 = data.7;
D6 = data.6;
D5 = data.5;
D4 = data.4;
EN = 0;
nop();
EN = 1;
delay(9); /* 5 */
// lower Nybble
D7 = data.3;
D6 = data.2;
D5 = data.1;
D4 = data.0;
EN = 0;
nop();
EN = 1;
delay(9); /* 5 */
}