CCS PCM C Compiler, Version 4.059d, 15399 01-III-07 20:10
Filename: main.lst
ROM used: 1222 words (60%)
Largest free fragment is 826
RAM used: 19 (5%) at main() level
44 (12%) worst case
Stack: 5 locations
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 31E
0003: NOP
.................... #include "C:\RS\Lux10brf\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)
*
009D: MOVLW 3A
009E: MOVWF 04
009F: BCF 03.7
00A0: MOVF 00,W
00A1: BTFSC 03.2
00A2: GOTO 0B4
00A3: MOVLW 01
00A4: MOVWF 78
00A5: MOVLW BF
00A6: MOVWF 77
00A7: CLRWDT
00A8: DECFSZ 77,F
00A9: GOTO 0A7
00AA: DECFSZ 78,F
00AB: GOTO 0A5
00AC: MOVLW 4A
00AD: MOVWF 77
00AE: DECFSZ 77,F
00AF: GOTO 0AE
00B0: NOP
00B1: CLRWDT
00B2: DECFSZ 00,F
00B3: GOTO 0A3
00B4: 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 LUX1 PIN_B2
.................... #define LUX2 PIN_B3
.................... #define LUX3 PIN_B4
.................... #define LUX4 PIN_B5
.................... #define HOLD PIN_B6
.................... #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
00B5: MOVF 07,W
00B6: ANDLW 0F
00B7: MOVWF 42
00B8: SWAPF 40,W
00B9: MOVWF 77
00BA: MOVLW F0
00BB: ANDWF 77,F
00BC: MOVF 77,W
00BD: ANDLW F0
00BE: IORWF 42,W
00BF: 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
00C0: BSF 06.0
00C1: BSF 03.5
00C2: BCF 06.0
.................... delay_us(1); // pockej alespon 450ns od e nebo alespon 195ns od dat
00C3: CLRWDT
.................... output_bit(LCD_E,0); // sestupna hrana (minimalni perioda e je 1us)
00C4: BCF 03.5
00C5: BCF 06.0
00C6: BSF 03.5
00C7: BCF 06.0
.................... }
00C8: BCF 03.5
00C9: 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
00CA: MOVF 3E,F
00CB: BTFSS 03.2
00CC: GOTO 0CF
00CD: BCF 06.1
00CE: GOTO 0D0
00CF: BSF 06.1
00D0: BSF 03.5
00D1: BCF 06.1
.................... swap(n);
00D2: BCF 03.5
00D3: SWAPF 3F,F
.................... lcd_send_nibble(n); // posli horni pulku bajtu
00D4: MOVF 3F,W
00D5: MOVWF 40
00D6: CALL 0B5
.................... swap(n);
00D7: SWAPF 3F,F
.................... lcd_send_nibble(n); // posli spodni pulku bajtu
00D8: MOVF 3F,W
00D9: MOVWF 40
00DA: CALL 0B5
.................... delay_us(40); // minimalni doba na provedeni prikazu
00DB: CLRWDT
00DC: MOVLW 0C
00DD: MOVWF 77
00DE: DECFSZ 77,F
00DF: GOTO 0DE
00E0: GOTO 0E1
.................... }
00E1: 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
00E2: MOVLW 14
00E3: MOVWF 3A
00E4: CALL 09D
....................
.................... #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
00E5: MOVLW 0F
00E6: BSF 03.5
00E7: ANDWF 07,F
.................... #endif
....................
.................... output_bit(LCD_RS,0); // nastav jako vystup a nastav klidovy stav
00E8: BCF 03.5
00E9: BCF 06.1
00EA: BSF 03.5
00EB: BCF 06.1
.................... output_bit(LCD_E, 0); // nastav jako vystup a nastav klidovy stav
00EC: BCF 03.5
00ED: BCF 06.0
00EE: BSF 03.5
00EF: BCF 06.0
....................
.................... for (i=0; i<3; i++) // nastav lcd do rezimu 8 bitu sbernice
00F0: BCF 03.5
00F1: CLRF 27
00F2: MOVF 27,W
00F3: SUBLW 02
00F4: BTFSS 03.0
00F5: GOTO 0FE
.................... {
.................... delay_ms(2); // muze byt rozdelany prenos dat (2x 4 bity) nebo pomaly povel
00F6: MOVLW 02
00F7: MOVWF 3A
00F8: CALL 09D
.................... lcd_send_nibble(3); // rezim 8 bitu
00F9: MOVLW 03
00FA: MOVWF 40
00FB: CALL 0B5
.................... }
00FC: INCF 27,F
00FD: GOTO 0F2
....................
.................... delay_us(40); // cas na zpracovani
00FE: CLRWDT
00FF: MOVLW 0C
0100: MOVWF 77
0101: DECFSZ 77,F
0102: GOTO 101
0103: GOTO 104
.................... lcd_send_nibble(2); // nastav rezim 4 bitu (plati od nasledujiciho prenosu)
0104: MOVLW 02
0105: MOVWF 40
0106: CALL 0B5
.................... delay_us(40); // cas na zpracovani
0107: CLRWDT
0108: MOVLW 0C
0109: MOVWF 77
010A: DECFSZ 77,F
010B: GOTO 10A
010C: GOTO 10D
....................
.................... for (i=0;i<3;i++) // proved inicializaci (nastaveni modu, smazani apod)
010D: CLRF 27
010E: MOVF 27,W
010F: SUBLW 02
0110: BTFSS 03.0
0111: GOTO 11E
.................... {
.................... lcd_send_byte(0,LCD_INIT_STRING[i]);
0112: MOVF 27,W
0113: CALL 004
0114: MOVWF 28
0115: CLRF 3E
0116: MOVF 28,W
0117: MOVWF 3F
0118: CALL 0CA
.................... delay_ms(2);
0119: MOVLW 02
011A: MOVWF 3A
011B: CALL 09D
.................... }
011C: INCF 27,F
011D: GOTO 10E
.................... }
011E: GOTO 379 (RETURN)
....................
....................
.................... // Proved presun kurzoru
.................... //
.................... // Pozice 1.1 je domu
.................... //
.................... void lcd_gotoxy( BYTE x, BYTE y)
.................... {
....................
.................... BYTE Adr;
....................
.................... Adr=x-1;
*
01B1: MOVLW 01
01B2: SUBWF 3A,W
01B3: MOVWF 3C
.................... if(y==2)
01B4: MOVF 3B,W
01B5: SUBLW 02
01B6: BTFSS 03.2
01B7: GOTO 1BA
.................... Adr+=LCD_LINE_2;
01B8: MOVLW 40
01B9: ADDWF 3C,F
....................
.................... lcd_send_byte(0,0x80|Adr);
01BA: MOVF 3C,W
01BB: IORLW 80
01BC: MOVWF 3D
01BD: CLRF 3E
01BE: MOVF 3D,W
01BF: MOVWF 3F
01C0: CALL 0CA
.................... }
01C1: RETLW 00
....................
....................
.................... // Zapis znaku na displej, zpracovani ridicich znaku
.................... //
.................... void lcd_putc( char c)
.................... {
....................
.................... switch (c)
.................... {
01C2: MOVF 39,W
01C3: XORLW 0C
01C4: BTFSC 03.2
01C5: GOTO 1D0
01C6: XORLW 06
01C7: BTFSC 03.2
01C8: GOTO 1D8
01C9: XORLW 07
01CA: BTFSC 03.2
01CB: GOTO 1DE
01CC: XORLW 05
01CD: BTFSC 03.2
01CE: GOTO 1E3
01CF: GOTO 1E8
.................... case '\f' : lcd_send_byte(0,1); // smaz displej
01D0: CLRF 3E
01D1: MOVLW 01
01D2: MOVWF 3F
01D3: CALL 0CA
.................... delay_ms(2);
01D4: MOVLW 02
01D5: MOVWF 3A
01D6: CALL 09D
.................... break;
01D7: GOTO 1F4
.................... case '\n' : lcd_gotoxy(1,2); break; // presun se na 1. znak 2. radky
01D8: MOVLW 01
01D9: MOVWF 3A
01DA: MOVLW 02
01DB: MOVWF 3B
01DC: CALL 1B1
01DD: GOTO 1F4
.................... case '\r' : lcd_gotoxy(1,1); break; // presun home
01DE: MOVLW 01
01DF: MOVWF 3A
01E0: MOVWF 3B
01E1: CALL 1B1
01E2: GOTO 1F4
.................... case '\b' : lcd_send_byte(0,0x10); break; // posun kurzor o 1 zpet
01E3: CLRF 3E
01E4: MOVLW 10
01E5: MOVWF 3F
01E6: CALL 0CA
01E7: GOTO 1F4
.................... default : if (c<0x20) c&=0x7; // preklopeni definovatelnych znaku na rozsah 0 az 0x1F
01E8: MOVF 39,W
01E9: SUBLW 1F
01EA: BTFSS 03.0
01EB: GOTO 1EE
01EC: MOVLW 07
01ED: ANDWF 39,F
.................... lcd_send_byte(1,c); break; // zapis znak
01EE: MOVLW 01
01EF: MOVWF 3E
01F0: MOVF 39,W
01F1: MOVWF 3F
01F2: CALL 0CA
01F3: GOTO 1F4
.................... }
.................... }
01F4: 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()
.................... {
*
031E: CLRF 04
031F: BCF 03.7
0320: MOVLW 1F
0321: ANDWF 03,F
0322: BSF 03.5
0323: BSF 1F.0
0324: BSF 1F.1
0325: BSF 1F.2
0326: BCF 1F.3
0327: MOVLW 07
0328: MOVWF 1C
.................... unsigned int16 I;
.................... float E;
....................
.................... port_b_pullups(TRUE);
*
032C: BSF 03.5
032D: BCF 01.7
.................... setup_adc_ports(AN0_VREF_VREF);
032E: BSF 1F.0
032F: BSF 1F.1
0330: BSF 1F.2
0331: BSF 1F.3
.................... setup_adc(ADC_CLOCK_DIV_32);
0332: BCF 1F.6
0333: BCF 03.5
0334: BCF 1F.6
0335: BSF 1F.7
0336: BSF 03.5
0337: BSF 1F.7
0338: BCF 03.5
0339: BSF 1F.0
.................... setup_psp(PSP_DISABLED);
033A: BSF 03.5
033B: BCF 09.4
.................... setup_spi(SPI_SS_DISABLED);
*
0329: MOVLW FF
032A: BCF 03.5
032B: MOVWF 20
*
033C: BCF 03.5
033D: BCF 14.5
033E: BCF 20.5
033F: MOVF 20,W
0340: BSF 03.5
0341: MOVWF 07
0342: BCF 03.5
0343: BSF 20.4
0344: MOVF 20,W
0345: BSF 03.5
0346: MOVWF 07
0347: BCF 03.5
0348: BCF 20.3
0349: MOVF 20,W
034A: BSF 03.5
034B: MOVWF 07
034C: MOVLW 01
034D: BCF 03.5
034E: MOVWF 14
034F: MOVLW 00
0350: BSF 03.5
0351: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
0352: MOVF 01,W
0353: ANDLW C7
0354: IORLW 08
0355: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
0356: BCF 03.5
0357: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
0358: MOVLW 00
0359: MOVWF 78
035A: MOVWF 12
035B: MOVLW 00
035C: BSF 03.5
035D: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
035E: MOVLW 07
035F: MOVWF 1C
0360: MOVF 05,W
0361: CLRWDT
0362: MOVLW 02
0363: MOVWF 77
0364: DECFSZ 77,F
0365: GOTO 364
0366: GOTO 367
0367: MOVF 1C,W
0368: BCF 03.5
0369: BCF 0D.6
.................... setup_vref(FALSE);
036A: BSF 03.5
036B: CLRF 1D
....................
.................... set_adc_channel (IN);
036C: MOVLW 00
036D: MOVWF 78
036E: BCF 03.5
036F: MOVF 1F,W
0370: ANDLW C7
0371: IORWF 78,W
0372: MOVWF 1F
.................... delay_us(20);
0373: CLRWDT
0374: MOVLW 06
0375: MOVWF 77
0376: DECFSZ 77,F
0377: GOTO 376
.................... lcd_init();
0378: GOTO 0E2
....................
.................... while(TRUE)
.................... {
.................... I=read_adc();
0379: BSF 1F.2
037A: BTFSC 1F.2
037B: GOTO 37A
037C: BSF 03.5
037D: MOVF 1E,W
037E: BCF 03.5
037F: MOVWF 21
0380: MOVF 1E,W
0381: MOVWF 22
.................... delay_us(600);
0382: CLRWDT
0383: MOVLW C7
0384: MOVWF 77
0385: DECFSZ 77,F
0386: GOTO 385
0387: NOP
.................... E=0.019531*I;
0388: MOVF 22,W
0389: MOVWF 28
038A: MOVF 21,W
038B: MOVWF 27
038C: GOTO 11F
038D: MOVLW 7A
038E: MOVWF 3C
038F: MOVLW FF
0390: MOVWF 3B
0391: MOVLW 1F
0392: MOVWF 3A
0393: MOVLW 79
0394: MOVWF 39
0395: MOVF 7A,W
0396: MOVWF 40
0397: MOVF 79,W
0398: MOVWF 3F
0399: MOVF 78,W
039A: MOVWF 3E
039B: MOVF 77,W
039C: MOVWF 3D
039D: CALL 13C
039E: MOVF 7A,W
039F: MOVWF 26
03A0: MOVF 79,W
03A1: MOVWF 25
03A2: MOVF 78,W
03A3: MOVWF 24
03A4: MOVF 77,W
03A5: MOVWF 23
.................... if(!input(LUX1))
03A6: BSF 03.5
03A7: BSF 06.2
03A8: BCF 03.5
03A9: BTFSC 06.2
03AA: GOTO 3E1
.................... {
.................... printf(lcd_putc," E=%4.2f lx \n",E);
03AB: CLRF 27
03AC: MOVF 27,W
03AD: CALL 00C
03AE: INCF 27,F
03AF: MOVWF 77
03B0: MOVWF 39
03B1: CALL 1C2
03B2: MOVLW 04
03B3: SUBWF 27,W
03B4: BTFSS 03.2
03B5: GOTO 3AC
03B6: MOVLW 03
03B7: MOVWF 04
03B8: MOVF 26,W
03B9: MOVWF 2F
03BA: MOVF 25,W
03BB: MOVWF 2E
03BC: MOVF 24,W
03BD: MOVWF 2D
03BE: MOVF 23,W
03BF: MOVWF 2C
03C0: MOVLW 02
03C1: MOVWF 30
03C2: CALL 237
03C3: MOVLW 09
03C4: MOVWF 28
03C5: MOVF 28,W
03C6: CALL 00C
03C7: INCF 28,F
03C8: MOVWF 77
03C9: MOVWF 39
03CA: CALL 1C2
03CB: MOVLW 0E
03CC: SUBWF 28,W
03CD: BTFSS 03.2
03CE: GOTO 3C5
.................... printf(lcd_putc," rozsah 1\n\r");
03CF: CLRF 27
03D0: MOVF 27,W
03D1: CALL 01F
03D2: INCF 27,F
03D3: MOVWF 77
03D4: MOVWF 39
03D5: CALL 1C2
03D6: MOVLW 0C
03D7: SUBWF 27,W
03D8: BTFSS 03.2
03D9: GOTO 3D0
.................... delay_ms(300);
03DA: MOVLW 02
03DB: MOVWF 27
03DC: MOVLW 96
03DD: MOVWF 3A
03DE: CALL 09D
03DF: DECFSZ 27,F
03E0: GOTO 3DC
.................... }
.................... if(!input(LUX2))
03E1: BSF 03.5
03E2: BSF 06.3
03E3: BCF 03.5
03E4: BTFSC 06.3
03E5: GOTO 433
.................... {
.................... printf(lcd_putc," E=%3.1f lx \n",10*E);
03E6: CLRF 3C
03E7: CLRF 3B
03E8: MOVLW 20
03E9: MOVWF 3A
03EA: MOVLW 82
03EB: MOVWF 39
03EC: MOVF 26,W
03ED: MOVWF 40
03EE: MOVF 25,W
03EF: MOVWF 3F
03F0: MOVF 24,W
03F1: MOVWF 3E
03F2: MOVF 23,W
03F3: MOVWF 3D
03F4: CALL 13C
03F5: MOVF 77,W
03F6: MOVWF 27
03F7: MOVF 78,W
03F8: MOVWF 28
03F9: MOVF 79,W
03FA: MOVWF 29
03FB: MOVF 7A,W
03FC: MOVWF 2A
03FD: CLRF 2B
03FE: MOVF 2B,W
03FF: CALL 030
0400: INCF 2B,F
0401: MOVWF 77
0402: MOVWF 39
0403: CALL 1C2
0404: MOVLW 04
0405: SUBWF 2B,W
0406: BTFSS 03.2
0407: GOTO 3FE
0408: MOVLW 02
0409: MOVWF 04
040A: MOVF 2A,W
040B: MOVWF 2F
040C: MOVF 29,W
040D: MOVWF 2E
040E: MOVF 28,W
040F: MOVWF 2D
0410: MOVF 27,W
0411: MOVWF 2C
0412: MOVLW 01
0413: MOVWF 30
0414: CALL 237
0415: MOVLW 09
0416: MOVWF 2C
0417: MOVF 2C,W
0418: CALL 030
0419: INCF 2C,F
041A: MOVWF 77
041B: MOVWF 39
041C: CALL 1C2
041D: MOVLW 0E
041E: SUBWF 2C,W
041F: BTFSS 03.2
0420: GOTO 417
.................... printf(lcd_putc," rozsah 2\n\r");
0421: CLRF 27
0422: MOVF 27,W
0423: CALL 043
0424: INCF 27,F
0425: MOVWF 77
0426: MOVWF 39
0427: CALL 1C2
0428: MOVLW 0C
0429: SUBWF 27,W
042A: BTFSS 03.2
042B: GOTO 422
.................... delay_ms(300);
042C: MOVLW 02
042D: MOVWF 27
042E: MOVLW 96
042F: MOVWF 3A
0430: CALL 09D
0431: DECFSZ 27,F
0432: GOTO 42E
.................... }
.................... if(!input(LUX3))
0433: BSF 03.5
0434: BSF 06.4
0435: BCF 03.5
0436: BTFSC 06.4
0437: GOTO 484
.................... {
.................... printf(lcd_putc," E=%4.0f lx \n",100*E);
0438: CLRF 3C
0439: CLRF 3B
043A: MOVLW 48
043B: MOVWF 3A
043C: MOVLW 85
043D: MOVWF 39
043E: MOVF 26,W
043F: MOVWF 40
0440: MOVF 25,W
0441: MOVWF 3F
0442: MOVF 24,W
0443: MOVWF 3E
0444: MOVF 23,W
0445: MOVWF 3D
0446: CALL 13C
0447: MOVF 77,W
0448: MOVWF 27
0449: MOVF 78,W
044A: MOVWF 28
044B: MOVF 79,W
044C: MOVWF 29
044D: MOVF 7A,W
044E: MOVWF 2A
044F: CLRF 2B
0450: MOVF 2B,W
0451: CALL 054
0452: INCF 2B,F
0453: MOVWF 77
0454: MOVWF 39
0455: CALL 1C2
0456: MOVLW 04
0457: SUBWF 2B,W
0458: BTFSS 03.2
0459: GOTO 450
045A: MOVLW 03
045B: MOVWF 04
045C: MOVF 2A,W
045D: MOVWF 2F
045E: MOVF 29,W
045F: MOVWF 2E
0460: MOVF 28,W
0461: MOVWF 2D
0462: MOVF 27,W
0463: MOVWF 2C
0464: CLRF 30
0465: CALL 237
0466: MOVLW 09
0467: MOVWF 2C
0468: MOVF 2C,W
0469: CALL 054
046A: INCF 2C,F
046B: MOVWF 77
046C: MOVWF 39
046D: CALL 1C2
046E: MOVLW 0E
046F: SUBWF 2C,W
0470: BTFSS 03.2
0471: GOTO 468
.................... printf(lcd_putc," rozsah 3\n\r");
0472: CLRF 27
0473: MOVF 27,W
0474: CALL 067
0475: INCF 27,F
0476: MOVWF 77
0477: MOVWF 39
0478: CALL 1C2
0479: MOVLW 0C
047A: SUBWF 27,W
047B: BTFSS 03.2
047C: GOTO 473
.................... delay_ms(300);
047D: MOVLW 02
047E: MOVWF 27
047F: MOVLW 96
0480: MOVWF 3A
0481: CALL 09D
0482: DECFSZ 27,F
0483: GOTO 47F
.................... }
.................... if(!input(LUX4))
0484: BSF 03.5
0485: BSF 06.5
0486: BCF 03.5
0487: BTFSC 06.5
0488: GOTO 4BF
.................... {
.................... printf(lcd_putc," E=%3.1f klx \n",E);
0489: CLRF 27
048A: MOVF 27,W
048B: CALL 078
048C: INCF 27,F
048D: MOVWF 77
048E: MOVWF 39
048F: CALL 1C2
0490: MOVLW 04
0491: SUBWF 27,W
0492: BTFSS 03.2
0493: GOTO 48A
0494: MOVLW 02
0495: MOVWF 04
0496: MOVF 26,W
0497: MOVWF 2F
0498: MOVF 25,W
0499: MOVWF 2E
049A: MOVF 24,W
049B: MOVWF 2D
049C: MOVF 23,W
049D: MOVWF 2C
049E: MOVLW 01
049F: MOVWF 30
04A0: CALL 237
04A1: MOVLW 09
04A2: MOVWF 28
04A3: MOVF 28,W
04A4: CALL 078
04A5: INCF 28,F
04A6: MOVWF 77
04A7: MOVWF 39
04A8: CALL 1C2
04A9: MOVLW 0F
04AA: SUBWF 28,W
04AB: BTFSS 03.2
04AC: GOTO 4A3
.................... printf(lcd_putc," rozsah 4\n\r");
04AD: CLRF 27
04AE: MOVF 27,W
04AF: CALL 08C
04B0: INCF 27,F
04B1: MOVWF 77
04B2: MOVWF 39
04B3: CALL 1C2
04B4: MOVLW 0C
04B5: SUBWF 27,W
04B6: BTFSS 03.2
04B7: GOTO 4AE
.................... delay_ms(300);
04B8: MOVLW 02
04B9: MOVWF 27
04BA: MOVLW 96
04BB: MOVWF 3A
04BC: CALL 09D
04BD: DECFSZ 27,F
04BE: GOTO 4BA
.................... }
.................... while(!input(HOLD));
04BF: BSF 03.5
04C0: BSF 06.6
04C1: BCF 03.5
04C2: BTFSS 06.6
04C3: GOTO 4BF
.................... }
04C4: GOTO 379
.................... }
04C5: SLEEP
Configuration Fuses:
Word 1: 3F39 XT NOWDT NOPUT NODEBUG NOPROTECT NOBROWNOUT NOLVP NOCPD NOWRT