Blame | Last modification | View Log | Download
CCS PCW C Compiler, Version 3.110, 15448Filename: d:\@kaklik\programy\pic_c\prenos\letadlo\prijimac\main.LSTROM used: 730 (71%)Largest free fragment is 294RAM used: 9 (13%) at main() level26 (38%) worst caseStack: 5 locations*0000: MOVLW 000001: MOVWF 0A0002: GOTO 2510003: NOP.................... #include "main.h".................... #include <16F84.h>.................... //////// Standard Header file for the PIC16F84 device ////////////////.................... #device PIC16F84.................... #list........................................ #use delay(clock=4000000)*000C: MOVLW 1A000D: MOVWF 04000E: MOVF 00,W000F: BTFSC 03.20010: GOTO 0200011: MOVLW 010012: MOVWF 0D0013: CLRF 0C0014: DECFSZ 0C,F0015: GOTO 0140016: DECFSZ 0D,F0017: GOTO 0130018: MOVLW 4A0019: MOVWF 0C001A: DECFSZ 0C,F001B: GOTO 01A001C: NOP001D: NOP001E: DECFSZ 00,F001F: GOTO 0110020: RETLW 00*011B: MOVLW 1D011C: MOVWF 04011D: MOVLW FC011E: ANDWF 00,F011F: RRF 00,F0120: RRF 00,F0121: MOVF 00,W0122: BTFSC 03.20123: GOTO 1280124: GOTO 1260125: NOP0126: DECFSZ 00,F0127: GOTO 1250128: GOTO 154 (RETURN).................... #fuses XT,NOWDT,PUT............................................................ #include "..\common.h".................... #DEFINE OSA_X 0 // adresy os.................... #DEFINE OSA_Y 1.................... #DEFINE TLs 2.................... #DEFINE IMPULS 250 // sirka impulsu............................................................ #DEFINE LCD_RS PIN_B1 // rizeni registru LCD displeje.................... #DEFINE LCD_E PIN_B0 // enable LCD displeje.................... #DEFINE LCD_DATA_LSB PIN_B2 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou).................... #INCLUDE "MYLCD.C".................... // LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem.................... // (c)miho 2002.................... //.................... // Historie:.................... //.................... // 0.0 Uvodni verze se snadnou definici portu LCD displeje.................... //.................... //.................... // 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:.................... //.................... // #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).................................................................................................... // Privatni sekce, cist jen v pripade, ze neco nefunguje.................................................................................................... // 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 dataoveho 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............................................................ // 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).................... };*0004: BCF 0A.00005: BCF 0A.10006: BCF 0A.20007: ADDWF 02,F0008: RETLW 280009: RETLW 0C000A: RETLW 01000B: RETLW 06............................................................ // Odesle nibble do displeje (posle data a klikne signalem e).................... //.................... void lcd_send_nibble( BYTE n ).................... {.................... *LCD_PORT = (*LCD_PORT & ~LCD_MASK) | ((n << LCD_SHIFT) & LCD_MASK); // nastav datove bity portu a ostatni zachovej*0021: MOVF 06,W0022: ANDLW C30023: MOVWF 210024: RLF 20,W0025: MOVWF 0C0026: RLF 0C,F0027: MOVLW FC0028: ANDWF 0C,F0029: MOVF 0C,W002A: ANDLW 3C002B: IORWF 21,W002C: MOVWF 06.................... output_bit(LCD_E,1); // vzestupna hrana002D: BSF 06.0002E: BSF 03.5002F: BCF 06.0.................... delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat0030: NOP.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)0031: BCF 03.50032: BCF 06.00033: BSF 03.50034: BCF 06.00035: BCF 03.50036: RETLW 00.................... }............................................................ // 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 registr0037: MOVF 1E,F0038: BTFSS 03.20039: GOTO 03C003A: BCF 06.1003B: GOTO 03D003C: BSF 06.1003D: BSF 03.5003E: BCF 06.1.................... swap(n);003F: BCF 03.50040: SWAPF 1F,F.................... lcd_send_nibble(n); // posli horni pulku bajtu0041: MOVF 1F,W0042: MOVWF 200043: CALL 021.................... swap(n);0044: SWAPF 1F,F.................... lcd_send_nibble(n); // posli spodni pulku bajtu0045: MOVF 1F,W0046: MOVWF 200047: CALL 021.................... delay_us(40); // minimalni doba na provedeni prikazu0048: MOVLW 0D0049: MOVWF 0C004A: DECFSZ 0C,F004B: GOTO 04A004C: RETLW 00.................... }............................................................ // 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 napajeni004D: MOVLW 14004E: MOVWF 1A004F: CALL 00C........................................ *LCD_TRIS = *LCD_TRIS & ~LCD_MASK; // nuluj odpovidajici bity tris registru datoveho portu LCD0050: MOVLW C30051: BSF 03.50052: ANDWF 06,F........................................ output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav0053: BCF 03.50054: BCF 06.10055: BSF 03.50056: BCF 06.1.................... output_bit(LCD_E,0); // nastav jako vystup a nastav klidovy stav0057: BCF 03.50058: BCF 06.00059: BSF 03.5005A: BCF 06.0........................................ for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice005B: BCF 03.5005C: CLRF 17005D: MOVF 17,W005E: SUBLW 02005F: BTFSS 03.00060: GOTO 069.................... {.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel0061: MOVLW 020062: MOVWF 1A0063: CALL 00C.................... lcd_send_nibble(3); // rezim 8 bitu0064: MOVLW 030065: MOVWF 200066: CALL 021.................... }0067: INCF 17,F0068: GOTO 05D........................................ delay_us(40); // cas na zpracovani0069: MOVLW 0D006A: MOVWF 0C006B: DECFSZ 0C,F006C: GOTO 06B.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)006D: MOVLW 02006E: MOVWF 20006F: CALL 021.................... delay_us(40); // cas na zpracovani0070: MOVLW 0D0071: MOVWF 0C0072: DECFSZ 0C,F0073: GOTO 072........................................ for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)0074: CLRF 170075: MOVF 17,W0076: SUBLW 020077: BTFSS 03.00078: GOTO 085.................... {.................... lcd_send_byte(0,LCD_INIT_STRING[i]);0079: MOVF 17,W007A: CALL 004007B: MOVWF 18007C: CLRF 1E007D: MOVF 18,W007E: MOVWF 1F007F: CALL 037.................... delay_ms(2);0080: MOVLW 020081: MOVWF 1A0082: CALL 00C.................... }0083: INCF 17,F0084: GOTO 0750085: GOTO 256 (RETURN).................... }............................................................ // Proved presun kurzoru.................... //.................... // Pozice 1.1 je domu.................... //.................... void lcd_gotoxy( BYTE x, BYTE y).................... {........................................ BYTE Adr;........................................ Adr=x-1;*01C1: MOVLW 0101C2: SUBWF 1A,W01C3: MOVWF 1C.................... if(y==2)01C4: MOVF 1B,W01C5: SUBLW 0201C6: BTFSS 03.201C7: GOTO 1CA.................... Adr+=LCD_LINE_2;01C8: MOVLW 4001C9: ADDWF 1C,F........................................ lcd_send_byte(0,0x80|Adr);01CA: MOVF 1C,W01CB: IORLW 8001CC: MOVWF 1D01CD: CLRF 1E01CE: MOVF 1D,W01CF: MOVWF 1F01D0: CALL 03701D1: RETLW 00.................... }............................................................ // Zapis znaku na displej, zpracovani ridicich znaku.................... //.................... void lcd_putc( char c).................... {........................................ switch (c)01D2: MOVF 19,W01D3: MOVWF 0C01D4: MOVLW 0C01D5: SUBWF 0C,W01D6: BTFSC 03.201D7: GOTO 1E501D8: MOVLW 0A01D9: SUBWF 0C,W01DA: BTFSC 03.201DB: GOTO 1ED01DC: MOVLW 0D01DD: SUBWF 0C,W01DE: BTFSC 03.201DF: GOTO 1F301E0: MOVLW 0801E1: SUBWF 0C,W01E2: BTFSC 03.201E3: GOTO 1F801E4: GOTO 1FD.................... {.................... case '\f' : lcd_send_byte(0,1); // smaz displej01E5: CLRF 1E01E6: MOVLW 0101E7: MOVWF 1F01E8: CALL 037.................... delay_ms(2);01E9: MOVLW 0201EA: MOVWF 1A01EB: CALL 00C.................... break;01EC: GOTO 209.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky01ED: MOVLW 0101EE: MOVWF 1A01EF: MOVLW 0201F0: MOVWF 1B01F1: CALL 1C101F2: GOTO 209.................... case '\r' : lcd_gotoxy(1,1); break; // presun home01F3: MOVLW 0101F4: MOVWF 1A01F5: MOVWF 1B01F6: CALL 1C101F7: GOTO 209.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet01F8: CLRF 1E01F9: MOVLW 1001FA: MOVWF 1F01FB: CALL 03701FC: GOTO 209.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F01FD: MOVF 19,W01FE: SUBLW 1F01FF: BTFSS 03.00200: GOTO 2030201: MOVLW 070202: ANDWF 19,F.................... lcd_send_byte(1,c); break; // zapis znak0203: MOVLW 010204: MOVWF 1E0205: MOVF 19,W0206: MOVWF 1F0207: CALL 0370208: GOTO 209.................... }0209: RETLW 00.................... }............................................................ // 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_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);.................... //}........................................ #DEFINE PRIJIMAC PIN_A3 // pin na ktery je pripojen prijimac.................... #DEFINE SERVO_X PIN_A0 // pin na ktery je pripojeno servo.................... #DEFINE SERVO_Y PIN_A1........................................ int8 bit,x,y;.................... int counter; // pocitadlo 1 a 0 v detektoru.................... int x_old=0,y_old;........................................ void servo(int uhel, int souradnice).................... {............................................................ if (X==souradnice) output_high(SERVO_X); else output_high(SERVO_Y);*0129: MOVF 18,W012A: SUBWF 0F,W012B: BTFSS 03.2012C: GOTO 132012D: BSF 03.5012E: BCF 05.0012F: BCF 03.50130: BSF 05.00131: GOTO 1360132: BSF 03.50133: BCF 05.10134: BCF 03.50135: BSF 05.1........................................ delay_us(62.5*uhel);0136: CLRF 1A0137: MOVF 17,W0138: MOVWF 190139: GOTO 086013A: CLRF 1C013B: CLRF 1B013C: MOVLW 7A013D: MOVWF 1A013E: MOVLW 84013F: MOVWF 190140: MOVF 0F,W0141: MOVWF 200142: MOVF 0E,W0143: MOVWF 1F0144: MOVF 0D,W0145: MOVWF 1E0146: MOVF 0C,W0147: MOVWF 1D0148: GOTO 0A40149: MOVF 0C,W014A: MOVWF 19014B: MOVF 0D,W014C: MOVWF 1A014D: MOVF 0E,W014E: MOVWF 1B014F: MOVF 0F,W0150: MOVWF 1C0151: MOVF 0C,W0152: MOVWF 1D0153: GOTO 11B........................................ if (SERVO_X==souradnice) output_low(SERVO_X); else output_low(SERVO_Y);0154: MOVF 18,W0155: SUBLW 280156: BTFSS 03.20157: GOTO 15D0158: BSF 03.50159: BCF 05.0015A: BCF 03.5015B: BCF 05.0015C: GOTO 161015D: BSF 03.5015E: BCF 05.1015F: BCF 03.50160: BCF 05.10161: RETLW 00.................... // delay_ms(10);............................................................ }........................................ int8 prijmout(int8* bit).................... {.................... // || |.................... // |--|_____ 1.................... // |.................... // |-|__|-|_ 0........................................ while (!input(PRIJIMAC)) ; // cekej na jednicku0162: BSF 03.50163: BSF 05.30164: BCF 03.50165: BTFSS 05.30166: GOTO 162.................... delay_us(IMPULS/4); // presvec se, jestli je stale 1 po 1/4 impulsu0167: MOVLW 140168: MOVWF 0C0169: DECFSZ 0C,F016A: GOTO 169016B: NOP.................... if (!input(PRIJIMAC)) return(false); // vrat chybu, kdyz neni stale 1016C: BSF 03.5016D: BSF 05.3016E: BCF 03.5016F: BTFSC 05.30170: GOTO 1740171: MOVLW 000172: MOVWF 0D0173: GOTO 198.................... delay_us(3*IMPULS); // pockej na rozhodovaci misto0174: MOVLW F90175: MOVWF 0C0176: DECFSZ 0C,F0177: GOTO 1760178: NOP0179: NOP.................... if (input(PRIJIMAC)) *bit=0; else *bit=1; // dekoduj 1 nebo 0017A: BSF 03.5017B: BSF 05.3017C: BCF 03.5017D: BTFSS 05.3017E: GOTO 183017F: MOVF 1A,W0180: MOVWF 040181: CLRF 000182: GOTO 1870183: MOVF 1A,W0184: MOVWF 040185: MOVLW 010186: MOVWF 00.................... delay_us(IMPULS); // pockej na konec znaku0187: MOVLW 530188: MOVWF 0C0189: DECFSZ 0C,F018A: GOTO 189........................................ output_bit(PIN_A0, *bit); // kontrolni vystup018B: MOVF 1A,W018C: MOVWF 04018D: MOVF 00,F018E: BTFSS 03.2018F: GOTO 1920190: BCF 05.00191: GOTO 1930192: BSF 05.00193: BSF 03.50194: BCF 05.0........................................ return(true); // vrat, ze se cteni povedlo0195: MOVLW 010196: BCF 03.50197: MOVWF 0D0198: RETLW 00.................... }........................................ int8 read_nibble(int8* value).................... {.................... int8 n; // citac.................... int8 bit; // pomocna promenna........................................ *value=0;0199: MOVF 17,W019A: MOVWF 04019B: CLRF 00.................... for (n=1; n<=4; n++) // prijmi 4 bity019C: MOVLW 01019D: MOVWF 18019E: MOVF 18,W019F: SUBLW 0401A0: BTFSS 03.001A1: GOTO 1BE.................... {.................... *value >>= 1; // posun jiz prectene do leva01A2: MOVF 17,W01A3: MOVWF 0401A4: BCF 03.001A5: RRF 00,W01A6: MOVWF 0C01A7: MOVWF 00.................... if (0==prijmout(&bit)) return(false); // prijmi bit; pri chybe cteni vrat chybu01A8: MOVLW 1901A9: MOVWF 1A01AA: CALL 16201AB: MOVF 0D,F01AC: BTFSS 03.201AD: GOTO 1B101AE: MOVLW 0001AF: MOVWF 0D01B0: GOTO 1C0.................... *value |= bit << 3; // pridej bit do nibblu01B1: MOVF 17,W01B2: MOVWF 0401B3: RLF 19,W01B4: MOVWF 0C01B5: RLF 0C,F01B6: RLF 0C,F01B7: MOVLW F801B8: ANDWF 0C,F01B9: MOVF 0C,W01BA: IORWF 00,W01BB: MOVWF 00.................... };01BC: INCF 18,F01BD: GOTO 19E.................... return(true); // vrat 1, jako ,ze je vse O.K.01BE: MOVLW 0101BF: MOVWF 0D01C0: RETLW 00.................... }........................................ /*void dekodovat(void).................... {.................... int8 osa, hodnota, kontrola;........................................ counter=4;........................................ decoder:........................................ counter=0; // vynuluj citac.................... do // vyhledej synchronizacni jednicky.................... {.................... if (!prijmout(&bit)) goto decoder; // prijmi bit; pri chybe zacni znovu.................... if (1==bit) counter++; else goto decoder; // kdyz je bit 1, tak zvys citac; jinak zacni znovu.................... } while(counter<4); // pockej na 4 jednicky........................................ if (!read_nibble(&osa)) goto decoder; // nacti identifikator osy........................................ if (!read_nibble(&hodnota)) goto decoder; // nacti 1. nibble; pri chybe zacni znovu.................... if (!read_nibble(&kontrola)) goto decoder; // nacti 2. nibble; pri chybe zacni znovu.................... if (hodnota != kontrola) goto decoder; // zacni znovu, pokud jsou ruzne nibble........................................ switch (osa) // rozeskoc se podle adresy osy.................... {.................... case OSA_X:.................... {.................... x=hodnota;.................... break;.................... };.................... case OSA_Y:.................... {.................... y=hodnota;.................... break;.................... };.................... case TLs:.................... {.................... break;.................... };.................... };.................... }.................... */.................... void main().................... {*0251: CLRF 040252: MOVLW 1F0253: ANDWF 03,F0254: CLRF 12.................... lcd_init(); // zinicializuj LCD display0255: GOTO 04D........................................ while (true).................... {.................... int8 osa, hodnota, kontrola;........................................ counter=4;0256: MOVLW 040257: MOVWF 11........................................ decoder:........................................ servo(x_old,SERVO_X);0258: MOVF 12,W0259: MOVWF 17025A: MOVLW 28025B: MOVWF 18025C: CALL 129........................................ servo(y_old,SERVO_Y);025D: MOVF 13,W025E: MOVWF 17025F: MOVLW 290260: MOVWF 180261: CALL 129........................................ counter=0; // vynuluj citac0262: CLRF 11.................... do // vyhledej synchronizacni jednicky.................... {.................... if (!prijmout(&bit)) goto decoder; // prijmi bit; pri chybe zacni znovu0263: MOVLW 0E0264: MOVWF 1A0265: CALL 1620266: MOVF 0D,F0267: BTFSS 03.20268: GOTO 26A0269: GOTO 258.................... if (1==bit) counter++; else goto decoder; // kdyz je bit 1, tak zvys citac; jinak zacni znovu026A: DECFSZ 0E,W026B: GOTO 26E026C: INCF 11,F026D: GOTO 26F026E: GOTO 258.................... } while(counter<4); // pockej na 4 jednicky026F: MOVF 11,W0270: SUBLW 030271: BTFSC 03.00272: GOTO 263........................................ if (!read_nibble(&osa)) goto decoder; // nacti identifikator osy0273: MOVLW 140274: MOVWF 170275: CALL 1990276: MOVF 0D,F0277: BTFSS 03.20278: GOTO 27A0279: GOTO 258........................................ if (!read_nibble(&hodnota)) goto decoder; // nacti 1. nibble; pri chybe zacni znovu027A: MOVLW 15027B: MOVWF 17027C: CALL 199027D: MOVF 0D,F027E: BTFSS 03.2027F: GOTO 2810280: GOTO 258.................... if (!read_nibble(&kontrola)) goto decoder; // nacti 2. nibble; pri chybe zacni znovu0281: MOVLW 160282: MOVWF 170283: CALL 1990284: MOVF 0D,F0285: BTFSS 03.20286: GOTO 2880287: GOTO 258.................... if (hodnota != kontrola) goto decoder; // zacni znovu, pokud jsou ruzne nibble0288: MOVF 16,W0289: SUBWF 15,W028A: BTFSC 03.2028B: GOTO 28D028C: GOTO 258........................................ switch (osa) // rozeskoc se podle adresy osy028D: MOVF 14,W028E: ADDLW FD028F: BTFSC 03.00290: GOTO 29E0291: ADDLW 030292: GOTO 2D3.................... {.................... case OSA_X:.................... {........................................ x=hodnota;0293: MOVF 15,W0294: MOVWF 0F.................... x_old=x;0295: MOVF 0F,W0296: MOVWF 12........................................ break;0297: GOTO 29E.................... };.................... case OSA_Y:.................... {.................... y=hodnota;0298: MOVF 15,W0299: MOVWF 10.................... y_old=y;029A: MOVF 10,W029B: MOVWF 13........................................ break;029C: GOTO 29E.................... };.................... case TLs:.................... {.................... break;029D: GOTO 29E.................... };.................... };*02D3: BCF 0A.002D4: BSF 0A.102D5: BCF 0A.202D6: ADDWF 02,F02D7: GOTO 29302D8: GOTO 29802D9: GOTO 29D............................................................ lcd_gotoxy(1,1); // vytiskni X a Y*029E: MOVLW 01029F: MOVWF 1A02A0: MOVWF 1B02A1: CALL 1C1.................... printf(lcd_putc,"X: %U ", x);*021F: MOVF 0D,W0220: MOVF 17,W0221: MOVWF 190222: MOVLW 640223: MOVWF 1A0224: CALL 20A0225: MOVF 0C,W0226: MOVWF 170227: MOVF 0D,W0228: MOVLW 300229: BTFSS 03.2022A: GOTO 232022B: BTFSC 18.0022C: BSF 18.3022D: BTFSC 18.3022E: GOTO 238022F: BTFSC 18.40230: MOVLW 200231: GOTO 2340232: BCF 18.30233: BCF 18.40234: ADDWF 0D,F0235: MOVF 0D,W0236: MOVWF 190237: CALL 1D20238: MOVF 17,W0239: MOVWF 19023A: MOVLW 0A023B: MOVWF 1A023C: CALL 20A023D: MOVF 0C,W023E: MOVWF 17023F: MOVF 0D,W0240: MOVLW 300241: BTFSS 03.20242: GOTO 2470243: BTFSC 18.30244: GOTO 24B0245: BTFSC 18.40246: MOVLW 200247: ADDWF 0D,F0248: MOVF 0D,W0249: MOVWF 19024A: CALL 1D2024B: MOVLW 30024C: ADDWF 17,F024D: MOVF 17,W024E: MOVWF 19024F: CALL 1D20250: RETLW 00*02A2: MOVLW 5802A3: MOVWF 1902A4: CALL 1D202A5: MOVLW 3A02A6: MOVWF 1902A7: CALL 1D202A8: MOVLW 2002A9: MOVWF 1902AA: CALL 1D202AB: MOVF 0F,W02AC: MOVWF 1702AD: MOVLW 1802AE: MOVWF 1802AF: CALL 21F02B0: MOVLW 0602B1: MOVWF 1702B2: MOVLW 2002B3: MOVWF 1902B4: CALL 1D202B5: DECFSZ 17,F02B6: GOTO 2B2.................... lcd_gotoxy(1,2);02B7: MOVLW 0102B8: MOVWF 1A02B9: MOVLW 0202BA: MOVWF 1B02BB: CALL 1C1.................... printf(lcd_putc,"Y: %U ", y);02BC: MOVLW 5902BD: MOVWF 1902BE: CALL 1D202BF: MOVLW 3A02C0: MOVWF 1902C1: CALL 1D202C2: MOVLW 2002C3: MOVWF 1902C4: CALL 1D202C5: MOVF 10,W02C6: MOVWF 1702C7: MOVLW 1802C8: MOVWF 1802C9: CALL 21F02CA: MOVLW 0602CB: MOVWF 1702CC: MOVLW 2002CD: MOVWF 1902CE: CALL 1D202CF: DECFSZ 17,F02D0: GOTO 2CC.................... }02D1: GOTO 256.................... }....................02D2: SLEEP........................................