CCS PCM C Compiler, Version 4.059d, 15399 30-III-07 19:42
Filename: main.lst
ROM used: 908 words (44%)
Largest free fragment is 1140
RAM used: 25 (7%) at main() level
33 (9%) worst case
Stack: 4 locations
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 166
0003: NOP
.................... #include ".\main.h"
.................... #include <16F877A.h>
.................... //////// Standard Header file for the PIC16F877A device ////////////////
.................... #device PIC16F877A
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES XT //Crystal osc <= 4mhz
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOCPD //No EE protection
.................... #FUSES NOWRT //Program memory not write protected
....................
.................... #use delay(clock=4000000,RESTART_WDT)
*
008C: MOVLW 32
008D: MOVWF 04
008E: BCF 03.7
008F: MOVF 00,W
0090: BTFSC 03.2
0091: GOTO 0A3
0092: MOVLW 01
0093: MOVWF 78
0094: MOVLW BF
0095: MOVWF 77
0096: CLRWDT
0097: DECFSZ 77,F
0098: GOTO 096
0099: DECFSZ 78,F
009A: GOTO 094
009B: MOVLW 4A
009C: MOVWF 77
009D: DECFSZ 77,F
009E: GOTO 09D
009F: NOP
00A0: CLRWDT
00A1: DECFSZ 00,F
00A2: GOTO 092
00A3: RETLW 00
.................... #use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
....................
....................
....................
.................... #define LCD_RS PIN_B1 // rizeni registru LCD displeje
.................... #define LCD_E PIN_B0 // enable LCD displeje
.................... #define LCD_DATA_LSB PIN_C0 // 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)
.................... };
....................
....................
.................... // 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
00A4: MOVF 07,W
00A5: ANDLW F0
00A6: MOVWF 39
00A7: MOVF 38,W
00A8: ANDLW 0F
00A9: IORWF 39,W
00AA: MOVWF 07
.................... output_bit(LCD_E,1); // vzestupna hrana
00AB: BSF 06.0
00AC: BSF 03.5
00AD: BCF 06.0
.................... delay_us(100); // pockej alespon 450ns od e nebo alespon 195ns od dat
00AE: CLRWDT
00AF: MOVLW 20
00B0: MOVWF 77
00B1: DECFSZ 77,F
00B2: GOTO 0B1
00B3: GOTO 0B4
.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
00B4: BCF 03.5
00B5: BCF 06.0
00B6: BSF 03.5
00B7: BCF 06.0
.................... }
00B8: BCF 03.5
00B9: 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 registr
00BA: MOVF 36,F
00BB: BTFSS 03.2
00BC: GOTO 0BF
00BD: BCF 06.1
00BE: GOTO 0C0
00BF: BSF 06.1
00C0: BSF 03.5
00C1: BCF 06.1
.................... swap(n);
00C2: BCF 03.5
00C3: SWAPF 37,F
.................... lcd_send_nibble(n); // posli horni pulku bajtu
00C4: MOVF 37,W
00C5: MOVWF 38
00C6: CALL 0A4
.................... swap(n);
00C7: SWAPF 37,F
.................... lcd_send_nibble(n); // posli spodni pulku bajtu
00C8: MOVF 37,W
00C9: MOVWF 38
00CA: CALL 0A4
.................... delay_us(200); // minimalni doba na provedeni prikazu
00CB: CLRWDT
00CC: MOVLW 42
00CD: MOVWF 77
00CE: DECFSZ 77,F
00CF: GOTO 0CE
.................... }
00D0: 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 napajeni
00D1: MOVLW 14
00D2: MOVWF 32
00D3: CALL 08C
....................
.................... *LCD_TRIS = *LCD_TRIS & ~LCD_MASK; // nuluj odpovidajici bity tris registru datoveho portu LCD
00D4: MOVLW F0
00D5: BSF 03.5
00D6: ANDWF 07,F
....................
.................... output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
00D7: BCF 03.5
00D8: BCF 06.1
00D9: BSF 03.5
00DA: BCF 06.1
.................... output_bit(LCD_E,0); // nastav jako vystup a nastav klidovy stav
00DB: BCF 03.5
00DC: BCF 06.0
00DD: BSF 03.5
00DE: BCF 06.0
....................
.................... for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
00DF: BCF 03.5
00E0: CLRF 2F
00E1: MOVF 2F,W
00E2: SUBLW 02
00E3: BTFSS 03.0
00E4: GOTO 0ED
.................... {
.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
00E5: MOVLW 02
00E6: MOVWF 32
00E7: CALL 08C
.................... lcd_send_nibble(3); // rezim 8 bitu
00E8: MOVLW 03
00E9: MOVWF 38
00EA: CALL 0A4
.................... }
00EB: INCF 2F,F
00EC: GOTO 0E1
....................
.................... delay_us(40); // cas na zpracovani
00ED: CLRWDT
00EE: MOVLW 0C
00EF: MOVWF 77
00F0: DECFSZ 77,F
00F1: GOTO 0F0
00F2: GOTO 0F3
.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
00F3: MOVLW 02
00F4: MOVWF 38
00F5: CALL 0A4
.................... delay_us(40); // cas na zpracovani
00F6: CLRWDT
00F7: MOVLW 0C
00F8: MOVWF 77
00F9: DECFSZ 77,F
00FA: GOTO 0F9
00FB: GOTO 0FC
....................
.................... for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
00FC: CLRF 2F
00FD: MOVF 2F,W
00FE: SUBLW 02
00FF: BTFSS 03.0
0100: GOTO 10D
.................... {
.................... lcd_send_byte(0,LCD_INIT_STRING[i]);
0101: MOVF 2F,W
0102: CALL 004
0103: MOVWF 30
0104: CLRF 36
0105: MOVF 30,W
0106: MOVWF 37
0107: CALL 0BA
.................... delay_ms(2);
0108: MOVLW 02
0109: MOVWF 32
010A: CALL 08C
.................... }
010B: INCF 2F,F
010C: GOTO 0FD
.................... }
010D: GOTO 1B7 (RETURN)
....................
....................
.................... // Proved presun kurzoru
.................... //
.................... // Pozice 1.1 je domu
.................... //
.................... #separate
.................... void lcd_gotoxy( BYTE x, BYTE y)
.................... {
....................
.................... BYTE Adr;
....................
.................... switch(y)
.................... {
010E: MOVLW 01
010F: SUBWF 33,W
0110: ADDLW FC
0111: BTFSC 03.0
0112: GOTO 120
0113: ADDLW 04
0114: GOTO 12B
.................... case 1: Adr=0; break;
0115: CLRF 34
0116: GOTO 120
.................... case 2: Adr=0x40; break;
0117: MOVLW 40
0118: MOVWF 34
0119: GOTO 120
.................... case 3: Adr=0x14; break;
011A: MOVLW 14
011B: MOVWF 34
011C: GOTO 120
.................... case 4: Adr=0x54; break;
011D: MOVLW 54
011E: MOVWF 34
011F: GOTO 120
.................... }
.................... Adr+=x-1;
0120: MOVLW 01
0121: SUBWF 32,W
0122: ADDWF 34,F
....................
.................... lcd_send_byte(0,0x80|Adr);
0123: MOVF 34,W
0124: IORLW 80
0125: MOVWF 35
0126: CLRF 36
0127: MOVF 35,W
0128: MOVWF 37
0129: CALL 0BA
.................... }
012A: RETLW 00
....................
....................
.................... // Zapis znaku na displej, zpracovani ridicich znaku
.................... //
.................... #separate
.................... void lcd_putc( char c)
.................... {
....................
.................... switch (c)
.................... {
*
0133: MOVF 31,W
0134: XORLW 0C
0135: BTFSC 03.2
0136: GOTO 141
0137: XORLW 06
0138: BTFSC 03.2
0139: GOTO 149
013A: XORLW 07
013B: BTFSC 03.2
013C: GOTO 14F
013D: XORLW 05
013E: BTFSC 03.2
013F: GOTO 154
0140: GOTO 159
.................... case '\f' : lcd_send_byte(0,1); // smaz displej
0141: CLRF 36
0142: MOVLW 01
0143: MOVWF 37
0144: CALL 0BA
.................... delay_ms(2);
0145: MOVLW 02
0146: MOVWF 32
0147: CALL 08C
.................... break;
0148: GOTO 165
.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
0149: MOVLW 01
014A: MOVWF 32
014B: MOVLW 02
014C: MOVWF 33
014D: CALL 10E
014E: GOTO 165
.................... case '\r' : lcd_gotoxy(1,1); break; // presun home
014F: MOVLW 01
0150: MOVWF 32
0151: MOVWF 33
0152: CALL 10E
0153: GOTO 165
.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
0154: CLRF 36
0155: MOVLW 10
0156: MOVWF 37
0157: CALL 0BA
0158: GOTO 165
.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
0159: MOVF 31,W
015A: SUBLW 1F
015B: BTFSS 03.0
015C: GOTO 15F
015D: MOVLW 07
015E: ANDWF 31,F
.................... lcd_send_byte(1,c); break; // zapis znak
015F: MOVLW 01
0160: MOVWF 36
0161: MOVF 31,W
0162: MOVWF 37
0163: CALL 0BA
0164: GOTO 165
.................... }
.................... }
0165: 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);
.................... //}
....................
....................
.................... void main()
.................... {
0166: CLRF 04
0167: BCF 03.7
0168: MOVLW 1F
0169: ANDWF 03,F
016A: MOVLW 0C
016B: BSF 03.5
016C: MOVWF 19
016D: MOVLW A6
016E: MOVWF 18
016F: MOVLW 90
0170: BCF 03.5
0171: MOVWF 18
0172: BSF 03.5
0173: BSF 1F.0
0174: BSF 1F.1
0175: BSF 1F.2
0176: BCF 1F.3
0177: MOVLW 07
0178: MOVWF 1C
.................... char odp[8];
.................... int pom,pom2,pom3,odkl,odkl2,maskovadlo;
....................
.................... setup_adc_ports(NO_ANALOGS);
*
017C: BSF 03.5
017D: BSF 1F.0
017E: BSF 1F.1
017F: BSF 1F.2
0180: BCF 1F.3
.................... setup_adc(ADC_OFF);
0181: BCF 03.5
0182: BCF 1F.0
.................... setup_psp(PSP_DISABLED);
0183: BSF 03.5
0184: BCF 09.4
.................... setup_spi(SPI_SS_DISABLED);
*
0179: MOVLW FF
017A: BCF 03.5
017B: MOVWF 20
*
0185: BCF 03.5
0186: BCF 14.5
0187: BCF 20.5
0188: MOVF 20,W
0189: BSF 03.5
018A: MOVWF 07
018B: BCF 03.5
018C: BSF 20.4
018D: MOVF 20,W
018E: BSF 03.5
018F: MOVWF 07
0190: BCF 03.5
0191: BCF 20.3
0192: MOVF 20,W
0193: BSF 03.5
0194: MOVWF 07
0195: MOVLW 01
0196: BCF 03.5
0197: MOVWF 14
0198: MOVLW 00
0199: BSF 03.5
019A: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
019B: MOVF 01,W
019C: ANDLW C7
019D: IORLW 08
019E: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
019F: BCF 03.5
01A0: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
01A1: MOVLW 00
01A2: MOVWF 78
01A3: MOVWF 12
01A4: MOVLW 00
01A5: BSF 03.5
01A6: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
01A7: MOVLW 07
01A8: MOVWF 1C
01A9: MOVF 05,W
01AA: CLRWDT
01AB: MOVLW 02
01AC: MOVWF 77
01AD: DECFSZ 77,F
01AE: GOTO 1AD
01AF: GOTO 1B0
01B0: MOVF 1C,W
01B1: BCF 03.5
01B2: BCF 0D.6
.................... setup_vref(FALSE);
01B3: BSF 03.5
01B4: CLRF 1D
.................... lcd_init();
01B5: BCF 03.5
01B6: GOTO 0D1
....................
.................... while(TRUE)
.................... {
.................... output_low(PIN_A4) ;
01B7: BSF 03.5
01B8: BCF 05.4
01B9: BCF 03.5
01BA: BCF 05.4
.................... delay_ms(150);
01BB: MOVLW 96
01BC: MOVWF 32
01BD: CALL 08C
.................... output_high(PIN_A4);
01BE: BSF 03.5
01BF: BCF 05.4
01C0: BCF 03.5
01C1: BSF 05.4
.................... delay_ms(150);
01C2: MOVLW 96
01C3: MOVWF 32
01C4: CALL 08C
.................... output_low(PIN_A4) ;
01C5: BSF 03.5
01C6: BCF 05.4
01C7: BCF 03.5
01C8: BCF 05.4
.................... delay_ms(150);
01C9: MOVLW 96
01CA: MOVWF 32
01CB: CALL 08C
.................... output_high(PIN_A4);
01CC: BSF 03.5
01CD: BCF 05.4
01CE: BCF 03.5
01CF: BSF 05.4
.................... delay_ms(150);
01D0: MOVLW 96
01D1: MOVWF 32
01D2: CALL 08C
....................
.................... printf("AT+CMGL=0\r"); //vycti prijate SMS
01D3: CLRF 2F
01D4: MOVF 2F,W
01D5: CALL 00C
01D6: INCF 2F,F
01D7: MOVWF 77
01D8: MOVF 77,W
01D9: BTFSS 0C.4
01DA: GOTO 1D9
01DB: MOVWF 19
01DC: MOVLW 0A
01DD: SUBWF 2F,W
01DE: BTFSS 03.2
01DF: GOTO 1D4
.................... gets(odp); //uloz odpoved prikazu do odp
01E0: MOVLW 21
01E1: MOVWF 04
01E2: BCF 03.7
01E3: DECF 04,F
01E4: INCF 04,F
01E5: BTFSS 0C.5
01E6: GOTO 1E5
01E7: MOVF 1A,W
01E8: MOVWF 00
01E9: MOVLW 0D
01EA: SUBWF 00,W
01EB: BTFSS 03.2
01EC: GOTO 1E4
01ED: CLRF 00
.................... getc(); //preskoc 0A
01EE: BTFSS 0C.5
01EF: GOTO 1EE
01F0: MOVF 1A,W
.................... getc(); //preskoc 0D
01F1: BTFSS 0C.5
01F2: GOTO 1F1
01F3: MOVF 1A,W
.................... gets(odp); //uloz pocatek odpovedi do odp
01F4: MOVLW 21
01F5: MOVWF 04
01F6: BCF 03.7
01F7: DECF 04,F
01F8: INCF 04,F
01F9: BTFSS 0C.5
01FA: GOTO 1F9
01FB: MOVF 1A,W
01FC: MOVWF 00
01FD: MOVLW 0D
01FE: SUBWF 00,W
01FF: BTFSS 03.2
0200: GOTO 1F8
0201: CLRF 00
....................
.................... if(odp[0] == 79 && odp[1] ==75)
0202: MOVF 21,W
0203: SUBLW 4F
0204: BTFSS 03.2
0205: GOTO 246
0206: MOVF 22,W
0207: SUBLW 4B
0208: BTFSS 03.2
0209: GOTO 246
.................... {
.................... lcd_gotoxy(1,1);
020A: MOVLW 01
020B: MOVWF 32
020C: MOVWF 33
020D: CALL 10E
.................... printf(lcd_putc,"\fNeni nova SMS zprava!");
020E: CLRF 2F
020F: MOVF 2F,W
0210: CALL 01B
0211: INCF 2F,F
0212: MOVWF 77
0213: MOVWF 31
0214: CALL 133
0215: MOVLW 16
0216: SUBWF 2F,W
0217: BTFSS 03.2
0218: GOTO 20F
.................... lcd_gotoxy(1,2);
0219: MOVLW 01
021A: MOVWF 32
021B: MOVLW 02
021C: MOVWF 33
021D: CALL 10E
.................... printf(lcd_putc,"");
.................... lcd_gotoxy(1,3);
021E: MOVLW 01
021F: MOVWF 32
0220: MOVLW 03
0221: MOVWF 33
0222: CALL 10E
.................... printf(lcd_putc,"Zaslete SMS na cislo");
0223: CLRF 2F
0224: MOVF 2F,W
0225: CALL 036
0226: INCF 2F,F
0227: MOVWF 77
0228: MOVWF 31
0229: CALL 133
022A: MOVLW 14
022B: SUBWF 2F,W
022C: BTFSS 03.2
022D: GOTO 224
.................... lcd_gotoxy(1,4);
022E: MOVLW 01
022F: MOVWF 32
0230: MOVLW 04
0231: MOVWF 33
0232: CALL 10E
.................... printf(lcd_putc," 736 655 250");
0233: CLRF 2F
0234: MOVF 2F,W
0235: CALL 04F
0236: INCF 2F,F
0237: MOVWF 77
0238: MOVWF 31
0239: CALL 133
023A: MOVLW 0F
023B: SUBWF 2F,W
023C: BTFSS 03.2
023D: GOTO 234
.................... delay_ms(5000);
023E: MOVLW 14
023F: MOVWF 2F
0240: MOVLW FA
0241: MOVWF 32
0242: CALL 08C
0243: DECFSZ 2F,F
0244: GOTO 240
.................... }else
0245: GOTO 38A
.................... {
....................
.................... for(pom=0;pom<55;pom++) //preskoc nedulezite informace
0246: CLRF 29
0247: MOVF 29,W
0248: SUBLW 36
0249: BTFSS 03.0
024A: GOTO 250
.................... {
.................... getc();
024B: BTFSS 0C.5
024C: GOTO 24B
024D: MOVF 1A,W
.................... }
024E: INCF 29,F
024F: GOTO 247
.................... gets(odp); //uloz zakodovany text SMS
0250: MOVLW 21
0251: MOVWF 04
0252: BCF 03.7
0253: DECF 04,F
0254: INCF 04,F
0255: BTFSS 0C.5
0256: GOTO 255
0257: MOVF 1A,W
0258: MOVWF 00
0259: MOVLW 0D
025A: SUBWF 00,W
025B: BTFSS 03.2
025C: GOTO 254
025D: CLRF 00
....................
.................... /*lcd_gotoxy(1,1);
.................... printf(lcd_putc,"\f%s\n",odp);*/
....................
.................... if(odp[0]==0) odp[1]='0'; // Prevod z ASCII do BIN
025E: MOVF 21,F
025F: BTFSS 03.2
0260: GOTO 263
0261: MOVLW 30
0262: MOVWF 22
.................... odp[0]=odp[0] - '0';
0263: MOVLW 30
0264: SUBWF 21,F
.................... odp[1]=odp[1] - '0';
0265: SUBWF 22,F
.................... if(odp[0]>9) odp[0]=odp[0]-7;
0266: MOVF 21,W
0267: SUBLW 09
0268: BTFSC 03.0
0269: GOTO 26C
026A: MOVLW 07
026B: SUBWF 21,F
.................... if(odp[1]>9) odp[1]=odp[1]-7;
026C: MOVF 22,W
026D: SUBLW 09
026E: BTFSC 03.0
026F: GOTO 272
0270: MOVLW 07
0271: SUBWF 22,F
.................... odp[0]=odp[0] << 4;
0272: SWAPF 21,F
0273: MOVLW F0
0274: ANDWF 21,F
.................... odp[0] |= odp[1];
0275: MOVF 22,W
0276: IORWF 21,F
....................
.................... if(odp[2]==0) odp[3]='0';
0277: MOVF 23,F
0278: BTFSS 03.2
0279: GOTO 27C
027A: MOVLW 30
027B: MOVWF 24
.................... odp[2]=odp[2] - '0';
027C: MOVLW 30
027D: SUBWF 23,F
.................... odp[3]=odp[3] - '0';
027E: SUBWF 24,F
.................... if(odp[2]>9) odp[2]=odp[2]-7;
027F: MOVF 23,W
0280: SUBLW 09
0281: BTFSC 03.0
0282: GOTO 285
0283: MOVLW 07
0284: SUBWF 23,F
.................... if(odp[3]>9) odp[3]=odp[3]-7;
0285: MOVF 24,W
0286: SUBLW 09
0287: BTFSC 03.0
0288: GOTO 28B
0289: MOVLW 07
028A: SUBWF 24,F
.................... odp[2]=odp[2] << 4;
028B: SWAPF 23,F
028C: MOVLW F0
028D: ANDWF 23,F
.................... odp[2] |= odp[3];
028E: MOVF 24,W
028F: IORWF 23,F
....................
.................... if(odp[4]==0) odp[5]='0';
0290: MOVF 25,F
0291: BTFSS 03.2
0292: GOTO 295
0293: MOVLW 30
0294: MOVWF 26
.................... odp[4]=odp[4] - '0';
0295: MOVLW 30
0296: SUBWF 25,F
.................... odp[5]=odp[5] - '0';
0297: SUBWF 26,F
.................... if(odp[4]>9) odp[4]=odp[4]-7;
0298: MOVF 25,W
0299: SUBLW 09
029A: BTFSC 03.0
029B: GOTO 29E
029C: MOVLW 07
029D: SUBWF 25,F
.................... if(odp[5]>9) odp[5]=odp[5]-7;
029E: MOVF 26,W
029F: SUBLW 09
02A0: BTFSC 03.0
02A1: GOTO 2A4
02A2: MOVLW 07
02A3: SUBWF 26,F
.................... odp[4]=odp[4] << 4;
02A4: SWAPF 25,F
02A5: MOVLW F0
02A6: ANDWF 25,F
.................... odp[4] |= odp[5];
02A7: MOVF 26,W
02A8: IORWF 25,F
....................
.................... if(odp[6]==0) odp[7]='0';
02A9: MOVF 27,F
02AA: BTFSS 03.2
02AB: GOTO 2AE
02AC: MOVLW 30
02AD: MOVWF 28
.................... odp[6]=odp[6] - '0';
02AE: MOVLW 30
02AF: SUBWF 27,F
.................... odp[7]=odp[7] - '0';
02B0: SUBWF 28,F
.................... if(odp[6]>9) odp[6]=odp[6]-7;
02B1: MOVF 27,W
02B2: SUBLW 09
02B3: BTFSC 03.0
02B4: GOTO 2B7
02B5: MOVLW 07
02B6: SUBWF 27,F
.................... if(odp[7]>9) odp[7]=odp[7]-7;
02B7: MOVF 28,W
02B8: SUBLW 09
02B9: BTFSC 03.0
02BA: GOTO 2BD
02BB: MOVLW 07
02BC: SUBWF 28,F
.................... odp[6]=odp[6] << 4;
02BD: SWAPF 27,F
02BE: MOVLW F0
02BF: ANDWF 27,F
.................... odp[6] |= odp[7];
02C0: MOVF 28,W
02C1: IORWF 27,F
....................
.................... odp[1]=odp[2];
02C2: MOVF 23,W
02C3: MOVWF 22
.................... odp[2]=odp[4];
02C4: MOVF 25,W
02C5: MOVWF 23
.................... odp[3]=odp[6];
02C6: MOVF 27,W
02C7: MOVWF 24
.................... odp[4],odp[5],odp[6]="";
02C8: CLRF 27
....................
.................... /*lcd_gotoxy(1,2);
.................... printf(lcd_putc,"%u %u %u %u",odp[0],odp[1],odp[2]odp[3]); */
....................
.................... pom3=0;
02C9: CLRF 2B
.................... for (pom = 0; pom < 4;pom++)
02CA: CLRF 29
02CB: MOVF 29,W
02CC: SUBLW 03
02CD: BTFSS 03.0
02CE: GOTO 33D
.................... {
.................... maskovadlo = maskovadlo >> 1; //rotace promene urcene pro maskovani
02CF: BCF 03.0
02D0: RRF 2E,F
.................... maskovadlo = maskovadlo | 0x80;
02D1: BSF 2E.7
.................... odkl = odp[pom] & maskovadlo; //odlozeni "prenosu" do odkl pomoci maskovadla
02D2: MOVLW 21
02D3: ADDWF 29,W
02D4: MOVWF 04
02D5: BCF 03.7
02D6: MOVF 00,W
02D7: ANDWF 2E,W
02D8: MOVWF 2C
.................... odp[pom] = odp[pom] << pom3; //rotace znaku
02D9: MOVLW 21
02DA: ADDWF 29,W
02DB: MOVWF 78
02DC: CLRF 7A
02DD: BTFSC 03.0
02DE: INCF 7A,F
02DF: MOVF 78,W
02E0: MOVWF 2F
02E1: MOVF 7A,W
02E2: MOVWF 30
02E3: MOVLW 21
02E4: ADDWF 29,W
02E5: MOVWF 04
02E6: BCF 03.7
02E7: MOVF 00,W
02E8: MOVWF 77
02E9: MOVF 2B,W
02EA: MOVWF 78
02EB: BTFSC 03.2
02EC: GOTO 2F1
02ED: BCF 03.0
02EE: RLF 77,F
02EF: DECFSZ 78,F
02F0: GOTO 2ED
02F1: MOVF 2F,W
02F2: MOVWF 04
02F3: BCF 03.7
02F4: BTFSC 30.0
02F5: BSF 03.7
02F6: MOVF 77,W
02F7: MOVWF 00
.................... for (pom2 = 0; pom2 < (8-pom3);pom2++) //rotace odkl2
02F8: CLRF 2A
02F9: MOVF 2B,W
02FA: SUBLW 08
02FB: SUBWF 2A,W
02FC: BTFSC 03.0
02FD: GOTO 303
.................... {
.................... odkl2 = odkl2 >> 1;
02FE: BCF 03.0
02FF: RRF 2D,F
.................... odkl2 = odkl2 & 127;
0300: BCF 2D.7
.................... }
0301: INCF 2A,F
0302: GOTO 2F9
.................... odp[pom] = odp[pom] | odkl2; //pridani odkl2 ke znaku
0303: MOVLW 21
0304: ADDWF 29,W
0305: MOVWF 78
0306: CLRF 7A
0307: BTFSC 03.0
0308: INCF 7A,F
0309: MOVLW 21
030A: ADDWF 29,W
030B: MOVWF 04
030C: BCF 03.7
030D: MOVF 00,W
030E: IORWF 2D,W
030F: MOVWF 32
0310: MOVF 78,W
0311: MOVWF 04
0312: BCF 03.7
0313: BTFSC 7A.0
0314: BSF 03.7
0315: MOVF 32,W
0316: MOVWF 00
.................... odp[pom] = odp[pom] & 127; //smazani nejvysiho bitu
0317: MOVLW 21
0318: ADDWF 29,W
0319: MOVWF 78
031A: CLRF 7A
031B: BTFSC 03.0
031C: INCF 7A,F
031D: MOVLW 21
031E: ADDWF 29,W
031F: MOVWF 04
0320: BCF 03.7
0321: MOVF 00,W
0322: ANDLW 7F
0323: MOVWF 32
0324: MOVF 78,W
0325: MOVWF 04
0326: BCF 03.7
0327: BTFSC 7A.0
0328: BSF 03.7
0329: MOVF 32,W
032A: MOVWF 00
.................... odkl2 = odkl; //ulozeni odlk na dalsi pruchod
032B: MOVF 2C,W
032C: MOVWF 2D
.................... pom3++; //inkrementace citace rotace
032D: INCF 2B,F
.................... if (pom3 == 8) //kazdy 8my znak
032E: MOVF 2B,W
032F: SUBLW 08
0330: BTFSS 03.2
0331: GOTO 33B
.................... {
.................... pom3 = 0; //smaz citac
0332: CLRF 2B
.................... odp[pom+1] = odkl2; //uloz 8my znak vznikly z "prenosu"
0333: MOVLW 01
0334: ADDWF 29,W
0335: ADDLW 21
0336: MOVWF 04
0337: BCF 03.7
0338: MOVF 2D,W
0339: MOVWF 00
.................... maskovadlo = 0; //smaz maskovadlo
033A: CLRF 2E
.................... }
.................... }
033B: INCF 29,F
033C: GOTO 2CB
.................... odp[pom]='\0';
033D: MOVLW 21
033E: ADDWF 29,W
033F: MOVWF 04
0340: BCF 03.7
0341: CLRF 00
.................... /*lcd_gotoxy(1,3);
.................... printf(lcd_putc,"%u %u %u %u",odp[0],odp[1],odp[2]odp[3]); */
.................... lcd_gotoxy(1,2);
0342: MOVLW 01
0343: MOVWF 32
0344: MOVLW 02
0345: MOVWF 33
0346: CALL 10E
.................... printf(lcd_putc,"\fPrijata SMS s textem",);
0347: CLRF 2F
0348: MOVF 2F,W
0349: CALL 063
034A: INCF 2F,F
034B: MOVWF 77
034C: MOVWF 31
034D: CALL 133
034E: MOVLW 15
034F: SUBWF 2F,W
0350: BTFSS 03.2
0351: GOTO 348
.................... lcd_gotoxy(9,3);
0352: MOVLW 09
0353: MOVWF 32
0354: MOVLW 03
0355: MOVWF 33
0356: CALL 10E
.................... printf(lcd_putc,"%s",odp);
0357: MOVLW 21
0358: MOVWF 04
0359: BCF 03.7
035A: MOVLW 00
035B: IORWF 00,W
035C: BTFSC 03.2
035D: GOTO 36E
035E: CLRF 30
035F: MOVF 04,W
0360: MOVWF 2F
0361: BCF 30.0
0362: BTFSC 03.7
0363: BSF 30.0
0364: MOVF 00,W
0365: MOVWF 31
0366: CALL 133
0367: MOVF 2F,W
0368: MOVWF 04
0369: BCF 03.7
036A: BTFSC 30.0
036B: BSF 03.7
036C: INCF 04,F
036D: GOTO 35A
.................... output_low(PIN_A4) ;
036E: BSF 03.5
036F: BCF 05.4
0370: BCF 03.5
0371: BCF 05.4
.................... delay_ms(30000);
0372: MOVLW 78
0373: MOVWF 2F
0374: MOVLW FA
0375: MOVWF 32
0376: CALL 08C
0377: DECFSZ 2F,F
0378: GOTO 374
.................... output_high(PIN_A4);
0379: BSF 03.5
037A: BCF 05.4
037B: BCF 03.5
037C: BSF 05.4
.................... printf("AT+CMGD=1\r"); //smaz prijatou SMSku
037D: CLRF 2F
037E: MOVF 2F,W
037F: CALL 07D
0380: INCF 2F,F
0381: MOVWF 77
0382: MOVF 77,W
0383: BTFSS 0C.4
0384: GOTO 383
0385: MOVWF 19
0386: MOVLW 0A
0387: SUBWF 2F,W
0388: BTFSS 03.2
0389: GOTO 37E
.................... }
.................... }
038A: GOTO 1B7
.................... }
038B: SLEEP
Configuration Fuses:
Word 1: 3F39 XT NOWDT NOPUT NODEBUG NOPROTECT NOBROWNOUT NOLVP NOCPD NOWRT