PIc16 Hitech och 44780
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Låter fint det, jag återkommer när jag har fått den nya lcd-displayen.
Re: PIc16 Hitech och 44780
> Maila en adress så skickar jag en LCD att labba med.
Jag får nog ta tillbaka det där, jag skickade två istället.
Jag såg att jag hade kvar en del av en äldre modell som i och
för sig saknar backlight, men å andra sidan har original HD44780
controllers (om det nu spelar någon roll). Dessutom kan det
vara trevligt att ha två att labba med istället för en...
Det är postat, kolla "lådan" i morgon...
Jag får nog ta tillbaka det där, jag skickade två istället.
Jag såg att jag hade kvar en del av en äldre modell som i och
för sig saknar backlight, men å andra sidan har original HD44780
controllers (om det nu spelar någon roll). Dessutom kan det
vara trevligt att ha två att labba med istället för en...
Det är postat, kolla "lådan" i morgon...
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Men dra åt fanders..
Fick displayerna idag. kollade koden programmerade pic:en. Första försöket! DET FUNKAR!!!
Idag är det min dag, tror jag.
Tack Sodjan!!
Fick displayerna idag. kollade koden programmerade pic:en. Första försöket! DET FUNKAR!!!
Idag är det min dag, tror jag.

Tack Sodjan!!
Re: PIc16 Hitech och 44780
Jahaja, där ser man. Ja det gäller att ha en jäkla tur ibland !
Eller var det inte bara tur ?
Eller var det inte bara tur ?

- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Nu kommer det liter fler roliga frågor, nu när jag har suttit och kört lite olika saker på displayen.
Hur gör man enklast för att skicka ett heltalsvärde till displayen, jag har några heltal och vill konvertera dessa till strängar för att kunna skickas med lcd_puts?
Jag kör hightech C.
Hur gör man enklast för att skicka ett heltalsvärde till displayen, jag har några heltal och vill konvertera dessa till strängar för att kunna skickas med lcd_puts?
Jag kör hightech C.
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Hehe. problemt är att lcd_puts inte kan formatera heltalsvärden, Så om jag skickar en char så kommer jag få ascii-tecknet som motsvarar värdet.
Jag letar således efter en itos funktion.
Jag letar således efter en itos funktion.
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Vi kan göra så här istället. Jag kommer med en lösning. 
Sida 195 i Hitech C manualen.
Synopsis:
Description
The function itoa converts the contents of val into a string which is stored into buf.
The conversion is performed according to the radix specified in base. buf is assumed
to reference a buffer which has sufficient space allocated to it.
Example

Sida 195 i Hitech C manualen.
Synopsis:
Kod: Markera allt
#include <stdlib.h>
char * itoa (char * buf, int val, int base)
The function itoa converts the contents of val into a string which is stored into buf.
The conversion is performed according to the radix specified in base. buf is assumed
to reference a buffer which has sufficient space allocated to it.
Example
Kod: Markera allt
#include <stdlib.h>
#include <stdio.h>
void
main (void)
{
char buf[10];
itoa(buf, 1234, 16);
printf(" buffer holds %s\n" buf);
}
Re: PIc16 Hitech och 44780
edit: Bah, för långsam.
Problemet var väl ganska uppenbart? Han vet inte hur han ska gå från en integer till en sträng.
Lataste sättet (som jag brukar köra med och kommer få skit för alldeles strax) är att helt enkelt använda printf/sprintf. Det man måste göra är att skriva en liten funktion som kompletterar den inbyggda. Något i stil med:
Om man vill undvika monstret printf kan kanske detta vara ett alternativ (har dock ej testat själv såvitt jag kan komma ihåg):
http://forum.htsoft.com/all/showflat.ph ... n/0/page/0
Problemet var väl ganska uppenbart? Han vet inte hur han ska gå från en integer till en sträng.
Lataste sättet (som jag brukar köra med och kommer få skit för alldeles strax) är att helt enkelt använda printf/sprintf. Det man måste göra är att skriva en liten funktion som kompletterar den inbyggda. Något i stil med:
Kod: Markera allt
void putch(char c)
{
putch_lcd(c);
}
http://forum.htsoft.com/all/showflat.ph ... n/0/page/0
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Ah! Så genom att ändra putch() till sin egen så kommer printf och sprintf att använda den egna enheten istället om jag har förstått detta rätt?
Om detta resonemang stämmer så låter det ganska smart, förutom att printf är onödigt stor i detta sammanhang.
Om detta resonemang stämmer så låter det ganska smart, förutom att printf är onödigt stor i detta sammanhang.
Re: PIc16 Hitech och 44780
> Så om jag skickar en char så kommer jag få ascii-tecknet som motsvarar värdet.
Ja visst. Hur ska den veta vad *du* tycker att din char innehåller ?
LCD rutinen utgår alltid från att du skickar ASCII tecken.
> ...Han vet inte hur han ska gå från en integer till en sträng...
Och det var det jag svarade "som vanligt" på. Men det var inte
tydligt om det hela var en C-fråga, LCD-fråga eller något annat.
Hur som helst, det är ju strängifiering av ganska små integers (max 3 tecken)
som det handlar om. Beroende på hur man vill optimera mellan lathet och
effektiv/kompakt kod så kan man använda lite olika metoder, spritf(), itoa(),
en optimerad C-rutin för just det eller en optimerad inline-ASM snutt t.ex.
Ja visst. Hur ska den veta vad *du* tycker att din char innehåller ?

LCD rutinen utgår alltid från att du skickar ASCII tecken.
> ...Han vet inte hur han ska gå från en integer till en sträng...
Och det var det jag svarade "som vanligt" på. Men det var inte
tydligt om det hela var en C-fråga, LCD-fråga eller något annat.
Hur som helst, det är ju strängifiering av ganska små integers (max 3 tecken)
som det handlar om. Beroende på hur man vill optimera mellan lathet och
effektiv/kompakt kod så kan man använda lite olika metoder, spritf(), itoa(),
en optimerad C-rutin för just det eller en optimerad inline-ASM snutt t.ex.
Re: PIc16 Hitech och 44780
Zajber: Det stämmer. Med andra ord så kan du till exempel även göra något i stil med:
För att spotta ut texten till com-porten. Smidigt 
sodjan: Ok, jag tyckte dock att med tanke på de saker han nämnde "heltal till sträng", "Hightech C" osv så var det inte så svårt att räkna ut vad han var ute efter. Men men, skit samma, jag ska inte kladda ner tråden mer med onödigt tjaffs.
Kod: Markera allt
void
putch(unsigned char byte)
{
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}

sodjan: Ok, jag tyckte dock att med tanke på de saker han nämnde "heltal till sträng", "Hightech C" osv så var det inte så svårt att räkna ut vad han var ute efter. Men men, skit samma, jag ska inte kladda ner tråden mer med onödigt tjaffs.
Re: PIc16 Hitech och 44780
Mitt tips är att undvika stdio.h så långt det bara går. (s)printf och deras vänner äter upp hur mycket kod som helst, även om de ger en bekväm lösning.
Om jag förstått problemet rätt är det om TS har en variabel, typ kalle = 7;, och försöker göra lcd_send(kalle), förvänta sig siffran "7" på displayen men istället se skräp. Lösningen är att istället göra lcd_send('0' + kalle); så kommer siffra upp.
Detta enkla knep funkar bara för ental. Har man exempelvis talet 163 måste man först dela upp det i hundratal, tiotal och ental, för att sen skriva ut dem en och en (med '0' adderat).
Det finns många olika sätt att splitta tal. Här är ett:
Lite mer skitgöra än att använda printf() men man sparar runt 2kb programminne.
Om jag förstått problemet rätt är det om TS har en variabel, typ kalle = 7;, och försöker göra lcd_send(kalle), förvänta sig siffran "7" på displayen men istället se skräp. Lösningen är att istället göra lcd_send('0' + kalle); så kommer siffra upp.
Detta enkla knep funkar bara för ental. Har man exempelvis talet 163 måste man först dela upp det i hundratal, tiotal och ental, för att sen skriva ut dem en och en (med '0' adderat).
Det finns många olika sätt att splitta tal. Här är ett:
Kod: Markera allt
int hundreds, tens, ones;
int num;
hundreds = tens = ones = 0;
num = 163;
while (num >= 100) {
hundreds++;
num -= 100;
}
while (num >= 10) {
tens++;
num -= 10;
}
ones = num;
lcd_send('0' + hundreds);
lcd_send('0' + tens);
lcd_send('0' + ones);
- Zajber
- Inlägg: 451
- Blev medlem: 19 oktober 2009, 22:07:16
- Skype: Andreas.fridh85
- Ort: Rödön
- Kontakt:
Re: PIc16 Hitech och 44780
Det var något liknande jag funderade på först.
Men sen hittade jag itoa(); som gör om heltal till strängar.
Verkar inte ta så mycket minne heller faktiskt, så jag nöjer mig med det.
Men sen hittade jag itoa(); som gör om heltal till strängar.
Verkar inte ta så mycket minne heller faktiskt, så jag nöjer mig med det.