Na początek trochę autorskiego kodu do LCD, który sam tworzyłem na podstawie opisów z sieci i wzorując się na dostępnych bibliotekach - były mało czytelne, więc zamiast ślepo ich używać postanowiłem mieć coś swojego, co wiem jak działa i co się w tym dzieje...
na poczatek fragment kodu lcd odpowiadającego za wyświetlanie różnych rzeczy:
i teraz co się dzieje:
użycie:powoduje:
użycie:
powoduje:
użycie:powoduje:
linijki:izwracają:
linijka:
Jak to wszystko zmusić do współpracy? Rozumiem, że najprawdopodobniej "takie same" typy zmiennych nie są takie same ale próby z deklaracjami char, unsigned char itp nie dały lepszych efektów.
Oczywiście większość z tego to warningi ale wolę nie czekać na testy co się wyświetli na hardwarze a co nie...
na poczatek fragment kodu lcd odpowiadającego za wyświetlanie różnych rzeczy:
//zmienne i procedury obsługi lcd
//pod lcdddr DDRx
//pod lcdport PORTx
//pod lcdbit (1<<n)
//pod lcdpin PINx
#define set1 |=
#define set0 &= ~
#define toggle ^=
#define lcdddr_rs DDRB
#define lcdport_rs PORTB
#define lcdbit_rs (1<<0)
#define lcdddr_rw DDRB
#define lcdport_rw PORTB
#define lcdbit_rw (1<<1)
#define lcdddr_e DDRB
#define lcdport_e PORTB
#define lcdbit_e (1<<2)
#define lcdddr_d7 DDRB
#define lcdport_d7 PORTB
#define lcdbit_d7 (1<<3)
#define lcdpin_d7 PINB
#define lcdddr_d6 DDRB
#define lcdport_d6 PORTB
#define lcdbit_d6 (1<<4)
#define lcdpin_d6 PINB
#define lcdddr_d5 DDRB
#define lcdport_d5 PORTB
#define lcdbit_d5 (1<<5)
#define lcdpin_d5 PINB
#define lcdddr_d4 DDRB
#define lcdport_d4 PORTB
#define lcdbit_d4 (1<<6)
#define lcdpin_d4 PINB
void lcd_checkstatus(void){
uint8_t i=0;
lcdddr_rs set1 lcdbit_rs;
lcdddr_rw set1 lcdbit_rw;
//wejścia na dane dla bezpieczeńśtwa
lcdddr_d7 set0 lcdbit_d7;
lcdddr_d6 set0 lcdbit_d6;
lcdddr_d5 set0 lcdbit_d5;
lcdddr_d4 set0 lcdbit_d4;
lcdport_d7 set1 lcdbit_d7;
lcdport_d6 set1 lcdbit_d6;
lcdport_d5 set1 lcdbit_d5;
lcdport_d4 set1 lcdbit_d4;
do{
lcdport_rs set0 lcdbit_rs;
lcdport_rw set1 lcdbit_rw;
lcdport_e set1 lcdbit_e;
if(lcdpin_d7&lcdbit_d7) i=1;
lcdport_e set0 lcdbit_e;
}while(~i);
}
void lcd_nibble(uint8_t nibbleToWrite)
{
if(nibbleToWrite & 0x01) lcdport_d4 set1 lcdbit_d4;
else lcdport_d4 set0 lcdbit_d4;
if(nibbleToWrite & 0x02) lcdport_d5 set1 lcdbit_d5;
else lcdport_d5 set0 lcdbit_d5;
if(nibbleToWrite & 0x04) lcdport_d6 set1 lcdbit_d6;
else lcdport_d6 set0 lcdbit_d6;
if(nibbleToWrite & 0x08) lcdport_d7 set1 lcdbit_d7;
else lcdport_d7 set0 lcdbit_d7;
}
void lcd_rozkaz(uint8_t dataToWrite){
lcd_checkstatus();
lcdddr_d4 set1 lcdbit_d4;
lcdddr_d5 set1 lcdbit_d5;
lcdddr_d6 set1 lcdbit_d6;
lcdddr_d7 set1 lcdbit_d7;
lcdport_rs set0 lcdbit_rs;
lcdport_rw set0 lcdbit_rw;
lcd_nibble(dataToWrite >> 4);
lcdport_e set1 lcdbit_e;
lcdport_e set0 lcdbit_e;
lcd_nibble(dataToWrite);
lcdport_e set1 lcdbit_e;
lcdport_e set0 lcdbit_e;
}
void lcd_znak(uint8_t dataToWrite){
lcd_checkstatus();
lcdddr_d4 set1 lcdbit_d4;
lcdddr_d5 set1 lcdbit_d5;
lcdddr_d6 set1 lcdbit_d6;
lcdddr_d7 set1 lcdbit_d7;
lcdport_rs set1 lcdbit_rs;
lcdport_rw set0 lcdbit_rw;
lcd_nibble(dataToWrite >> 4);
lcdport_e set1 lcdbit_e;
lcdport_e set0 lcdbit_e;
lcd_nibble(dataToWrite);
lcdport_e set1 lcdbit_e;
lcdport_e set0 lcdbit_e;
}
void lcd_text(uint8_t * text){
while(*text)
lcd_znak(*text++);
}
void lcd_tint(uint8_t znak){
lcd_znak(znak/10+0x30);
lcd_znak(znak%10+0x30);
}
void lcd_zint(uint8_t znak){
lcd_znak(znak+0x30);
}
i teraz co się dzieje:
użycie:
lcd_text("1.Czas odliczania");Cytat:../b1.c:534: warning: pointer targets in passing argument 1 of 'lcd_text' differ in signedness
użycie:
lcd_znak(":");Cytat:../b1.c:1077: warning: passing argument 1 of 'lcd_znak' makes integer from pointer without a cast
użycie:
volatile uint8_t tekst_p[20];
...
for(uint8_t i=0;i<20;i++) tekst_p[i]=eeprom_read(0x0030+i);
...
lcd_text(tekst_p);Cytat:Aha, eeprom_read(); czyta spod adresu tak jak jest w manualu atmela.../b1.c:1091: warning: passing argument 1 of 'lcd_text' discards qualifiers from pointer target type
linijki:
tekst_p[]={"costam"}; tekst_p[]="costam"; Cytat:../b1.c:1089: error: expected expression before ']' token
linijka:
lcd_text(0x23232323);//krzyżykiCytat:../b1.c:1106: warning: passing argument 1 of 'lcd_text' makes pointer from integer without a cast
Jak to wszystko zmusić do współpracy? Rozumiem, że najprawdopodobniej "takie same" typy zmiennych nie są takie same ale próby z deklaracjami char, unsigned char itp nie dały lepszych efektów.
Oczywiście większość z tego to warningi ale wolę nie czekać na testy co się wyświetli na hardwarze a co nie...
