Jag gjorde såhär, när jag skulle skriva ut på en LCD-display som vill ha ASCII-tecken. Att "omvandla" till ASCII görs helt enkelt genom att addera värdet för ASCII-tecknet '0', tar man bort det får man sin binärdata som är lämpligt till en LED-displaydriver.
/* chartoa: convert "char" unsigned 8 bit variable c
to ASCII-characters in global string s[] */
void chartoa(unsigned char c, char* p_s)
{
char i;
unsigned char temp;
p_s[3]='\0';
for (i = 2; ;i--){
temp = c % 10;
temp += '0'; // Delete this line to get binary data output
p_s[i]=temp;
if (i==0) break;
c /= 10;
}
}
Alltså pekaren p_s pekar på en global char-array där man hittar sitt utdata.
Men nu skulle inte PopUnoNkoK ha ascii-kod utan kod för 7-segmentsdisplay.
Det betyder att när man väl fått fram en rad siffror i BCD-format i RAM-minnet så ska var och en omvandlas till 7-segmentskod innan de skickas ut (parallellt?) på någon port. Antingen gör man det i en separat rutin som läser siffororna ur ram-minnet och ersätter dem med 7-segmenst-kod. En annan variant är att bygga in den i den rutin som visar tecknen på displayen och att de då omvandlas i realtid så att säga.
Det kan man göra med indexerad adressering av data i programminnet eller i EEPROM. Du anger adressen till listan och adderar värdet på BCD-siffran och du kan läsa innehållet på den adressen.
Då har du en lista som lämpligtvis är 10 eller 16 bytes lång. Varje byte innehåller 7 bitar som motsvarar de segment som ska lysa. Tecknen 0-9 ska givetvis visa siffrorna 0-9, tecknen 10-15 kan då visa vad man önskar, t.ex. A-F eller andra tecken (som minus). Eftersom jag inte kan PIC ska jag nog inte gå in mer på detaljer, men det är väl principen..
(Eeh.. ett alternativ ska kanske vara "svart" också, så att du kan släcka t.ex. första siffran när den inte används utan att krångla. Då kan du t.ex. i programmet byta ut inledande nollor till "svart" innan de skickas ut)
För att räkna ut vad som ska stå i listan får du rita upp tecknen på displayen och kolla vilka segment som ska lysa. Dessa sätter du som "etta". och sätta bitarna i den ordning som du ansluter segmenten till porten.
Sen ska du ju ha tre siffror. Då får du antingen låta processorn hela tiden rotera mellan de tre siffrorna (genom att ha en transistor på den gemensamma anoden (eller katoden) eller så kan du använda lite mer extern logik (shiftregister t.ex.) och skifta ut data så att alla tre siffrorna visas statiskt, så kan processorn göra något annat.