CCS PCM C Compiler, Version 4.059d, 15399 02-I-08 17:54
Filename: main.lst
ROM used: 1318 words (64%)
Largest free fragment is 730
RAM used: 15 (4%) at main() level
40 (11%) worst case
Stack: 5 locations
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 36E
0003: NOP
.................... #include "C:\RS\Lux10b\main.h"
.................... #include <16F877A.h>
.................... //////// Standard Header file for the PIC16F877A device ////////////////
.................... #device PIC16F877A
.................... #list
....................
.................... #device adc=10
....................
.................... #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)
*
00ED: MOVLW 36
00EE: MOVWF 04
00EF: BCF 03.7
00F0: MOVF 00,W
00F1: BTFSC 03.2
00F2: GOTO 104
00F3: MOVLW 01
00F4: MOVWF 78
00F5: MOVLW BF
00F6: MOVWF 77
00F7: CLRWDT
00F8: DECFSZ 77,F
00F9: GOTO 0F7
00FA: DECFSZ 78,F
00FB: GOTO 0F5
00FC: MOVLW 4A
00FD: MOVWF 77
00FE: DECFSZ 77,F
00FF: GOTO 0FE
0100: NOP
0101: CLRWDT
0102: DECFSZ 00,F
0103: GOTO 0F3
0104: RETLW 00
....................
....................
....................
.................... #define LCD_RS PIN_B1 // rizeni registru LCD displeje
.................... #define LCD_E PIN_B0 // enable LCD displeje
.................... #define LCD_DATA_LSB PIN_C4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
.................... #define IN 0
.................... #include "lcd.c"
.................... // LCD modul pro ovladani dvouradkoveho LCD modulu se standardnim Hitachi radicem
.................... // (c)miho 2002,2005
.................... //
.................... // 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
.................... // 0.03 Doplnena procedura lcd_clr pro smazani 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_clr smaze displej
.................... //
.................... // 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
0105: MOVF 07,W
0106: ANDLW 0F
0107: MOVWF 3D
0108: SWAPF 3C,W
0109: MOVWF 77
010A: MOVLW F0
010B: ANDWF 77,F
010C: MOVF 77,W
010D: ANDLW F0
010E: IORWF 3D,W
010F: MOVWF 07
.................... #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
0110: BSF 06.0
0111: BSF 03.5
0112: BCF 06.0
.................... delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
0113: CLRWDT
.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
0114: BCF 03.5
0115: BCF 06.0
0116: BSF 03.5
0117: BCF 06.0
.................... }
0118: BCF 03.5
0119: 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
011A: MOVF 3A,F
011B: BTFSS 03.2
011C: GOTO 11F
011D: BCF 06.1
011E: GOTO 120
011F: BSF 06.1
0120: BSF 03.5
0121: BCF 06.1
.................... swap(n);
0122: BCF 03.5
0123: SWAPF 3B,F
.................... lcd_send_nibble(n); // posli horni pulku bajtu
0124: MOVF 3B,W
0125: MOVWF 3C
0126: CALL 105
.................... swap(n);
0127: SWAPF 3B,F
.................... lcd_send_nibble(n); // posli spodni pulku bajtu
0128: MOVF 3B,W
0129: MOVWF 3C
012A: CALL 105
.................... delay_us(40); // minimalni doba na provedeni prikazu
012B: CLRWDT
012C: MOVLW 0C
012D: MOVWF 77
012E: DECFSZ 77,F
012F: GOTO 12E
0130: GOTO 131
.................... }
0131: 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
0132: MOVLW 14
0133: MOVWF 36
0134: CALL 0ED
....................
.................... #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
0135: MOVLW 0F
0136: BSF 03.5
0137: ANDWF 07,F
.................... #endif
....................
.................... output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
0138: BCF 03.5
0139: BCF 06.1
013A: BSF 03.5
013B: BCF 06.1
.................... output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
013C: BCF 03.5
013D: BCF 06.0
013E: BSF 03.5
013F: BCF 06.0
....................
.................... for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
0140: BCF 03.5
0141: CLRF 27
0142: MOVF 27,W
0143: SUBLW 02
0144: BTFSS 03.0
0145: GOTO 14E
.................... {
.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
0146: MOVLW 02
0147: MOVWF 36
0148: CALL 0ED
.................... lcd_send_nibble(3); // rezim 8 bitu
0149: MOVLW 03
014A: MOVWF 3C
014B: CALL 105
.................... }
014C: INCF 27,F
014D: GOTO 142
....................
.................... delay_us(40); // cas na zpracovani
014E: CLRWDT
014F: MOVLW 0C
0150: MOVWF 77
0151: DECFSZ 77,F
0152: GOTO 151
0153: GOTO 154
.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
0154: MOVLW 02
0155: MOVWF 3C
0156: CALL 105
.................... delay_us(40); // cas na zpracovani
0157: CLRWDT
0158: MOVLW 0C
0159: MOVWF 77
015A: DECFSZ 77,F
015B: GOTO 15A
015C: GOTO 15D
....................
.................... for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
015D: CLRF 27
015E: MOVF 27,W
015F: SUBLW 02
0160: BTFSS 03.0
0161: GOTO 16E
.................... {
.................... lcd_send_byte(0,LCD_INIT_STRING[i]);
0162: MOVF 27,W
0163: CALL 004
0164: MOVWF 28
0165: CLRF 3A
0166: MOVF 28,W
0167: MOVWF 3B
0168: CALL 11A
.................... delay_ms(2);
0169: MOVLW 02
016A: MOVWF 36
016B: CALL 0ED
.................... }
016C: INCF 27,F
016D: GOTO 15E
.................... }
016E: GOTO 3C8 (RETURN)
....................
....................
.................... // Proved presun kurzoru
.................... //
.................... // Pozice 1.1 je domu
.................... //
.................... void lcd_gotoxy( BYTE x, BYTE y)
.................... {
....................
.................... BYTE Adr;
....................
.................... Adr=x-1;
*
0201: MOVLW 01
0202: SUBWF 36,W
0203: MOVWF 38
.................... if(y==2)
0204: MOVF 37,W
0205: SUBLW 02
0206: BTFSS 03.2
0207: GOTO 20A
.................... Adr+=LCD_LINE_2;
0208: MOVLW 40
0209: ADDWF 38,F
....................
.................... lcd_send_byte(0,0x80|Adr);
020A: MOVF 38,W
020B: IORLW 80
020C: MOVWF 39
020D: CLRF 3A
020E: MOVF 39,W
020F: MOVWF 3B
0210: CALL 11A
.................... }
0211: RETLW 00
....................
....................
.................... // Zapis znaku na displej, zpracovani ridicich znaku
.................... //
.................... void lcd_putc( char c)
.................... {
....................
.................... switch (c)
.................... {
0212: MOVF 35,W
0213: XORLW 0C
0214: BTFSC 03.2
0215: GOTO 220
0216: XORLW 06
0217: BTFSC 03.2
0218: GOTO 228
0219: XORLW 07
021A: BTFSC 03.2
021B: GOTO 22E
021C: XORLW 05
021D: BTFSC 03.2
021E: GOTO 233
021F: GOTO 238
.................... case '\f' : lcd_send_byte(0,1); // smaz displej
0220: CLRF 3A
0221: MOVLW 01
0222: MOVWF 3B
0223: CALL 11A
.................... delay_ms(2);
0224: MOVLW 02
0225: MOVWF 36
0226: CALL 0ED
.................... break;
0227: GOTO 244
.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
0228: MOVLW 01
0229: MOVWF 36
022A: MOVLW 02
022B: MOVWF 37
022C: CALL 201
022D: GOTO 244
.................... case '\r' : lcd_gotoxy(1,1); break; // presun home
022E: MOVLW 01
022F: MOVWF 36
0230: MOVWF 37
0231: CALL 201
0232: GOTO 244
.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
0233: CLRF 3A
0234: MOVLW 10
0235: MOVWF 3B
0236: CALL 11A
0237: GOTO 244
.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
0238: MOVF 35,W
0239: SUBLW 1F
023A: BTFSS 03.0
023B: GOTO 23E
023C: MOVLW 07
023D: ANDWF 35,F
.................... lcd_send_byte(1,c); break; // zapis znak
023E: MOVLW 01
023F: MOVWF 3A
0240: MOVF 35,W
0241: MOVWF 3B
0242: CALL 11A
0243: GOTO 244
.................... }
.................... }
0244: 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_);
.................... }
....................
....................
.................... // Smaz displej
.................... //
.................... void lcd_clr()
.................... {
.................... lcd_putc('\f');
.................... }
....................
....................
.................... // 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);
.................... //}
....................
....................
.................... void main()
.................... {
*
036E: CLRF 04
036F: BCF 03.7
0370: MOVLW 1F
0371: ANDWF 03,F
0372: BSF 03.5
0373: BSF 1F.0
0374: BSF 1F.1
0375: BSF 1F.2
0376: BCF 1F.3
0377: MOVLW 07
0378: MOVWF 1C
.................... unsigned int16 I;
.................... float E;
....................
.................... setup_adc_ports(AN0);
*
037C: BSF 03.5
037D: BCF 1F.0
037E: BSF 1F.1
037F: BSF 1F.2
0380: BSF 1F.3
.................... setup_adc(ADC_CLOCK_DIV_32);
0381: BCF 1F.6
0382: BCF 03.5
0383: BCF 1F.6
0384: BSF 1F.7
0385: BSF 03.5
0386: BSF 1F.7
0387: BCF 03.5
0388: BSF 1F.0
.................... setup_psp(PSP_DISABLED);
0389: BSF 03.5
038A: BCF 09.4
.................... setup_spi(SPI_SS_DISABLED);
*
0379: MOVLW FF
037A: BCF 03.5
037B: MOVWF 20
*
038B: BCF 03.5
038C: BCF 14.5
038D: BCF 20.5
038E: MOVF 20,W
038F: BSF 03.5
0390: MOVWF 07
0391: BCF 03.5
0392: BSF 20.4
0393: MOVF 20,W
0394: BSF 03.5
0395: MOVWF 07
0396: BCF 03.5
0397: BCF 20.3
0398: MOVF 20,W
0399: BSF 03.5
039A: MOVWF 07
039B: MOVLW 01
039C: BCF 03.5
039D: MOVWF 14
039E: MOVLW 00
039F: BSF 03.5
03A0: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
03A1: MOVF 01,W
03A2: ANDLW C7
03A3: IORLW 08
03A4: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
03A5: BCF 03.5
03A6: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
03A7: MOVLW 00
03A8: MOVWF 78
03A9: MOVWF 12
03AA: MOVLW 00
03AB: BSF 03.5
03AC: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
03AD: MOVLW 07
03AE: MOVWF 1C
03AF: MOVF 05,W
03B0: CLRWDT
03B1: MOVLW 02
03B2: MOVWF 77
03B3: DECFSZ 77,F
03B4: GOTO 3B3
03B5: GOTO 3B6
03B6: MOVF 1C,W
03B7: BCF 03.5
03B8: BCF 0D.6
.................... setup_vref(FALSE);
03B9: BSF 03.5
03BA: CLRF 1D
....................
.................... set_adc_channel (IN);
03BB: MOVLW 00
03BC: MOVWF 78
03BD: BCF 03.5
03BE: MOVF 1F,W
03BF: ANDLW C7
03C0: IORWF 78,W
03C1: MOVWF 1F
.................... delay_us(20);
03C2: CLRWDT
03C3: MOVLW 06
03C4: MOVWF 77
03C5: DECFSZ 77,F
03C6: GOTO 3C5
.................... lcd_init();
03C7: GOTO 132
....................
.................... while(TRUE)
.................... {
....................
.................... I=read_adc();
03C8: BSF 1F.2
03C9: BTFSC 1F.2
03CA: GOTO 3C9
03CB: BSF 03.5
03CC: MOVF 1E,W
03CD: BCF 03.5
03CE: MOVWF 21
03CF: MOVF 1E,W
03D0: MOVWF 22
.................... delay_us(600);
03D1: CLRWDT
03D2: MOVLW C7
03D3: MOVWF 77
03D4: DECFSZ 77,F
03D5: GOTO 3D4
03D6: NOP
.................... E=0.0577*I;
03D7: MOVF 22,W
03D8: MOVWF 28
03D9: MOVF 21,W
03DA: MOVWF 27
03DB: GOTO 16F
03DC: MOVLW D6
03DD: MOVWF 38
03DE: MOVLW 56
03DF: MOVWF 37
03E0: MOVLW 6C
03E1: MOVWF 36
03E2: MOVLW 7A
03E3: MOVWF 35
03E4: MOVF 7A,W
03E5: MOVWF 3C
03E6: MOVF 79,W
03E7: MOVWF 3B
03E8: MOVF 78,W
03E9: MOVWF 3A
03EA: MOVF 77,W
03EB: MOVWF 39
03EC: CALL 18C
03ED: MOVF 7A,W
03EE: MOVWF 26
03EF: MOVF 79,W
03F0: MOVWF 25
03F1: MOVF 78,W
03F2: MOVWF 24
03F3: MOVF 77,W
03F4: MOVWF 23
....................
.................... printf(lcd_putc," E=%2.2f lx \n",E);
03F5: CLRF 27
03F6: MOVF 27,W
03F7: CALL 00C
03F8: INCF 27,F
03F9: MOVWF 77
03FA: MOVWF 35
03FB: CALL 212
03FC: MOVLW 04
03FD: SUBWF 27,W
03FE: BTFSS 03.2
03FF: GOTO 3F6
0400: MOVLW 89
0401: MOVWF 04
0402: MOVF 26,W
0403: MOVWF 2B
0404: MOVF 25,W
0405: MOVWF 2A
0406: MOVF 24,W
0407: MOVWF 29
0408: MOVF 23,W
0409: MOVWF 28
040A: MOVLW 02
040B: MOVWF 2C
040C: GOTO 287
040D: MOVLW 09
040E: MOVWF 28
040F: MOVF 28,W
0410: CALL 00C
0411: INCF 28,F
0412: MOVWF 77
0413: MOVWF 35
0414: CALL 212
0415: MOVLW 16
0416: SUBWF 28,W
0417: BTFSS 03.2
0418: GOTO 40F
.................... if(I<=128)
0419: MOVF 22,F
041A: BTFSS 03.2
041B: GOTO 42B
041C: MOVF 21,W
041D: SUBLW 80
041E: BTFSS 03.0
041F: GOTO 42B
.................... printf(lcd_putc,"** \r");
0420: CLRF 27
0421: MOVF 27,W
0422: CALL 027
0423: INCF 27,F
0424: MOVWF 77
0425: MOVWF 35
0426: CALL 212
0427: MOVLW 11
0428: SUBWF 27,W
0429: BTFSS 03.2
042A: GOTO 421
.................... if(I>128&&I<=256)
042B: MOVF 22,F
042C: BTFSS 03.2
042D: GOTO 432
042E: MOVF 21,W
042F: SUBLW 80
0430: BTFSC 03.0
0431: GOTO 447
0432: MOVF 22,W
0433: SUBLW 01
0434: BTFSS 03.0
0435: GOTO 447
0436: BTFSS 03.2
0437: GOTO 43C
0438: MOVF 21,W
0439: SUBLW 00
043A: BTFSS 03.0
043B: GOTO 447
.................... printf(lcd_putc,"**** \r");
043C: CLRF 27
043D: MOVF 27,W
043E: CALL 03D
043F: INCF 27,F
0440: MOVWF 77
0441: MOVWF 35
0442: CALL 212
0443: MOVLW 11
0444: SUBWF 27,W
0445: BTFSS 03.2
0446: GOTO 43D
.................... if(I>256&&I<=384)
0447: MOVF 22,W
0448: SUBLW 00
0449: BTFSC 03.0
044A: GOTO 467
044B: XORLW FF
044C: BTFSS 03.2
044D: GOTO 452
044E: MOVF 21,W
044F: SUBLW 00
0450: BTFSC 03.0
0451: GOTO 467
0452: MOVF 22,W
0453: SUBLW 01
0454: BTFSS 03.0
0455: GOTO 467
0456: BTFSS 03.2
0457: GOTO 45C
0458: MOVF 21,W
0459: SUBLW 80
045A: BTFSS 03.0
045B: GOTO 467
.................... printf(lcd_putc,"****** \r");
045C: CLRF 27
045D: MOVF 27,W
045E: CALL 053
045F: INCF 27,F
0460: MOVWF 77
0461: MOVWF 35
0462: CALL 212
0463: MOVLW 11
0464: SUBWF 27,W
0465: BTFSS 03.2
0466: GOTO 45D
.................... if(I>384&&I<=512)
0467: MOVF 22,W
0468: SUBLW 00
0469: BTFSC 03.0
046A: GOTO 487
046B: XORLW FF
046C: BTFSS 03.2
046D: GOTO 472
046E: MOVF 21,W
046F: SUBLW 80
0470: BTFSC 03.0
0471: GOTO 487
0472: MOVF 22,W
0473: SUBLW 02
0474: BTFSS 03.0
0475: GOTO 487
0476: BTFSS 03.2
0477: GOTO 47C
0478: MOVF 21,W
0479: SUBLW 00
047A: BTFSS 03.0
047B: GOTO 487
.................... printf(lcd_putc,"******** \r");
047C: CLRF 27
047D: MOVF 27,W
047E: CALL 069
047F: INCF 27,F
0480: MOVWF 77
0481: MOVWF 35
0482: CALL 212
0483: MOVLW 11
0484: SUBWF 27,W
0485: BTFSS 03.2
0486: GOTO 47D
.................... if(I>512&&I<=640)
0487: MOVF 22,W
0488: SUBLW 01
0489: BTFSC 03.0
048A: GOTO 4A7
048B: XORLW FF
048C: BTFSS 03.2
048D: GOTO 492
048E: MOVF 21,W
048F: SUBLW 00
0490: BTFSC 03.0
0491: GOTO 4A7
0492: MOVF 22,W
0493: SUBLW 02
0494: BTFSS 03.0
0495: GOTO 4A7
0496: BTFSS 03.2
0497: GOTO 49C
0498: MOVF 21,W
0499: SUBLW 80
049A: BTFSS 03.0
049B: GOTO 4A7
.................... printf(lcd_putc,"********** \r");
049C: CLRF 27
049D: MOVF 27,W
049E: CALL 07F
049F: INCF 27,F
04A0: MOVWF 77
04A1: MOVWF 35
04A2: CALL 212
04A3: MOVLW 11
04A4: SUBWF 27,W
04A5: BTFSS 03.2
04A6: GOTO 49D
.................... if(I>640&&I<=768)
04A7: MOVF 22,W
04A8: SUBLW 01
04A9: BTFSC 03.0
04AA: GOTO 4C7
04AB: XORLW FF
04AC: BTFSS 03.2
04AD: GOTO 4B2
04AE: MOVF 21,W
04AF: SUBLW 80
04B0: BTFSC 03.0
04B1: GOTO 4C7
04B2: MOVF 22,W
04B3: SUBLW 03
04B4: BTFSS 03.0
04B5: GOTO 4C7
04B6: BTFSS 03.2
04B7: GOTO 4BC
04B8: MOVF 21,W
04B9: SUBLW 00
04BA: BTFSS 03.0
04BB: GOTO 4C7
.................... printf(lcd_putc,"************ \r");
04BC: CLRF 27
04BD: MOVF 27,W
04BE: CALL 095
04BF: INCF 27,F
04C0: MOVWF 77
04C1: MOVWF 35
04C2: CALL 212
04C3: MOVLW 11
04C4: SUBWF 27,W
04C5: BTFSS 03.2
04C6: GOTO 4BD
.................... if(I>768&&I<=896)
04C7: MOVF 22,W
04C8: SUBLW 02
04C9: BTFSC 03.0
04CA: GOTO 4E7
04CB: XORLW FF
04CC: BTFSS 03.2
04CD: GOTO 4D2
04CE: MOVF 21,W
04CF: SUBLW 00
04D0: BTFSC 03.0
04D1: GOTO 4E7
04D2: MOVF 22,W
04D3: SUBLW 03
04D4: BTFSS 03.0
04D5: GOTO 4E7
04D6: BTFSS 03.2
04D7: GOTO 4DC
04D8: MOVF 21,W
04D9: SUBLW 80
04DA: BTFSS 03.0
04DB: GOTO 4E7
.................... printf(lcd_putc,"************** \r");
04DC: CLRF 27
04DD: MOVF 27,W
04DE: CALL 0AB
04DF: INCF 27,F
04E0: MOVWF 77
04E1: MOVWF 35
04E2: CALL 212
04E3: MOVLW 11
04E4: SUBWF 27,W
04E5: BTFSS 03.2
04E6: GOTO 4DD
.................... if(I>896&&I<=1016)
04E7: MOVF 22,W
04E8: SUBLW 02
04E9: BTFSC 03.0
04EA: GOTO 507
04EB: XORLW FF
04EC: BTFSS 03.2
04ED: GOTO 4F2
04EE: MOVF 21,W
04EF: SUBLW 80
04F0: BTFSC 03.0
04F1: GOTO 507
04F2: MOVF 22,W
04F3: SUBLW 03
04F4: BTFSS 03.0
04F5: GOTO 507
04F6: BTFSS 03.2
04F7: GOTO 4FC
04F8: MOVF 21,W
04F9: SUBLW F8
04FA: BTFSS 03.0
04FB: GOTO 507
.................... printf(lcd_putc,"****************\r");
04FC: CLRF 27
04FD: MOVF 27,W
04FE: CALL 0C1
04FF: INCF 27,F
0500: MOVWF 77
0501: MOVWF 35
0502: CALL 212
0503: MOVLW 11
0504: SUBWF 27,W
0505: BTFSS 03.2
0506: GOTO 4FD
.................... if(I>1016)
0507: MOVF 22,W
0508: SUBLW 02
0509: BTFSC 03.0
050A: GOTO 51D
050B: XORLW FF
050C: BTFSS 03.2
050D: GOTO 512
050E: MOVF 21,W
050F: SUBLW F8
0510: BTFSC 03.0
0511: GOTO 51D
.................... printf(lcd_putc," *** high *** \r");
0512: CLRF 27
0513: MOVF 27,W
0514: CALL 0D7
0515: INCF 27,F
0516: MOVWF 77
0517: MOVWF 35
0518: CALL 212
0519: MOVLW 11
051A: SUBWF 27,W
051B: BTFSS 03.2
051C: GOTO 513
....................
.................... delay_ms(600);
051D: MOVLW 03
051E: MOVWF 27
051F: MOVLW C8
0520: MOVWF 36
0521: CALL 0ED
0522: DECFSZ 27,F
0523: GOTO 51F
.................... }
0524: GOTO 3C8
.................... }
0525: SLEEP
Configuration Fuses:
Word 1: 3F39 XT NOWDT NOPUT NODEBUG NOPROTECT NOBROWNOUT NOLVP NOCPD NOWRT