/Designs/STOPWATCH01B/SW/1_00/A.BAT
0,0 → 1,3
call picpgr erase pic16f84
call picpgr program stopky.hex hex pic16f84
call picpgr run
/Designs/STOPWATCH01B/SW/1_00/LCD.C
0,0 → 1,300
// LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
// (c)miho 2002
//
// Historie:
//
// 0.00 Uvodni verze se snadnou definici portu LCD displeje
// 0.01 Oprava portu (zapomenute stare identifikatory)
// 0.02 Doplnena moznost pripojeni datoveho portu LCD na libovolne porty
//
//
// Funkce:
//
// lcd_init() inicializuje LCD displej a porty, nutno volat jako prvni
//
// lcd_putc(c) zapis snaku do lcd displeje, zpracovava nasledujici ridici znaky
// \f = \x0C - nova stranka - smazani displeje
// \n = \x0A - odradkovani (prechod na druhou radku)
// \b = \x08 - backspace - posunuti kurzoru o 1 pozici zpet
// \r = \x0D - goto home to position 1,1
// \0 .. \7 - definovatelne znaky v pozicich 0 az 7 v CGRAM
// \20 .. \27 - alternativne zapsane znaky (oktalove) v pozicich 0 az 7 CGRAM
// Pozor na to, ze funkce printf konci tisk pokud narazi na \0 (konec retezce)
//
// lcd_gotoxy(x,y) presune kurzor na uvedenou adresu
// nekontroluje parametry
//
// lcd_cursor_on zapne kurzor
// lcd_cursor_off vypne kurzor
//
// lcd_define_char(Index, Def) Makro, ktere definuje znaky od pozice Index obsahem definicniho
// retezce Def. Kazdych 8 znaku retezce Def definuje dalsi znak v CGRAM.
// Kapacita CGRAM je celkem 8 znaku s indexem 0 az 7.
// Na konci se provede lcd_gotoxy(1,1).
// Na konci teto knihovny je priklad pouziti definovanych znaku
//
//
// Definice portu: // Datovy port displeje pripojeny na 4 bity za sebou na jeden port
//
// #define LCD_RS PIN_B2 // rizeni registru LCD displeje
// #define LCD_E PIN_B1 // enable LCD displeje
// #define LCD_DATA_LSB PIN_C2 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
//
//
// Alternativni definice: // Datovy port displeje pripojeny na libovolne 4 bitove porty (vede na kod delsi asi o 25 slov)
//
// #define LCD_RS PIN_B2 // rizeni registru LCD displeje
// #define LCD_E PIN_B1 // enable LCD displeje
// #define LCD_D0 PIN_C2 // D0 - datove bity pripojene na libovolne porty
// #define LCD_D1 PIN_C3 // D1
// #define LCD_D2 PIN_C4 // D2
// #define LCD_D3 PIN_C5 // D3
 
 
 
 
// Privatni sekce, cist jen v pripade, ze neco nefunguje
 
 
 
 
#ifdef LCD_DATA_LSB
// Generovane defince portu pro ucely teto knihovny aby kod generoval spravne IO operace a soucasne
// bylo mozne jednoduse deklarovat pripojene piny LCD displeje pri pouziti teto knihovny. Problem spociva
// v tom, ze se musi spravne ridit smery portu a soucasne datovy port zabira jen 4 bity ze zadaneho portu
//
#define LCD_SHIFT (LCD_DATA_LSB&7) // pocet bitu posuvu datoveho kanalu v datovem portu
#define LCD_PORT (LCD_DATA_LSB>>3) // adresa LCD datoveho portu
#define LCD_TRIS (LCD_PORT+0x80) // adresa prislusneho TRIS registru
#define LCD_MASK (0xF<<LCD_SHIFT) // maska platnych bitu
//
#if LCD_SHIFT>4 // kontrola mezi
#error LCD data port LSB bit not in range 0..4
#endif
#endif
 
 
// Definice konstant pro LCD display
//
#define LCD_CURSOR_ON_ 0x0E // kurzor jako blikajici radka pod znakem
#define LCD_CURSOR_OFF_ 0x0C // zadny kurzor
#define LCD_LINE_2 0x40 // adresa 1. znaku 2. radky
 
 
// Definice rezimu LCD displeje
//
BYTE const LCD_INIT_STRING[4] =
{
0x28, // intrfejs 4 bity, 2 radky, font 5x7
LCD_CURSOR_OFF_, // display on, kurzor off,
0x01, // clear displeje
0x06 // inkrement pozice kurzoru (posun kurzoru doprava)
};
 
 
// Odesle nibble do displeje (posle data a klikne signalem e)
//
void lcd_send_nibble( BYTE n )
{
#ifdef LCD_DATA_LSB
// data jsou za sebou na 4 bitech jednoho portu
*LCD_PORT = (*LCD_PORT & ~LCD_MASK) | ((n << LCD_SHIFT) & LCD_MASK); // nastav datove bity portu a ostatni zachovej
#else
// data jsou na libovolnych 4 bitech libovolnych portu
output_bit(LCD_D0,bit_test(n,0));
output_bit(LCD_D1,bit_test(n,1));
output_bit(LCD_D2,bit_test(n,2));
output_bit(LCD_D3,bit_test(n,3));
#endif
output_bit(LCD_E,1); // vzestupna hrana
delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
}
 
 
// Odesle bajt do registru LCD
//
// Pokud je Adr=0 .. instrukcni registr
// Pokud je Adr=1 .. datovy registr
//
void lcd_send_byte( BOOLEAN Adr, BYTE n )
{
output_bit(LCD_RS,Adr); // vyber registr
swap(n);
lcd_send_nibble(n); // posli horni pulku bajtu
swap(n);
lcd_send_nibble(n); // posli spodni pulku bajtu
delay_us(40); // minimalni doba na provedeni prikazu
}
 
 
// Provede inicializaci LCD displeje, smaze obsah a nastavi mod displeje
//
// Tato procedura se musi volat pred pouzitim ostatnich lcd_ procedur
//
void lcd_init()
{
 
int i; // pocitadlo cyklu
 
delay_ms(20); // spozdeni pro provedeni startu displeje po zapnuti napajeni
 
#ifdef LCD_DATA_LSB
// data jsou na 4 bitech za sebou, nastav smer pro vsechny dalsi prenosy
*LCD_TRIS = *LCD_TRIS & ~LCD_MASK; // nuluj odpovidajici bity tris registru datoveho portu LCD
#endif
 
output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
 
for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
{
delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
lcd_send_nibble(3); // rezim 8 bitu
}
 
delay_us(40); // cas na zpracovani
lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
delay_us(40); // cas na zpracovani
 
for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
{
lcd_send_byte(0,LCD_INIT_STRING[i]);
delay_ms(2);
}
}
 
 
// Proved presun kurzoru
//
// Pozice 1.1 je domu
//
void lcd_gotoxy( BYTE x, BYTE y)
{
 
BYTE Adr;
 
Adr=x-1;
if(y==2)
Adr+=LCD_LINE_2;
 
lcd_send_byte(0,0x80|Adr);
}
 
 
// Zapis znaku na displej, zpracovani ridicich znaku
//
void lcd_putc( char c)
{
 
switch (c)
{
case '\f' : lcd_send_byte(0,1); // smaz displej
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
case '\r' : lcd_gotoxy(1,1); break; // presun home
case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
lcd_send_byte(1,c); break; // zapis znak
}
}
 
 
// Zapni kurzor
//
void lcd_cursor_on()
{
lcd_send_byte(0,LCD_CURSOR_ON_);
}
 
 
// Vypni kurzor
//
void lcd_cursor_off()
{
lcd_send_byte(0,LCD_CURSOR_OFF_);
}
 
 
// Definice vlastnich fontu
//
// Vlastnich definic muze byt jen 8 do pozic 0 az 7 pameti CGRAM radice lcd displeje
// Pro snadne definovani jsou pripraveny nasledujici definice a na konci souboru je uveden
// priklad pouziti definovanych znaku.
 
 
// Pomocna procedura pro posilani ridicich dat do radice displeje
//
void lcd_putc2(int Data)
{
lcd_send_byte(1,Data);
}
 
 
// Pomocne definice pro programovani obsahu CGRAM
//
#define lcd_define_start(Code) lcd_send_byte(0,0x40+(Code<<3)); delay_ms(2)
#define lcd_define_def(String) printf(lcd_putc2,String);
#define lcd_define_end() lcd_send_byte(0,3); delay_ms(2)
 
 
// Vlastni vykonne makro pro definovani fontu do pozice Index CGRAM s definicnim retezcem Def
//
#define lcd_define_char(Index, Def) lcd_define_start(Index); lcd_define_def(Def); lcd_define_end();
 
 
// Pripravene definice fontu vybranych znaku
// V tabulce nesmi byt 00 (konec retezce v printf()), misto toho davame 80
//
#define LCD_CHAR_BAT100 "\x0E\x1F\x1F\x1F\x1F\x1F\x1F\x1F" /* symbol plne baterie */
#define LCD_CHAR_BAT50 "\x0E\x1F\x11\x11\x13\x17\x1F\x1F" /* symbol polovicni baterie */
#define LCD_CHAR_BAT0 "\x0E\x1F\x11\x11\x11\x11\x11\x1F" /* symbol vybite baterie */
#define LCD_CHAR_UP "\x80\x04\x0E\x15\x04\x04\x04\x80" /* symbol sipka nahoru */
#define LCD_CHAR_DOWN "\x80\x04\x04\x04\x15\x0E\x04\x80" /* symbol Sipka dolu */
#define LCD_CHAR_LUA "\x04\x0E\x11\x11\x1F\x11\x11\x80" /* A s carkou */
#define LCD_CHAR_LLA "\x01\x02\x0E\x01\x1F\x11\x0F\x80" /* a s carkou */
#define LCD_CHAR_HUC "\x0A\x0E\x11\x10\x10\x11\x0E\x80" /* C s hackem */
#define LCD_CHAR_HLC "\x0A\x04\x0E\x10\x10\x11\x0E\x80" /* c s hackem */
#define LCD_CHAR_HUD "\x0A\x1C\x12\x11\x11\x12\x1C\x80" /* D s hackem */
#define LCD_CHAR_HLD "\x05\x03\x0D\x13\x11\x11\x0F\x80" /* d s hackem */
#define LCD_CHAR_LUE "\x04\x1F\x10\x10\x1E\x10\x1F\x80" /* E s carkou */
#define LCD_CHAR_LLE "\x01\x02\x0E\x11\x1F\x10\x0E\x80" /* e s carkou */
#define LCD_CHAR_HUE "\x0A\x1F\x10\x1E\x10\x10\x1F\x80" /* E s hackem */
#define LCD_CHAR_HLE "\x0A\x04\x0E\x11\x1F\x10\x0E\x80" /* e s hackem */
#define LCD_CHAR_LUI "\x04\x0E\x04\x04\x04\x04\x0E\x80" /* I s carkou */
#define LCD_CHAR_LLI "\x02\x04\x80\x0C\x04\x04\x0E\x80" /* i s carkou */
#define LCD_CHAR_HUN "\x0A\x15\x11\x19\x15\x13\x11\x80" /* N s hackem */
#define LCD_CHAR_HLN "\x0A\x04\x16\x19\x11\x11\x11\x80" /* n s hackem */
#define LCD_CHAR_LUO "\x04\x0E\x11\x11\x11\x11\x0E\x80" /* O s carkou */
#define LCD_CHAR_LLO "\x02\x04\x0E\x11\x11\x11\x0E\x80" /* o s carkou */
#define LCD_CHAR_HUR "\x0A\x1E\x11\x1E\x14\x12\x11\x80" /* R s hackem */
#define LCD_CHAR_HLR "\x0A\x04\x16\x19\x10\x10\x10\x80" /* r s hackem */
#define LCD_CHAR_HUS "\x0A\x0F\x10\x0E\x01\x01\x1E\x80" /* S s hackem */
#define LCD_CHAR_HLS "\x0A\x04\x0E\x10\x0E\x01\x1E\x80" /* s s hackem */
#define LCD_CHAR_HUT "\x0A\x1F\x04\x04\x04\x04\x04\x80" /* T s hackem */
#define LCD_CHAR_HLT "\x0A\x0C\x1C\x08\x08\x09\x06\x80" /* t s hackem */
#define LCD_CHAR_LUU "\x02\x15\x11\x11\x11\x11\x0E\x80" /* U s carkou */
#define LCD_CHAR_LLU "\x02\x04\x11\x11\x11\x13\x0D\x80" /* u s carkou */
#define LCD_CHAR_CUU "\x06\x17\x11\x11\x11\x11\x0E\x80" /* U s krouzkem */
#define LCD_CHAR_CLU "\x06\x06\x11\x11\x11\x11\x0E\x80" /* u s krouzkem */
#define LCD_CHAR_LUY "\x02\x15\x11\x0A\x04\x04\x04\x80" /* Y s carkou */
#define LCD_CHAR_LLY "\x02\x04\x11\x11\x0F\x01\x0E\x80" /* y s carkou */
#define LCD_CHAR_HUZ "\x0A\x1F\x01\x02\x04\x08\x1F\x80" /* Z s hackem */
#define LCD_CHAR_HLZ "\x0A\x04\x1F\x02\x04\x08\x1F\x80" /* z s hackem */
 
 
// Priklad pouziti definovanych znaku
//
//
//void lcd_sample()
//{
// lcd_define_char(0,LCD_CHAR_BAT50); // Priklad definice znaku baterie do pozice 0
// lcd_define_char(2,LCD_CHAR_HLE LCD_CHAR_LUI); // Priklad definice znaku e s hackem a I s carkou od pozice 2
// // vsimnete si, ze neni carka mezi retezci s definici (oba retezce definuji
// // jediny definicni retezec)
// printf(lcd_putc,"\fZnaky:\20\22\23"); // priklad vypisu znaku z pozice 0, 2 a 3
// delay_ms(1000);
// lcd_define_char(0,LCD_CHAR_BAT0); // Predefinovani tvaru znaku v pozici 0
// delay_ms(1000);
//}
/Designs/STOPWATCH01B/SW/1_00/STOPKY.C
0,0 → 1,221
// Program STOPKY pro mereni casu prujezdu mezi cidlama pro souteze solarnich robotu
//
// (c) miho 2004
//
// Historie
//
// 1.00 Uvodni verze
 
#define VER "1.00"
 
// Definice zakladnich parametru
//
#include <16F84.h> // procesor
#use delay(clock=4000000) // krystal
#use rs232(baud=9600, xmit=PIN_B4) // seriovka a jeji parametry
#fuses XT,PUT,NOWDT,NOPROTECT // prepinace
 
 
// Definice pro pripojeni LCD displeje
//
#define LCD_RS PIN_A2 // Signal RS
#define LCD_E PIN_A3 // Signal E
#define LCD_D0 PIN_A4 // Data
#define LCD_D1 PIN_B1
#define LCD_D2 PIN_B2
#define LCD_D3 PIN_B3
#include <LCD.C>
 
 
// Definice pro pripojeni vstupu (cidel)
//
#define BUTTON_START PIN_B7 // Tlacitko START
#define BUTTON_STOP PIN_B6 // Tlacitko STOP
#define BUTTON_TEST PIN_B5 // Tlacitko TEST pro prechod do testovaciho rezimu
 
 
// Defince pro pripojeni vystupu pro pipak
//
#define BEEP_PORT_P PIN_A0 // Piezo pipak pozitivni
#define BEEP_PORT_N PIN_A1 // Piezo pipak negativni
 
 
// Definice globalnich promennych
//
unsigned int Beep; // citac pulperiod pro pipnuti
short int Beep_state; // stav pipaku (0 nebo 1)
unsigned int State_run; // 0 .. klid
// 1 .. bezi mereni casu
// 2 .. cas zmereny
 
 
// Obsluha vstupu cidel
//
// Cas se meri od signalu na tlacitku START po signal na tlacitku STOP
// Signaly na tlacitkach vyvolaji preruseni a dojde k preklopeni stavu v promenne State_run
//
#int_RB
RB_isr()
{
if(State_run)
{
if(~input(BUTTON_STOP))
{
State_run=2; // Domereno
Beep=100;
disable_interrupts(INT_RB); // Zakaz vstup tlacitek aby byl cas na zpracovani
}
}
else
{
if(~input(BUTTON_START))
{
State_run=1;
Beep=100;
}
}
}
 
 
// Obsluha preruseni od casovace
//
unsigned int32 Time; // citac casu (perioda 256us)
 
#int_RTCC
RTCC_isr()
{
if(State_run==1) Time++; // zvetsi citac
 
if(Time==(3600000000>>8)) Time=0; // Osetreni preteceni po 1 hodine
 
if(Beep) // pokud se ma pipnout pipni
{ // Beep je pocet pulperiod
Beep--;
output_bit(BEEP_PORT_P,Beep_state);
Beep_state=~Beep_state;
output_bit(BEEP_PORT_N,Beep_state);
}
}
 
 
// Obsluha vystupu a jeho presmerovani na LCD a RS232
//
int PutCharMode;
#define LCD 1
#define RS232 2
void PutChar(char c)
{
if(PutCharMode & LCD) LCD_Putc(c);
if(PutCHarMode & RS232) putc(c);
}
 
 
// Vypis casu - dlouhy program ale jen na jedinem miste
//
void DisplayCas()
{
int32 xTime;
 
// Tisk vysledku v ms
// printf(PutChar,"Cas:%8lums\n\r",(Time<<8)/1000);
 
// Tisk vysledku v s
xTime=(Time<<8)/1000;
printf(PutChar,"Cas:%4lu.%03lus\n\r",xTime/1000,xTime%1000);
}
 
 
// Testovaci rezim
//
void TestMode()
{
 
int T;
 
// Otestuj tlascitko TEST
if(input(BUTTON_TEST)) return;
 
// Vypis na displej
printf(LCD_Putc,"\fTest Mode\n");
 
for(;1;)
{
T=0;
if(~input(BUTTON_START)) T+=1;
if(~input(BUTTON_STOP)) T+=2;
printf(LCD_putc,"\n%d",T);
if(T)
{
if(T==3) T=4;
output_bit(BEEP_PORT_P,0);
output_bit(BEEP_PORT_N,1);
delay_ms(T);
output_bit(BEEP_PORT_P,1);
output_bit(BEEP_PORT_N,0);
delay_ms(T);
}
}
}
 
 
// Hlavni program
//
void main()
{
// Inicializace LCD displeje
lcd_init();
PutCharMode=LCD|RS232;
printf(PutChar,"\n\rStopky v."VER"\r\n(c) miho 2004\n\r");
delay_ms(100);
 
// Inicializace stavovych promennych
State_run=0; // stopky stoji
 
// Inicializace vstupu (preruseni od zmeny stavu)
input(BUTTON_START); // precti RB aby se inicializoval registr zmen RB
port_b_pullups(TRUE); // zapni pull up odpory
 
// Testovaci mod
TestMode();
 
// Inicializace casovace pod prerusenim
setup_counters(RTCC_INTERNAL,WDT_18MS); // Perioda je 256 instrukcnich taktu
 
// Hlavni smycka porad dokola
for(;1;)
{
 
// Nuluj citace
Time=0; // nulovy cas
Beep=0; // nepipej
State_run=0;
 
// Povoleni preruseni
enable_interrupts(INT_RTCC); // povol preruseni od casovace
enable_interrupts(INT_RB); // povol preruseni od zmeny portu RB
enable_interrupts(global); // povol preruseni
 
// Cekej az se zacne merit
for(;State_run==0;)
{
}
 
// Prubezne vypisuj cas
PutCharMode=LCD; // vystup jen na LCD
for(;State_run==1;)
{
DisplayCas();
}
 
// Vypis vysledny cas - na LCD hned
DisplayCas();
 
// Vypis vysledny cas - na RS232 az po pipnuti
delay_ms(100); // ted se pod prerusenim pipa
PutCharMode=RS232;
disable_interrupts(global); // zakaz preruseni (aby fungovalo casovani seriovky)
DisplayCas();
enable_interrupts(global); // opet povol preruseni
 
}
}
/Designs/STOPWATCH01B/SW/1_00/STOPKY.HEX
0,0 → 1,130
:1000000000308A00A62B0000831A0A289100030EF4
:1000100092000F2883129100030E920092140A0896
:1000200099008A018313910E040893000C08940030
:100030000D0895000E0896000F089700100898000C
:1000400083128B1E25280B19AB288B1D29280B1812
:1000500091281308840014088C0015088D001608D8
:100060008E0017088F001808900019088A00120ED9
:1000700083008312110E9218831609000A108A1049
:100080000A11820728340C34013406340A108A100D
:100090000A1182074334613473343A3425343434DA
:1000A0006C3475342E342534303433346C34753438
:1000B00073340A340D3400340A108A100A1182078E
:1000C0000C34543465347334743420344D346F3408
:1000D000643465340A3400340A108A100A11820725
:1000E0000A340D34533474346F3470346B347934CF
:1000F000203476342E3431342E34303430340D34D0
:100100000A3428346334293420346D346934683433
:100110006F34203432343034303434340A340D34D3
:1001200000349C0803199F28831606178312061BA8
:100130009E2802309C0064309A008B11A8288316F8
:1001400086178312861BA82801309C0064309A0011
:100150000B108A1129281C0BB52801309D070318A4
:100160009E0A03199F0A0319A00A1D08A43C031D37
:10017000C8281E08933C031DC8281F08D63C031D31
:10018000C828A008031DC828A0019F019E019D0149
:100190009A080319DE289A031B18D0280510D128C5
:1001A000051483160510013083129B061B18DA28EC
:1001B0008510DB2885148316851083120B118A1194
:1001C00029283B30840000080319F52801308D00F0
:1001D0008C018C0BE9288D0BE8284A308C008C0BA5
:1001E000EF2800000000800BE62800344118FA28B0
:1001F0000512FB280516831605128312C118022961
:1002000086100329861483168610831241190A2941
:1002100006110B290615831606118312C11912291E
:100220008611132986158316861183128515831668
:100230008511000083128511831685118312003405
:10024000BF08031D2529051126290515831605114B
:100250008312C00E4008C100F620C00E4008C10045
:10026000F6200D308C008C0B332900341430BB0089
:10027000E12005118316051183128511831685115E
:100280008312A2012208023C031C4E290230BB004B
:10029000E1200330C100F620A20A42290D308C0073
:1002A0008C0B50290230C100F6200D308C008C0BD5
:1002B0005729A2012208023C031C6A2922083E2079
:1002C000A300BF012308C00020210230BB00E120B1
:1002D000A20A5A29AE2B01303B02BD003C08023C69
:1002E000031D74294030BD073D088038BE00BF01A2
:1002F0003E08C000202100343A088C000C300C026B
:1003000003198F290A300C02031997290D300C02AA
:1003100003199D2908300C020319A229A729BF013E
:100320000130C00020210230BB00E120B3290130A0
:10033000BB000230BC006B21B3290130BB00BC0004
:100340006B21B329BF011030C0002021B3293A0826
:100350001F3C031CAD290730BA050130BF003A0825
:10036000C0002021B329003483160612831206121E
:1003700008308D000000000000008D17CE298D137D
:10038000BA0C03180616031C06120D17CE290D13FE
:100390008D0BC02900000000000006161C308400F0
:1003A000840BD02900008D1BBF290D1BC729E8290C
:1003B00021080139003A0319E0293908BA007C21E3
:1003C00021080239003A0319E8293908BA00B4298A
:1003D000003426088D0125020318F12925088C0018
:1003E000FD298C010830A700A50D8C0D26080C02F4
:1003F00003188C008D0DA70BF429003423088C0002
:10040000A31B062A241D102A20300B2A8C098C0AD3
:100410000C08A3002D308D00BA007C21241DA415EA
:100420002308A5006430A600E9210C08A3000D08EC
:100430003030031D222A2418A415A419282A241AAE
:100440002030242AA41124128D070D08BA007C2123
:100450002308A5000A30A600E9210C08A3000D0816
:100460003030031D372AA4193B2A241A20308D0767
:100470000D08BA007C213030A3072308BA007C2184
:10048000682A831686168312861E472A882AA301A5
:1004900023085C20A30ABA007C210B302302031D31
:1004A000482AA201831686178312861B592A013017
:1004B000A207831606178312061B602A0230A207C2
:1004C0000A30BA007C212208A3001830A400FE29BB
:1004D000A2080319872A2208033C031D712A04304D
:1004E000A20005108316051083128514831685104B
:1004F00083122208BB00E120051483160510831225
:1005000085108316851083122208BB00E120512A32
:10051000C32B8C018D018E018F01C101C201C3016A
:10052000C40140083F043E043D040319C72A20309B
:10053000C5000310B90DBA0DBB0DBC0DC10DC20D28
:10054000C30DC40D40084402031DB02A3F084302F6
:10055000031DB02A3E084202031DB02A3D08410295
:10056000031CC12A3D08C1023E08031C3E0FC20203
:100570003F08031C3F0FC3024008031C400FC40286
:1005800003148C0D8D0D8E0D8F0DC50B992A000057
:100590004130840000340408B3003B30B8009A3086
:1005A000B700CA30B600B5010A30B4003208BC004A
:1005B0003108BB003008BA002F08B9003808C00065
:1005C0003708BF003608BE003508BD008922000884
:1005D000AF00840A0008B000840A0008B100840A51
:1005E0000008B200FD3084078C08031D092B340875
:1005F000013A0319092B330803190A2B0F39340266
:100600000319042B03180F2BF030331B00308C0020
:100610000A2BB30130308C070C08B900D8213808F8
:10062000BC003708BB003608BA003508B900C00165
:10063000BF01BE010A30BD0089220F08B8000E08B4
:10064000B7000D08B6000C08B500B40BD62A00346C
:100650001F08AA001E08A9001D08A800A7011F085E
:10066000BC001E08BB001D08BA002708B900C00165
:10067000BF010330BE00E830BD0089220F08A5008D
:100680000E08A4000D08A3000C08A2002508BC0059
:100690002408BB002308BA002208B900C001BF012A
:1006A0000330BE00E830BD0089220F08A9000E0803
:1006B000A8000D08A7000C08A6002508BC00240807
:1006C000BB002308BA002208B900C001BF010330F3
:1006D000BE00E830BD0089220008AA00840A000894
:1006E000AB00840A0008AC00840A0008AD00FD30AD
:1006F0008407AE012E084620AE0AB900D821043086
:100700002E02031D7A2B043084002908B200280829
:10071000B1002708B0002608AF00CB222E30B90068
:10072000D821433084002D08B2002C08B1002B08DA
:10073000B0002A08AF00CB227330B900D8210A30AC
:10074000B900D8210D30B900D821003484011F3000
:100750008305831606128312061636290330A1007C
:10076000A20122086C20A20AB900D821203022025E
:10077000031DB12B6430BB00E1209C01831686175A
:1007800081138312412A08308C008C1DCF2B073037
:100790008101813084000008C0390F388000640076
:1007A000813084000008C0390C048000A0019F0142
:1007B0009E019D019A019C018B168B158B179C083D
:1007C0000319DF2B0130A1001C0BE82B2823E42B9D
:1007D00028236430BB00E1200230A1008B138B1B67
:0A07E000EE2B28238B17D62B6300A5
:02400E00F13F80
:00000001FF
;PIC16F84