Pewnie owe chińskie produkty mają inną tablicę kodową, gdyż zdecydowanie był to ichni krzaczek :)
Zajmuje się hobbystycznie też programowaniem mikrokontrolerów, ale jak dotąd nie miałem okazji bawić się PIC'ami a tylko AVR'ami, MSP430 oraz procesorami ARM Cortex-M0. Analizując z pomocą Arduino co tam mają pod adresem 0xF4, którego używa oryginalny program w każdym LCD jaki miałem był ten sam "krzaczor". Ponieważ chciałem aby rozwiązanie było przenośne postanowiłem wykorzystać dostepną pamięć CGRAM. Wycieczka do AVT po programator PIC i zacząłem zabawę.
Każdy wyświetlacz ma pierwsze 8 rejestrów dostepnych jako zapisywalne przez użytkownika dla jego własnych symboli. Co do szczegółów odsyłam do Wikipedii gdzie jest szczegółowy opis sterownika HD44780.
Największym problemem okazało się skonfigurowanie środowiska MPLAB 8 z kompilatorem CC5X używanym przez VK5JST. Dwie godziny potem środowisko było gotowe i kompilator prawidłogo kompilował oryginalny kod.
Cała reszta to przyjemność programowania :) Co mi się podoba w MPLAB i CC5X:
- Jeśli wcześniej zadeklarujemy małe makro np: pragma bit LED_0 @ PORTB.0 to potem zmiana stanu tego portu to poprostu LED_0=1 ! Żadnych &= ~() czy |= na całym rejestrze. Bardzo przyjemna i czytelna sprawa.
- Pomimo "dziwnego" interfejsu MPLAB 8 - bardzo szybko można zacząć pracować bez dziesiątek wizardów, innych utrudniaczy, czy importowania dziesiątek bibliotek.
A jak wyglądają owe zmiany. Tutaj znajdziecie źródła z moimi poprawkami oraz plikiem wsadowym hex do PIC'a ant-anl-0.04.zip. Napisałem do Vadima, więc może niedługo znajdzie się to w oficjalnym kodzie.
Dla tych co nie chcą dłubać przez cały kod:
- Deklaracja tablicy zawierającej opis graficzny litery Omega w pliku lcd_nmix.c
const char ohm[8] ={0b00000,0b00000,0b01110,0b10001,0b10001,0b01010,0b11011,0b00000};
Każdy bajt opisuje jakie pixele mają być włączone dla każdej z 8 poziomych linii znaku graficznego 5x8 pixeli. Tak więc znaczenia ma tylko pierwsze 5 bitów. - Kod zapisujący znak Omega do pamięci CGRAM w lcd_nmix.c:
void lcd_add_ohm(void) { LCD_RS=0; lcd_write(0x40); LCD_RS=1; delay_us(40); // send ohm character for(k=0;k<8;k++) { lcd_write(ohm[k]);} //switch back to DRAM LCD_RS=0; cd_write(0x80); LCD_RS=1; delay_us(40);
- Wywołanie powyższej funkcji w inicjacji wyświetlacza lcd_init(void) w lcd_nmix.c
- Zmiana adresu z pod jakiego brać symbol Ohma w aa_defs.h:
#define LCD_OHM 0x00
I to wszystko. Tak więc programowanie PIC'ów nie takie straszne i w sumie poza drobnymi niuansami różnic pomiędzy 8-bitowcami nie ma.