|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
mtome Profesionalec
Pridružen/-a: Pon Jan 2004 14:29 Prispevkov: 168 Kraj: ljubljana
|
Objavljeno: Čet Nov 01, 2007 3:04 pm Naslov sporočila: LCD 2*16 in C |
|
|
Lep pozdrav!
Imam en problem. V C-ju sem naredil svojo knjižnico, za pisanje na alfanumerični display. Med drugim, vsebuje tudi funkcijo, ki izpiše na prikazovalniku nek string (besedo). Funkcija zgleda takole:
lcd-string("beseda");.
Sedaj me pa zanima, kako naj na prikazovalnik izpišem vrednost kakšne spremenljivke, kajti če v mojo funkcijo namesto "beseda" napišem ime spremenljivke, se bo na lcd-ju prikazalo to ime, ne pa njena vrednost?
Uporabljam pa winavr in atmega16 _________________ l.p. Matjaz |
|
Nazaj na vrh |
|
|
Gustav Profesionalec
Pridružen/-a: Pon Jun 2005 17:19 Prispevkov: 768
|
Objavljeno: Čet Nov 01, 2007 3:25 pm Naslov sporočila: |
|
|
sprintf(), preberi help. |
|
Nazaj na vrh |
|
|
mtome Profesionalec
Pridružen/-a: Pon Jan 2004 14:29 Prispevkov: 168 Kraj: ljubljana
|
Objavljeno: Čet Nov 01, 2007 3:44 pm Naslov sporočila: |
|
|
hvala za odgovor _________________ l.p. Matjaz |
|
Nazaj na vrh |
|
|
mtome Profesionalec
Pridružen/-a: Pon Jan 2004 14:29 Prispevkov: 168 Kraj: ljubljana
|
Objavljeno: Čet Nov 01, 2007 6:07 pm Naslov sporočila: |
|
|
Gustav, a lahko malo bolo natančno prosim poveš, kako naj to funkcijo uporabim. Sem mislil, da bom lahko sam ugotovil s pomočjo helpa, vendar mi ni parav dosti jasno to, kar tam piše. _________________ l.p. Matjaz |
|
Nazaj na vrh |
|
|
Gustav Profesionalec
Pridružen/-a: Pon Jun 2005 17:19 Prispevkov: 768
|
Objavljeno: Pet Nov 02, 2007 12:16 am Naslov sporočila: |
|
|
Ta funkcija obdela niz znakov, v katerem so lahko vstavljene razne spremenljivke (razlicnih tipov), glede na prednastavljene parametre (od zamika, stevila mest, paddinga nicel, itd.). Rezultat - za razliko od printf() - "zapise" v ciljno spremenljivko, sicer je pa delovanje identicno. Printf zagotovo poznas ... ce ne, pa je to tako zelo osnovna stvar, da je na siroko obrazlozena v vsakem tutorialu za C
Uporabis jo tako, da ji kot parameter podas niz za formatiranje ter parametre za oblikovanje, rezultat, ki je ze v dokoncni obliki pa potem podas tvoji funkciji za izpis (lcd-string()), ki ga spravi na zaslon.
P.S. vezaj je slab znak za vkljucitev v ime funkcije, saj nekateri ljudje prisejo kodo tako nepregledno, da pred in za operatorji ne dajo presledkov in je zato koda precej manj berljiva ce se v njej znajdejo tudi funkcije z '-' v imenu. |
|
Nazaj na vrh |
|
|
mtome Profesionalec
Pridružen/-a: Pon Jan 2004 14:29 Prispevkov: 168 Kraj: ljubljana
|
Objavljeno: Pet Nov 02, 2007 9:14 am Naslov sporočila: |
|
|
Kaj pa je ta parameter za oblikovanje? V helpu piše, da rabi funkcija dva parametra(__s, __fmt). Najberš je ta __s string, ki ga podamo, samo kaj pa je potem __fmt.
Nisem prepričan, če ste me prav razumeli. Jaz imam neko spremenljivko, ki ima svojo vrednost (npr. a=150). Sedaj pa bi rad poklical mojo funkcijo za pisanje po lcd-ju, vendar bi rad da se izpiše 150 in na a. Se pravi, moral bi iz enaga integerja ali char-a naredeti string s tremi mesti:
string[0]=<ascii koda za št.1>
string[1]=<ascii koda za št.5>
itd.
To funkcijo bi sicer lahko šel sam pisati, vendar se stvari zakomplicirajo, če mora biti funkcija taka, da bi delovala v vseh primerih, saj bi najprej morala določiti število mest, število decimalnih mest, zbrisati vse nepotrebne ničle...
Upam, da sem malo bolje razložil moj problem. Ali še vedno mislite, da bi ga lahko raešil s sprintf funkcijo? _________________ l.p. Matjaz |
|
Nazaj na vrh |
|
|
Gustav Profesionalec
Pridružen/-a: Pon Jun 2005 17:19 Prispevkov: 768
|
Objavljeno: Pet Nov 02, 2007 9:18 am Naslov sporočila: |
|
|
Mi smo te super razumeli, bojim pa se, da nas ti nisi - oblikovanje je povsem identicno ukazu printf(), ki je opisan v vsakem C tutorialu, katerih je na Internetu malo morje.
buffer = sprintf("%d", a);
lcd-string(buffer); |
|
Nazaj na vrh |
|
|
mtome Profesionalec
Pridružen/-a: Pon Jan 2004 14:29 Prispevkov: 168 Kraj: ljubljana
|
Objavljeno: Pet Nov 02, 2007 9:14 pm Naslov sporočila: |
|
|
Sem sprobal, pa še vedno ne dela . Lcd izpiše kar neke čudne znake. Sem pa malo pogledal tisti tutorial, pa mi ni jasno, če naj bi sprintf() izpisal znake v neko spremenljivko, kak naj to naredi, če spremenljivka ni definirana kot string, ampak npr. navaden char.
Moje drugo vprašanje pa je, kaj naj bi bil tisti "%d"?
Še zadnje vprašanje pa se glasi, ali se vsega tega ne bi dalo narediti tako, da bi malo prihranil na flash pomnilniku, saj samo že prokram, ki izpiše neko spremenljivko na LCD zasede cca 2,3 kB pomnilnika. Pri atmega16 to ni problem, če bi pa isti program hotel vpisati v npr. attiny2313, pa to ne bi šlo, saj ima "samo" 2 kB flasha.
p.s. Moja funkcija za izpis stringa prispeva pribljižno 600 B k zasedenosti pomnilnika. Ali je to veliko za takšno funkcijo in ali bi jo lahko kako zmanjšal? _________________ l.p. Matjaz |
|
Nazaj na vrh |
|
|
Gustav Profesionalec
Pridružen/-a: Pon Jun 2005 17:19 Prispevkov: 768
|
Objavljeno: Pet Nov 02, 2007 9:30 pm Naslov sporočila: |
|
|
Ni char, je niz znakov (najbrz pointer tipa char, ki kaze na niz znakov ... seveda je potrebno prostor zanj alocirati, da kaj kar tretjega ne pregazi). Jaz za take primere uporabim kar staticen niz znakov, torej prealociran in fiksne dolzine.
%d je parameter za oblikovanje znakovnega niza, ki pove, da je potrebno vrednost spremenljivke interpretirati kot celo stevilo, kar je lepo razlozeno vseh v tutorialih za C, na katere sem ti dal povezavo vceraj in katere bi res moral prebrati, saj ti delajo tezave cisto osnovni konstrukti jezika in njegova verjetno najpogosteje uporabljana funkcija (tudi pri MCUjih !).
Vcasih je bilo potrebno za to kupiti oz. si izposoditi knjigo, danes pa imas vse na Internetu ZASTONJ |
|
Nazaj na vrh |
|
|
sandi Profesionalec
Pridružen/-a: Pet Nov 2006 20:36 Prispevkov: 55
|
Objavljeno: Čet Jan 24, 2008 1:17 pm Naslov sporočila: |
|
|
Kar nekaj časa se vrtim okrog kode:
lcd_clear();
stanje= lcd_sprintf("%d",x);
lcd_string(stanje);
vedno mi napiše undefined symbol `lcd_sprintf`
Kje sem naredil napako.
Delam s CodeVisionAVR. _________________ vsak začetek je težak-hvala za pomoč! |
|
Nazaj na vrh |
|
|
Gustav Profesionalec
Pridružen/-a: Pon Jun 2005 17:19 Prispevkov: 768
|
Objavljeno: Pet Jan 25, 2008 8:28 pm Naslov sporočila: |
|
|
Kaj pa naj bi bilo to lcd_sprintf() ? V C-ju obstaja funkcija sprinf(), brez prefiksa "lcd_". Pobrisi to pa bo delovalo (ce je preostanek programa pravilen). |
|
Nazaj na vrh |
|
|
sandi Profesionalec
Pridružen/-a: Pet Nov 2006 20:36 Prispevkov: 55
|
Objavljeno: Sob Jan 26, 2008 8:40 pm Naslov sporočila: |
|
|
Poskušal sem tudi to vendar ni uspešno. Prilagam kodo celega programa pri katerem javi napako v zgoraj omenjenem ukazu.
#include <tiny26>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd>
#define tipka PINB.0
#define led PORTB.1
unsigned char a;
unsigned int stanje;
unsigned int x;
void main(void)
{
Func0=In
State0=T
PORTA=0x00;
DDRA=0x00;
Func0=In
PORTB=0x02;
DDRB=0x02;
TCCR0=0x00;
TCNT0=0x00;
PLLCSR=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
USICR=0x00;
ACSR=0x80;
lcd_init(16);
lcd_putsf("dela") ;
a=1; stanje=0;
while (1)
{
led=tipka;
if ((a=0)&(tipka==0))
{stanje++;
lcd_clear();
stanje= sprintf("%d",x);
lcd_string(stanje);
a=1;
}
if ((tipka==1)&(a=1))
{
a=0;
};
};
} _________________ vsak začetek je težak-hvala za pomoč! |
|
Nazaj na vrh |
|
|
Domenius Profesionalec
Pridružen/-a: Čet Feb 2005 15:58 Prispevkov: 75 Kraj: Trbovlje
|
Objavljeno: Ned Jan 27, 2008 12:53 pm Naslov sporočila: |
|
|
Mogoče javlja napako ker nimaš .h na koncu header datotek pri #include. _________________ It's electric! |
|
Nazaj na vrh |
|
|
sandi Profesionalec
Pridružen/-a: Pet Nov 2006 20:36 Prispevkov: 55
|
Objavljeno: Ned Jan 27, 2008 7:59 pm Naslov sporočila: |
|
|
to si čarovnik sam postavi in mi je do sedaj bilo vse ok. _________________ vsak začetek je težak-hvala za pomoč! |
|
Nazaj na vrh |
|
|
sandi Profesionalec
Pridružen/-a: Pet Nov 2006 20:36 Prispevkov: 55
|
Objavljeno: Ned Jan 27, 2008 8:08 pm Naslov sporočila: |
|
|
sem poskusil dodati #include.h in zamenjat #include <tiny26> z prejšnjim ukazom pa javi še več napak. _________________ vsak začetek je težak-hvala za pomoč! |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu You cannot attach files in this forum You cannot download files in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|