V některých aplikacích je výhodné alespoň přibližně zobrazovat hodnotu čísla analogově. Zapojení jednoduchého 8 segmentového bargrafu se sériovým vstupem dat je na obrázku. K dispozici jsou tři programy napsané v céčku, ale pro příznivce asembleru je i LST výpis, ze kterého lze vyseparovat program v asembleru.
První, jejjednodušší program rozlišuje jen 8 úrovní. Další dva programy mohou mít obecně nelineární dělení a mají rozlišení 16 úrovní tak, že se v mezistupních rozsvítí dvě sousední ledky. První verze je lineární a druhá logaritmická s rozsahem 40 dB.
Zapojení lze snadno rozšířit zřetězením více posuvných registrů. V zapojení se společným předřadným odporem pro všechny ledky nelze zobrazit sloupec, ale pouze bod. Při zobrazení sloupce by každá ledka musela mít svůj odpor.
Výpis programu
#pragma DB OE #pragma code #pragma print #include/* define Atmel registers*/ sbit Data = P3^1; sbit Clk = P3^0; typedef unsigned char byte; /*-------- jednoduchy bargraf bez pouziti serioveho kanalu --------- */ /* 8 ledek, zobrazuje 8 urovni */ void Bar(byte Vstup) { byte i=8; Vstup>>=5; /* zobrazeni ma jen tri bity */ do { if(!Vstup) Data=0; else Data=1; Clk=1; Vstup--; Clk=0; i--; } while(i); } /* -------- lin. zobrazeni 16 Łrovni na 8 ledek pres seriovy kanal --- */ /* pokud by nebyl k dispozici seriovy kanal, je mozne misto SBUF=neco napsat: */ /* ACC=neco; VYS(); */ /* a pouzit nasledujici program v asn: */ /* clkd EQU P3.0 datad EQU P3.1 ; VYS: MOV R7, #8 PRENOS: CLR clkd ;UKONCENI CLK RRC A MOV datad,C ;CARRY DO DATA SETB clkd ;ZACATEK CLK IMPULZU DJNZ R7,PRENOS CLR clkd RET */ void Displedlin(byte i) { if(i>128) { if(i>192) { if(i>224) { if(i>240) SBUF=~128; /* 241-255 */ else SBUF=~192; /* 225-240 */ } else { if(i>208) SBUF=~64; /* 209-224 */ else SBUF=~96; /* 193-208 */ } } else /* 129-192 */ { if(i>160) { if(i>176) SBUF=~32; /* 177-192 */ else SBUF=~48; /*161-176 */ } else { if(i>144) SBUF=~16; /* 145-160 */ else SBUF=~24; /* 129-144 */ } } } else { if(i>64) { if(i>96) { if(i>102) SBUF=~8; /* 103-128 */ else SBUF=~12; /* 97-102 */ } else { if(i>80) SBUF=~4; /* 81-96 */ else SBUF=~6; /* 65-80 */ } } else /* 0-64 */ { if(i>32) { if(i>48) SBUF=~2; /* 49-64 */ else SBUF=~3; /* 33-48 */ } else { if(i>16) SBUF=~1; /* 17-32 */ else SBUF=~0; /* 0-16 */ } } } } /* ----- log. zobrazeni 40 dB s rozlisenim 2,5 dB na 8 ledek ------ */ void Displed(byte i) { if(i>26) { if(i>81) { if(i>143) { if(i>191) SBUF=~128; /* 192-255 */ else SBUF=~192; /* 144-191 */ } else { if(i>108) SBUF=~64; /* 109-143 */ else SBUF=~96; /* 82-108 */ } } else { if(i>45) { if(i>60) SBUF=~32; /* 61-81 */ else SBUF=~48; /* 46-60 */ } else { if(i>34) SBUF=~16; /* 35-45 */ else SBUF=~24; /* 27-34 */ } } } else { if(i>8) { if(i>14) { if(i>19) SBUF=~8; /* 20-26 */ else SBUF=~12; /* 15-19 */ } else { if(i>11) SBUF=~4; /* 12-18 */ else SBUF=~6; /* 9-11 */ } } else /* 0-8 */ { if(i>4) { if(i>6) SBUF=~2; /* 7-8 */ else SBUF=~3; /* 5-6 */ } else { if(i>2) SBUF=~1; /* 3-4 */ else SBUF=~0; /* 0-2 */ } } } } /*--------------- pocatecni inicializace ------------------------------ */ void Pocinic(void) { SCON=0; /* seriovy kanal, rezim 0 */ } /*----------------- hlavni program ------------------------*/ main(void) { Pocinic(); do { Bar(100); } while(1); }
Dovnload rutin - bargraf.zip (6 kb)