Witam,
po czwartym dniu studiowania forum, googli itp. Doszedłem do wniosku, że jak założę nowy temat to ktoś się ulituje i nie pisząc o lenistwie, wyszukiwarkach itp odpowie na parę pytań.
Do tej pory pisałem w bascomie, ze względu na koszty postanowiłem sie przesiąść na C- i tu zaczął się jakiś koszmar. Przyzwyczajony do bascomowej składni zetknąłem się z jakaś koszmarną składnia C nie mówiąc o asm.
Przeszukując internet znalazłem jakieś przykłady kodu w C, nawet się kompilują i wgrywają do uC za pomocą Bascomu Demo.
Ale nie mogę nigdzie znaleźć podstaw C dla AVR- z resztą jak widziałem to nie tylko ja.
Mam nadzieje, że jak pomożecie zrozumieć kod C dla LCD to jakoś to będzie.
Pierwszy program ma wyświetlić cokolwiek na LCD
W bascomie to było jasne:
tu następowała definicja wyprowadzeń uC do LCD i wyświetlenie tekstu.
Natomiast C (sorry, że taki długi ale nie wiem co jest a co nie jest związane z LCD):
Czy może ktoś napisać gdzie w tym kodzie jest odpowiednik:
config lcd ..
(chodzi mi o możliwość dowolnego skonfigurowania portów lcd db4-7, RS,E)
lcd ...
(chodzi mi o logikę wyświetlania danych- czy to jest wysyłany cały wyraz, czy operujemy poszczególnymi polami o konkretnych współrzędnych, czy wysyłamy jakieś dane bin jak w VFD)
Bardzo proszę, że by wpisy były naprawdę jasne dla początkujących bez elokwencji wszystkowiedzących. Ja postaram się bardziej precyzyjnie opisać problem jeżeli będzie taka potrzeba.
Kolejnym poważnym problemem jest interpretacja kompilatora AVR-GCC ale to może następnym razem.
Mam nadzieje, że uda się nam stworzyć coś co innym początkującym pomoże rozwiązywać "banalne" i oczywiste problemy.
dzięki
wojtekr
po czwartym dniu studiowania forum, googli itp. Doszedłem do wniosku, że jak założę nowy temat to ktoś się ulituje i nie pisząc o lenistwie, wyszukiwarkach itp odpowie na parę pytań.
Do tej pory pisałem w bascomie, ze względu na koszty postanowiłem sie przesiąść na C- i tu zaczął się jakiś koszmar. Przyzwyczajony do bascomowej składni zetknąłem się z jakaś koszmarną składnia C nie mówiąc o asm.
Przeszukując internet znalazłem jakieś przykłady kodu w C, nawet się kompilują i wgrywają do uC za pomocą Bascomu Demo.
Ale nie mogę nigdzie znaleźć podstaw C dla AVR- z resztą jak widziałem to nie tylko ja.
Mam nadzieje, że jak pomożecie zrozumieć kod C dla LCD to jakoś to będzie.
Pierwszy program ma wyświetlić cokolwiek na LCD
W bascomie to było jasne:
Code:
Config Lcd = 16 * 1a
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , Rs = Portb.0 , E = Portd.7
lcd "Cos tam"
lowerline
lcd "znowu cos"
upperline
tu następowała definicja wyprowadzeń uC do LCD i wyświetlenie tekstu.
Natomiast C (sorry, że taki długi ale nie wiem co jest a co nie jest związane z LCD):
Code:
/***************************************************************/
/* Ćwiczenie 4b - sterowanie alfanumerycznym wyświetlaczem LCD */
/* 16x1 (16 znaków, 1 wiersz) */
/* - obsługa pojedynczego klawisza */
/* J.D. '2003 */
/***************************************************************/
#include <io.h>
#include <progmem.h>
#define lcd_rs 2
#define lcd_e 3
#define CR 0x0a
volatile unsigned char kolumna;
void czekaj(unsigned long pt) //procedura wytracania czasu
{
#define tau 10.38 //przybliżony przelicznik argumentu na ms
unsigned char tp1;
for(;pt>0;pt--)
{
for(tp1=255;tp1!=0;tp1--);
}
}
void piszilcd(unsigned char instr) //zapisz instrukcję sterującą do LCD
{
cbi(PORTB,lcd_rs);
sbi(PORTB,lcd_e);
PORTB=(PORTB&0x0f)|(instr&0xf0); //przygotuj starszy półbajt do LCD
asm("nop"); //wymagane wydłużenie impulsu
asm("nop");
asm("nop");
cbi(PORTB,lcd_e); //impuls strobujący
czekaj(10L); //czekaj na gotowość LCD ok. 100us
sbi(PORTB,lcd_e);
PORTB=(PORTB&0x0f)|((instr&0x0f)<<4); //przygotuj młodszy półbajt do LCD
asm("nop");
asm("nop");
asm("nop");
cbi(PORTB,lcd_e); //impuls strobujący
czekaj(10L); //czekaj na gotowość LCD ok. 100us
}
void piszdlcd(char dana) //zapisz daną do LCD
{
sbi(PORTB,lcd_rs);
sbi(PORTB,lcd_e);
PORTB=(PORTB&0x0f)|(dana&0xf0); //przygotuj starszy półbajt do LCD
asm("nop"); //wymagane wydłużenie impulsu
asm("nop");
asm("nop");
cbi(PORTB,lcd_e); //impuls strobujący
czekaj(10L); //czekaj na gotowość LCD
sbi(PORTB,lcd_e);
PORTB=(PORTB&0x0f)|((dana&0x0f)<<4); //przygotuj młodszy półbajt do LCD
asm("nop");
asm("nop");
asm("nop");
cbi(PORTB,lcd_e); //impuls strobujący
czekaj(10L); //czekaj na gotowość LCD
}
void czysclcd(void) //czyść ekran
{
piszilcd(0x01); //polecenie czyszczenia ekranu dla kontrolera LCD
czekaj(1.64*tau); //rozkaz 0x01 wykonuje się 1.64ms
kolumna=0;
}
void piszznak(char znak) //procedura umieszcza znak na wyświetlaczu
{
unsigned char p;
if(kolumna<8)
{
p=kolumna;
}
else
{
p=kolumna+56; //dodatkowe przesunięcie współrzędnych dla LCD 1x16
//dla drugiej połówki wyświetlacza
}
piszilcd(p|0x80);
kolumna=kolumna!=15?++kolumna:0; //ustaw następną kolumnę
piszdlcd(znak); //wyświetl znak na LCD
}
void lcdy(unsigned char k) //ustaw współrzędne kursora
{
if(k<8)
{
piszilcd(k|0x80); //standardowy rozkaz sterownika LCD
//ustawiający kursor w określonych współrzędnych
}
else
{
piszilcd((k+56)|0x80); //dodatkowe przesunięcie współrzędnych dla LCD 1x16
}
kolumna=k;
}
void pisztekst(char *tekst) //pisz tekst na LCD wskazywany pointerem *tekst
{
char nr=0;
char zn;
while(1)
{
zn=PRG_RDB(&tekst[nr++]); //pobranie znaku z pamięci programu
if(zn!=0) //czy nie ma końca tekstu?
{
if(zn==CR) //czy znak nowej linii
{
kolumna=0; //jeśli tak, ustaw obowiązujące po zmianie współrzędne na LCD
}
else
{
piszznak(zn); //umieść pojedynczy znak tekstu na LCD
}
}
else
{
break; //zakończ pętlę, jeśli koniec tekstu
}
}
}
void klawisz(unsigned char pozkl) //czekaj na naciśnięcie określonego klawisza
//klawisz jest wybierany poprzez argument pozkl
{
while((PIND&pozkl)==pozkl); //czekaj na naciśnięcie klawisza
czekaj(30*tau); //odczekaj aż ustaną zakłócenia
while((PIND&pozkl)!=pozkl); //czekaj na zwolnienie klawisza
}
int main(void) //program główny
{
unsigned char i;
//>>>>>>>>>>>>> definicje tekstów wyświetlanych na LCD <<<<<<<<<<<<<<
char *tekst1=PSTR("Wyswietlacz 1x16");
char *tekst2=PSTR("Hello World!");
Czy może ktoś napisać gdzie w tym kodzie jest odpowiednik:
config lcd ..
(chodzi mi o możliwość dowolnego skonfigurowania portów lcd db4-7, RS,E)
lcd ...
(chodzi mi o logikę wyświetlania danych- czy to jest wysyłany cały wyraz, czy operujemy poszczególnymi polami o konkretnych współrzędnych, czy wysyłamy jakieś dane bin jak w VFD)
Bardzo proszę, że by wpisy były naprawdę jasne dla początkujących bez elokwencji wszystkowiedzących. Ja postaram się bardziej precyzyjnie opisać problem jeżeli będzie taka potrzeba.
Kolejnym poważnym problemem jest interpretacja kompilatora AVR-GCC ale to może następnym razem.
Mam nadzieje, że uda się nam stworzyć coś co innym początkującym pomoże rozwiązywać "banalne" i oczywiste problemy.
dzięki
wojtekr