diff --git a/c/adc/Makefile b/c/adc/Makefile new file mode 100755 index 0000000..4243940 --- /dev/null +++ b/c/adc/Makefile @@ -0,0 +1,32 @@ +# My pic workflow makefile by Fernando R Jacobo +# Dependencies +# SDCC Small Device C Compiler +# pk2cmd for pickit pic programmers + +# C compiler variables +SRC=*.c +CC=sdcc +FAMILY=pic16 +PROC=18f4550 + +# ASM and program variables +PPROC=PIC18F4550 +ASMPROC=18F4550 + +all: $(SRC:.c=.hex) + +comp: $(SRC) + $(CC) --use-non-free -m$(FAMILY) -p$(PROC) $^ + +clean: + rm -f $(SRC:.c=.asm) $(SRC:.c=.cod) $(SRC:.c=.hex) $(SRC:.c=.lst) $(SRC:.c=.o) + +program: + pk2cmd -M -P${PPROC} -Fmain.hex + +asm: *.asm + gpasm -p ${ASMPROC} -o main.hex $^ + +asmp: asm program + +.PHONY: all clean diff --git a/c/adc/main.asm b/c/adc/main.asm new file mode 100644 index 0000000..78d6de3 --- /dev/null +++ b/c/adc/main.asm @@ -0,0 +1,960 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15242 (Linux) +;-------------------------------------------------------- +; PIC16 port for the Microchip 16-bit core micros +;-------------------------------------------------------- + list p=18f4550 + radix dec + CONFIG XINST=OFF + CONFIG FOSC=HS + CONFIG WDT=OFF + CONFIG LVP=OFF + CONFIG MCLRE=OFF + + +;-------------------------------------------------------- +; public variables in this module +;-------------------------------------------------------- + global _isr + global _tmr_isr + global _number_to_7seg + global _display + global _cleardisp + global _count1k + global _count1kbak + global _start_adc + global _setup + global _main + global _sram_end + global _digit + global _dsp_en + +;-------------------------------------------------------- +; extern variables in this module +;-------------------------------------------------------- + extern _SPPCFGbits + extern _SPPEPSbits + extern _SPPCONbits + extern _UFRMLbits + extern _UFRMHbits + extern _UIRbits + extern _UIEbits + extern _UEIRbits + extern _UEIEbits + extern _USTATbits + extern _UCONbits + extern _UADDRbits + extern _UCFGbits + extern _UEP0bits + extern _UEP1bits + extern _UEP2bits + extern _UEP3bits + extern _UEP4bits + extern _UEP5bits + extern _UEP6bits + extern _UEP7bits + extern _UEP8bits + extern _UEP9bits + extern _UEP10bits + extern _UEP11bits + extern _UEP12bits + extern _UEP13bits + extern _UEP14bits + extern _UEP15bits + extern _PORTAbits + extern _PORTBbits + extern _PORTCbits + extern _PORTDbits + extern _PORTEbits + extern _LATAbits + extern _LATBbits + extern _LATCbits + extern _LATDbits + extern _LATEbits + extern _DDRAbits + extern _TRISAbits + extern _DDRBbits + extern _TRISBbits + extern _DDRCbits + extern _TRISCbits + extern _DDRDbits + extern _TRISDbits + extern _DDREbits + extern _TRISEbits + extern _OSCTUNEbits + extern _PIE1bits + extern _PIR1bits + extern _IPR1bits + extern _PIE2bits + extern _PIR2bits + extern _IPR2bits + extern _EECON1bits + extern _RCSTAbits + extern _TXSTAbits + extern _T3CONbits + extern _CMCONbits + extern _CVRCONbits + extern _CCP1ASbits + extern _ECCP1ASbits + extern _CCP1DELbits + extern _ECCP1DELbits + extern _BAUDCONbits + extern _BAUDCTLbits + extern _CCP2CONbits + extern _CCP1CONbits + extern _ECCP1CONbits + extern _ADCON2bits + extern _ADCON1bits + extern _ADCON0bits + extern _SSPCON2bits + extern _SSPCON1bits + extern _SSPSTATbits + extern _T2CONbits + extern _T1CONbits + extern _RCONbits + extern _WDTCONbits + extern _HLVDCONbits + extern _LVDCONbits + extern _OSCCONbits + extern _T0CONbits + extern _STATUSbits + extern _INTCON3bits + extern _INTCON2bits + extern _INTCONbits + extern _STKPTRbits + extern _SPPDATA + extern _SPPCFG + extern _SPPEPS + extern _SPPCON + extern _UFRM + extern _UFRML + extern _UFRMH + extern _UIR + extern _UIE + extern _UEIR + extern _UEIE + extern _USTAT + extern _UCON + extern _UADDR + extern _UCFG + extern _UEP0 + extern _UEP1 + extern _UEP2 + extern _UEP3 + extern _UEP4 + extern _UEP5 + extern _UEP6 + extern _UEP7 + extern _UEP8 + extern _UEP9 + extern _UEP10 + extern _UEP11 + extern _UEP12 + extern _UEP13 + extern _UEP14 + extern _UEP15 + extern _PORTA + extern _PORTB + extern _PORTC + extern _PORTD + extern _PORTE + extern _LATA + extern _LATB + extern _LATC + extern _LATD + extern _LATE + extern _DDRA + extern _TRISA + extern _DDRB + extern _TRISB + extern _DDRC + extern _TRISC + extern _DDRD + extern _TRISD + extern _DDRE + extern _TRISE + extern _OSCTUNE + extern _PIE1 + extern _PIR1 + extern _IPR1 + extern _PIE2 + extern _PIR2 + extern _IPR2 + extern _EECON1 + extern _EECON2 + extern _EEDATA + extern _EEADR + extern _RCSTA + extern _TXSTA + extern _TXREG + extern _RCREG + extern _SPBRG + extern _SPBRGH + extern _T3CON + extern _TMR3 + extern _TMR3L + extern _TMR3H + extern _CMCON + extern _CVRCON + extern _CCP1AS + extern _ECCP1AS + extern _CCP1DEL + extern _ECCP1DEL + extern _BAUDCON + extern _BAUDCTL + extern _CCP2CON + extern _CCPR2 + extern _CCPR2L + extern _CCPR2H + extern _CCP1CON + extern _ECCP1CON + extern _CCPR1 + extern _CCPR1L + extern _CCPR1H + extern _ADCON2 + extern _ADCON1 + extern _ADCON0 + extern _ADRES + extern _ADRESL + extern _ADRESH + extern _SSPCON2 + extern _SSPCON1 + extern _SSPSTAT + extern _SSPADD + extern _SSPBUF + extern _T2CON + extern _PR2 + extern _TMR2 + extern _T1CON + extern _TMR1 + extern _TMR1L + extern _TMR1H + extern _RCON + extern _WDTCON + extern _HLVDCON + extern _LVDCON + extern _OSCCON + extern _T0CON + extern _TMR0 + extern _TMR0L + extern _TMR0H + extern _STATUS + extern _FSR2L + extern _FSR2H + extern _PLUSW2 + extern _PREINC2 + extern _POSTDEC2 + extern _POSTINC2 + extern _INDF2 + extern _BSR + extern _FSR1L + extern _FSR1H + extern _PLUSW1 + extern _PREINC1 + extern _POSTDEC1 + extern _POSTINC1 + extern _INDF1 + extern _WREG + extern _FSR0L + extern _FSR0H + extern _PLUSW0 + extern _PREINC0 + extern _POSTDEC0 + extern _POSTINC0 + extern _INDF0 + extern _INTCON3 + extern _INTCON2 + extern _INTCON + extern _PROD + extern _PRODL + extern _PRODH + extern _TABLAT + extern _TBLPTR + extern _TBLPTRL + extern _TBLPTRH + extern _TBLPTRU + extern _PC + extern _PCL + extern _PCLATH + extern _PCLATU + extern _STKPTR + extern _TOS + extern _TOSL + extern _TOSH + extern _TOSU + extern _delay1ktcy + extern _delay100ktcy + extern _adc_read + extern __moduint + extern __divuint + +;-------------------------------------------------------- +; Equates to used internal registers +;-------------------------------------------------------- +STATUS equ 0xfd8 +PCL equ 0xff9 +PCLATH equ 0xffa +PCLATU equ 0xffb +WREG equ 0xfe8 +BSR equ 0xfe0 +FSR0L equ 0xfe9 +FSR0H equ 0xfea +FSR1L equ 0xfe1 +FSR2L equ 0xfd9 +INDF0 equ 0xfef +POSTINC1 equ 0xfe6 +POSTDEC1 equ 0xfe5 +PREINC1 equ 0xfe4 +PLUSW2 equ 0xfdb +PRODL equ 0xff3 +PRODH equ 0xff4 + + + idata +_digit db 0x00, 0x00, 0x00, 0x00 +_dsp_en db 0x00 + + +; Internal registers +.registers udata_ovr 0x0000 +r0x00 res 1 +r0x01 res 1 +r0x02 res 1 +r0x03 res 1 +r0x04 res 1 +r0x05 res 1 +r0x06 res 1 +r0x07 res 1 +r0x08 res 1 + + +ustat_main_00 udata 0X07FF +_sram_end res 0 + +;-------------------------------------------------------- +; interrupt vector +;-------------------------------------------------------- + +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +; ; Starting pCode block for absolute section +; ;----------------------------------------- +S_main_ivec_0x1_isr code 0X000008 +ivec_0x1_isr: + GOTO _isr + +; I code from now on! +; ; Starting pCode block +S_main__main code +_main: +; .line 176; main.c setup(); + CALL _setup +; .line 177; main.c start_adc(); + CALL _start_adc +; .line 178; main.c ADCON0bits.ADON = 1; + BSF _ADCON0bits, 0 +_00255_DS_: +; .line 181; main.c ADCON0bits.GO = 1; + BSF _ADCON0bits, 1 +; .line 182; main.c delay1ktcy(100); + MOVLW 0x64 + CALL _delay1ktcy +_00251_DS_: +; .line 183; main.c while (ADCON0bits.GO); + BTFSC _ADCON0bits, 1 + BRA _00251_DS_ +; .line 184; main.c cuenta = adc_read(); + CALL _adc_read + MOVWF r0x00 + MOVFF PRODL, r0x01 +; .line 185; main.c cleardisp(); + CALL _cleardisp +; .line 186; main.c display(cuenta); + MOVF r0x01, W + MOVWF POSTDEC1 + MOVF r0x00, W + MOVWF POSTDEC1 + CALL _display + MOVF POSTINC1, F + MOVF POSTINC1, F + BRA _00255_DS_ +; .line 189; main.c } + RETURN + +; ; Starting pCode block +S_main__setup code +_setup: +; .line 137; main.c void setup(void){ + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L +; .line 139; main.c LATD = 0; + CLRF _LATD +; .line 140; main.c TRISD = 0; + CLRF _TRISD +; .line 142; main.c TRISB = 0xff; + MOVLW 0xff + MOVWF _TRISB +; .line 143; main.c LATB = 0x00; + CLRF _LATB +; .line 146; main.c TRISE = 0; + CLRF _TRISE +; .line 147; main.c LATE = 0; + CLRF _LATE +; .line 149; main.c TRISA = 0x1; + MOVLW 0x01 + MOVWF _TRISA +; .line 150; main.c LATA = 0; + CLRF _LATA +; .line 153; main.c INTCONbits.GIE = 1; + BSF _INTCONbits, 7 +; .line 154; main.c INTCONbits.PEIE = 1; + BSF _INTCONbits, 6 +; .line 155; main.c INTCONbits.RBIE = 0; + BCF _INTCONbits, 3 +; .line 156; main.c INTCON2bits.RBPU = 0; + BCF _INTCON2bits, 7 +; .line 157; main.c INTCON2bits.RBIP = 1; + BSF _INTCON2bits, 0 +; .line 158; main.c RCONbits.IPEN = 1; + BSF _RCONbits, 7 +; .line 161; main.c INTCONbits.TMR0IE = 1; + BSF _INTCONbits, 5 +; .line 162; main.c INTCON2bits.TMR0IP = 1; + BSF _INTCON2bits, 2 +; .line 164; main.c T0CONbits.T08BIT = 1; + BSF _T0CONbits, 6 +; .line 165; main.c T0CONbits.T0CS = 0; // Source internal oscilator + BCF _T0CONbits, 5 +; .line 166; main.c T0CONbits.PSA = 0; + BCF _T0CONbits, 3 +; .line 170; main.c T0CONbits.T0PS = 0x7; + MOVF _T0CONbits, W + ANDLW 0xf8 + IORLW 0x07 + MOVWF _T0CONbits +; .line 171; main.c T0CONbits.TMR0ON = 1; + BSF _T0CONbits, 7 +; .line 172; main.c } + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__start_adc code +_start_adc: +; .line 128; main.c void start_adc(void) { + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L +; .line 129; main.c ADCON0bits.CHS = 0; + MOVF _ADCON0bits, W + ANDLW 0xc3 + MOVWF _ADCON0bits +; .line 130; main.c ADCON1bits.PCFG = 0xE; + MOVF _ADCON1bits, W + ANDLW 0xf0 + IORLW 0x0e + MOVWF _ADCON1bits +; .line 131; main.c ADCON2bits.ADFM = 1; + BSF _ADCON2bits, 7 +; .line 132; main.c ADCON2bits.ACQT = 0x5; + MOVF _ADCON2bits, W + ANDLW 0xc7 + IORLW 0x28 + MOVWF _ADCON2bits +; .line 133; main.c ADCON2bits.ADCS = 0x1; + MOVF _ADCON2bits, W + ANDLW 0xf8 + IORLW 0x01 + MOVWF _ADCON2bits +; .line 134; main.c ADCON0bits.ADON = 1; + BSF _ADCON0bits, 0 +; .line 135; main.c } + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__count1kbak code +_count1kbak: +; .line 122; main.c void count1kbak(void) { + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVFF r0x02, POSTDEC1 + MOVFF r0x03, POSTDEC1 +; .line 123; main.c for(int i = 9999; i >= 0; i--) { + MOVLW 0x0f + MOVWF r0x00 + MOVLW 0x27 + MOVWF r0x01 +_00234_DS_: + BSF STATUS, 0 + BTFSS r0x01, 7 + BCF STATUS, 0 + BC _00236_DS_ +; .line 124; main.c display(i); + MOVF r0x00, W + MOVWF r0x02 + MOVF r0x01, W + MOVWF r0x03 + MOVF r0x03, W + MOVWF POSTDEC1 + MOVF r0x02, W + MOVWF POSTDEC1 + CALL _display + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 125; main.c delay100ktcy(5); + MOVLW 0x05 + CALL _delay100ktcy +; .line 123; main.c for(int i = 9999; i >= 0; i--) { + MOVLW 0xff + ADDWF r0x00, F + ADDWFC r0x01, F + BRA _00234_DS_ +_00236_DS_: +; .line 127; main.c } + MOVFF PREINC1, r0x03 + MOVFF PREINC1, r0x02 + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__count1k code +_count1k: +; .line 116; main.c void count1k(void) { + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVFF r0x02, POSTDEC1 + MOVFF r0x03, POSTDEC1 +; .line 117; main.c for(int i = 0; i < 9999; i++) { + CLRF r0x00 + CLRF r0x01 +_00210_DS_: + MOVF r0x01, W + ADDLW 0x80 + ADDLW 0x59 + BNZ _00227_DS_ + MOVLW 0x0f + SUBWF r0x00, W +_00227_DS_: + BC _00212_DS_ +; .line 118; main.c display(i); + MOVF r0x00, W + MOVWF r0x02 + MOVF r0x01, W + MOVWF r0x03 + MOVF r0x03, W + MOVWF POSTDEC1 + MOVF r0x02, W + MOVWF POSTDEC1 + CALL _display + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 119; main.c delay100ktcy(5); + MOVLW 0x05 + CALL _delay100ktcy +; .line 117; main.c for(int i = 0; i < 9999; i++) { + INFSNZ r0x00, F + INCF r0x01, F + BRA _00210_DS_ +_00212_DS_: +; .line 121; main.c } + MOVFF PREINC1, r0x03 + MOVFF PREINC1, r0x02 + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__cleardisp code +_cleardisp: +; .line 109; main.c void cleardisp(void) { + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + BANKSEL _digit +; .line 110; main.c digit[0] = 0; + CLRF _digit, B + BANKSEL (_digit + 1) +; .line 111; main.c digit[1] = 0; + CLRF (_digit + 1), B + BANKSEL (_digit + 2) +; .line 112; main.c digit[2] = 0; + CLRF (_digit + 2), B + BANKSEL (_digit + 3) +; .line 113; main.c digit[3] = 0; + CLRF (_digit + 3), B +; .line 114; main.c } + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__display code +_display: +; .line 100; main.c void display(uint16_t num){ + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVFF r0x02, POSTDEC1 + MOVFF r0x03, POSTDEC1 + MOVFF r0x04, POSTDEC1 + MOVFF r0x05, POSTDEC1 + MOVFF r0x06, POSTDEC1 + MOVFF r0x07, POSTDEC1 + MOVFF r0x08, POSTDEC1 + MOVLW 0x02 + MOVFF PLUSW2, r0x00 + MOVLW 0x03 + MOVFF PLUSW2, r0x01 +; .line 102; main.c if (num > 9999) return; + MOVF r0x00, W + MOVWF r0x02 + MOVF r0x01, W + MOVWF r0x03 + MOVLW 0x27 + SUBWF r0x03, W + BNZ _00198_DS_ + MOVLW 0x10 + SUBWF r0x02, W +_00198_DS_: + BC _00177_DS_ +; .line 103; main.c while(num) { + CLRF r0x02 +_00174_DS_: + MOVF r0x01, W + IORWF r0x00, W + BZ _00177_DS_ +; .line 104; main.c digit[i] = num%10; + MOVLW LOW(_digit) + ADDWF r0x02, W + MOVWF r0x03 + CLRF r0x04 + MOVLW HIGH(_digit) + ADDWFC r0x04, F + MOVF r0x00, W + MOVWF r0x05 + MOVF r0x01, W + MOVWF r0x06 + MOVLW 0x00 + MOVWF POSTDEC1 + MOVLW 0x0a + MOVWF POSTDEC1 + MOVF r0x06, W + MOVWF POSTDEC1 + MOVF r0x05, W + MOVWF POSTDEC1 + CALL __moduint + MOVWF r0x07 + MOVFF PRODL, r0x08 + MOVLW 0x04 + ADDWF FSR1L, F + MOVFF r0x03, FSR0L + MOVFF r0x04, FSR0H + MOVFF r0x07, INDF0 +; .line 105; main.c num = num/10; + MOVLW 0x00 + MOVWF POSTDEC1 + MOVLW 0x0a + MOVWF POSTDEC1 + MOVF r0x06, W + MOVWF POSTDEC1 + MOVF r0x05, W + MOVWF POSTDEC1 + CALL __divuint + MOVWF r0x03 + MOVFF PRODL, r0x04 + MOVLW 0x04 + ADDWF FSR1L, F + MOVF r0x03, W + MOVWF r0x00 + MOVF r0x04, W + MOVWF r0x01 +; .line 106; main.c i++; + INCF r0x02, F + BRA _00174_DS_ +_00177_DS_: +; .line 108; main.c } + MOVFF PREINC1, r0x08 + MOVFF PREINC1, r0x07 + MOVFF PREINC1, r0x06 + MOVFF PREINC1, r0x05 + MOVFF PREINC1, r0x04 + MOVFF PREINC1, r0x03 + MOVFF PREINC1, r0x02 + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__number_to_7seg code +_number_to_7seg: +; .line 62; main.c uint8_t number_to_7seg(uint8_t number) { + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVLW 0x02 + MOVFF PLUSW2, r0x00 +; .line 63; main.c switch (number) { + MOVLW 0x10 + SUBWF r0x00, W + BTFSC STATUS, 0 + BRA _00156_DS_ + CLRF PCLATH + CLRF PCLATU + RLCF r0x00, W + RLCF PCLATH, F + RLCF WREG, W + RLCF PCLATH, F + ANDLW 0xfc + ADDLW LOW(_00167_DS_) + MOVWF POSTDEC1 + MOVLW HIGH(_00167_DS_) + ADDWFC PCLATH, F + MOVLW UPPER(_00167_DS_) + ADDWFC PCLATU, F + MOVF PREINC1, W + MOVWF PCL +_00167_DS_: + GOTO _00140_DS_ + GOTO _00141_DS_ + GOTO _00142_DS_ + GOTO _00143_DS_ + GOTO _00144_DS_ + GOTO _00145_DS_ + GOTO _00146_DS_ + GOTO _00147_DS_ + GOTO _00148_DS_ + GOTO _00149_DS_ + GOTO _00150_DS_ + GOTO _00151_DS_ + GOTO _00152_DS_ + GOTO _00153_DS_ + GOTO _00154_DS_ + GOTO _00155_DS_ +_00140_DS_: +; .line 65; main.c return 0x3F; + MOVLW 0x3f + BRA _00158_DS_ +_00141_DS_: +; .line 67; main.c return 0x06; + MOVLW 0x06 + BRA _00158_DS_ +_00142_DS_: +; .line 69; main.c return 0x5B; + MOVLW 0x5b + BRA _00158_DS_ +_00143_DS_: +; .line 71; main.c return 0x4F; + MOVLW 0x4f + BRA _00158_DS_ +_00144_DS_: +; .line 73; main.c return 0x66; + MOVLW 0x66 + BRA _00158_DS_ +_00145_DS_: +; .line 75; main.c return 0x6D; + MOVLW 0x6d + BRA _00158_DS_ +_00146_DS_: +; .line 77; main.c return 0x7D; + MOVLW 0x7d + BRA _00158_DS_ +_00147_DS_: +; .line 79; main.c return 0x07; + MOVLW 0x07 + BRA _00158_DS_ +_00148_DS_: +; .line 81; main.c return 0x7F; + MOVLW 0x7f + BRA _00158_DS_ +_00149_DS_: +; .line 83; main.c return 0x6F; + MOVLW 0x6f + BRA _00158_DS_ +_00150_DS_: +; .line 85; main.c return 0x77; + MOVLW 0x77 + BRA _00158_DS_ +_00151_DS_: +; .line 87; main.c return 0x7c; + MOVLW 0x7c + BRA _00158_DS_ +_00152_DS_: +; .line 89; main.c return 0x39; + MOVLW 0x39 + BRA _00158_DS_ +_00153_DS_: +; .line 91; main.c return 0x5e; + MOVLW 0x5e + BRA _00158_DS_ +_00154_DS_: +; .line 93; main.c return 0x79; + MOVLW 0x79 + BRA _00158_DS_ +_00155_DS_: +; .line 95; main.c return 0x71; + MOVLW 0x71 + BRA _00158_DS_ +_00156_DS_: +; .line 97; main.c return 0; + CLRF WREG +_00158_DS_: +; .line 99; main.c } + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__tmr_isr code +_tmr_isr: +; .line 39; main.c void tmr_isr(void){ + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 +; .line 40; main.c LATA = LATE = 0; + CLRF _LATE + CLRF _LATA +; .line 41; main.c LATD = number_to_7seg(digit[dsp_en]); + MOVLW LOW(_digit) + BANKSEL _dsp_en + ADDWF _dsp_en, W, B + MOVWF r0x00 + CLRF r0x01 + MOVLW HIGH(_digit) + ADDWFC r0x01, F + MOVFF r0x00, FSR0L + MOVFF r0x01, FSR0H + MOVFF INDF0, r0x00 + MOVF r0x00, W + MOVWF POSTDEC1 + CALL _number_to_7seg + MOVWF _LATD + MOVF POSTINC1, F +; .line 42; main.c switch (dsp_en) { + MOVLW 0x04 + BANKSEL _dsp_en + SUBWF _dsp_en, W, B + BC _00116_DS_ + CLRF PCLATH + CLRF PCLATU + BANKSEL _dsp_en + RLCF _dsp_en, W, B + RLCF PCLATH, F + RLCF WREG, W + RLCF PCLATH, F + ANDLW 0xfc + ADDLW LOW(_00134_DS_) + MOVWF POSTDEC1 + MOVLW HIGH(_00134_DS_) + ADDWFC PCLATH, F + MOVLW UPPER(_00134_DS_) + ADDWFC PCLATU, F + MOVF PREINC1, W + MOVWF PCL +_00134_DS_: + GOTO _00112_DS_ + GOTO _00113_DS_ + GOTO _00114_DS_ + GOTO _00115_DS_ +_00112_DS_: +; .line 44; main.c LATA = 0; + CLRF _LATA +; .line 45; main.c LATE = 0x4; + MOVLW 0x04 + MOVWF _LATE +; .line 46; main.c break; + BRA _00116_DS_ +_00113_DS_: +; .line 48; main.c LATE = 0x2; + MOVLW 0x02 + MOVWF _LATE +; .line 49; main.c break; + BRA _00116_DS_ +_00114_DS_: +; .line 51; main.c LATE = 0x1; + MOVLW 0x01 + MOVWF _LATE +; .line 52; main.c break; + BRA _00116_DS_ +_00115_DS_: +; .line 54; main.c LATE = 0; + CLRF _LATE +; .line 55; main.c LATA = 0x10; + MOVLW 0x10 + MOVWF _LATA +_00116_DS_: + BANKSEL _dsp_en +; .line 58; main.c dsp_en++; + INCF _dsp_en, F, B +; .line 59; main.c if (dsp_en > 3) dsp_en = 0; + MOVLW 0x04 + BANKSEL _dsp_en + SUBWF _dsp_en, W, B + BNC _00119_DS_ + BANKSEL _dsp_en + CLRF _dsp_en, B +_00119_DS_: +; .line 60; main.c } + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__isr code +_isr: +; .line 31; main.c void isr(void) __interrupt (1) { + MOVFF STATUS, POSTDEC1 + MOVFF BSR, POSTDEC1 + MOVWF POSTDEC1 + MOVFF PRODL, POSTDEC1 + MOVFF PRODH, POSTDEC1 + MOVFF FSR0L, POSTDEC1 + MOVFF FSR0H, POSTDEC1 + MOVFF PCLATH, POSTDEC1 + MOVFF PCLATU, POSTDEC1 + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L +; .line 32; main.c if (INTCONbits.TMR0IF){ + BTFSS _INTCONbits, 2 + BRA _00106_DS_ +; .line 33; main.c tmr_isr(); + CALL _tmr_isr +; .line 34; main.c TMR0 = RATE; + MOVLW 0xe6 + MOVWF _TMR0 +_00106_DS_: +; .line 36; main.c INTCONbits.TMR0IF = 0; + BCF _INTCONbits, 2 +; .line 37; main.c } + MOVFF PREINC1, FSR2L + MOVFF PREINC1, PCLATU + MOVFF PREINC1, PCLATH + MOVFF PREINC1, FSR0H + MOVFF PREINC1, FSR0L + MOVFF PREINC1, PRODH + MOVFF PREINC1, PRODL + MOVF PREINC1, W + MOVFF PREINC1, BSR + MOVFF PREINC1, STATUS + RETFIE + + + +; Statistics: +; code size: 1094 (0x0446) bytes ( 0.83%) +; 547 (0x0223) words +; udata size: 0 (0x0000) bytes ( 0.00%) +; access size: 9 (0x0009) bytes + + + end diff --git a/c/adc/main.c b/c/adc/main.c new file mode 100644 index 0000000..7f658e2 --- /dev/null +++ b/c/adc/main.c @@ -0,0 +1,189 @@ +#include +#include +#include +#include + +/* FUSES START */ +#pragma config XINST = OFF +#pragma config FOSC = HS +#pragma config WDT = OFF +#pragma config LVP = OFF +#pragma config MCLRE = OFF + +#define NDIGITS 4 +#define RATE 230 + +uint8_t digit[NDIGITS] = { 0 }; +uint8_t dsp_en = 0; + +void isr(void) __interrupt (1); +void tmr_isr(void); +uint8_t number_to_7seg(uint8_t); +void display(uint16_t); +void cleardisp(void); +void count1k(void); +void count1kbak(void); +void start_adc(void); +void setup(void); +int main(void); + + +void isr(void) __interrupt (1) { + if (INTCONbits.TMR0IF){ + tmr_isr(); + TMR0 = RATE; + } + INTCONbits.TMR0IF = 0; +} + +void tmr_isr(void){ + LATA = LATE = 0; + LATD = number_to_7seg(digit[dsp_en]); + switch (dsp_en) { + case 0: + LATA = 0; + LATE = 0x4; + break; + case 1: + LATE = 0x2; + break; + case 2: + LATE = 0x1; + break; + case 3: + LATE = 0; + LATA = 0x10; + break; + } + dsp_en++; + if (dsp_en > 3) dsp_en = 0; +} + +uint8_t number_to_7seg(uint8_t number) { + switch (number) { + case 0: + return 0x3F; + case 1: + return 0x06; + case 2: + return 0x5B; + case 3: + return 0x4F; + case 4: + return 0x66; + case 5: + return 0x6D; + case 6: + return 0x7D; + case 7: + return 0x07; + case 8: + return 0x7F; + case 9: + return 0x6F; + case 0xa: + return 0x77; + case 0xb: + return 0x7c; + case 0xC: + return 0x39; + case 0xd: + return 0x5e; + case 0xe: + return 0x79; + case 0xf: + return 0x71; + default: + return 0; + } +} +void display(uint16_t num){ + uint8_t i = 0; + if (num > 9999) return; + while(num) { + digit[i] = num%10; + num = num/10; + i++; + } +} +void cleardisp(void) { + digit[0] = 0; + digit[1] = 0; + digit[2] = 0; + digit[3] = 0; +} + +void count1k(void) { + for(int i = 0; i < 9999; i++) { + display(i); + delay100ktcy(5); + } +} +void count1kbak(void) { + for(int i = 9999; i >= 0; i--) { + display(i); + delay100ktcy(5); + } +} +void start_adc(void) { + ADCON0bits.CHS = 0; + ADCON1bits.PCFG = 0xE; + ADCON2bits.ADFM = 1; + ADCON2bits.ACQT = 0x5; + ADCON2bits.ADCS = 0x1; + ADCON0bits.ADON = 1; +} + +void setup(void){ + /* Port setup */ + LATD = 0; + TRISD = 0; + + TRISB = 0xff; + LATB = 0x00; +// ADCON1 = 0xf; + + TRISE = 0; + LATE = 0; + + TRISA = 0x1; + LATA = 0; + + /* Interrupt setup */ + INTCONbits.GIE = 1; + INTCONbits.PEIE = 1; + INTCONbits.RBIE = 0; + INTCON2bits.RBPU = 0; + INTCON2bits.RBIP = 1; + RCONbits.IPEN = 1; + + /* timer interrupt setup */ + INTCONbits.TMR0IE = 1; + INTCON2bits.TMR0IP = 1; + + T0CONbits.T08BIT = 1; + T0CONbits.T0CS = 0; // Source internal oscilator + T0CONbits.PSA = 0; + //T0CONbits.T0PS0 = 1; + //T0CONbits.T0PS1 = 1; + //T0CONbits.T0PS2 = 1; + T0CONbits.T0PS = 0x7; + T0CONbits.TMR0ON = 1; +} + +int main(void) { + uint16_t cuenta = 0; + setup(); + start_adc(); + ADCON0bits.ADON = 1; + for (;;) { + //count1kbak(); + ADCON0bits.GO = 1; + delay1ktcy(100); + while (ADCON0bits.GO); + cuenta = adc_read(); + cleardisp(); + display(cuenta); + } + return 0; +} diff --git a/c/adc/main.hex b/c/adc/main.hex new file mode 100644 index 0000000..f08bcd7 --- /dev/null +++ b/c/adc/main.hex @@ -0,0 +1,118 @@ +:020000040000FA +:040000008DEF01F08F +:08000800D3EF02F0D9CFE5FFB0 +:10001000E1CFD9FF00C0E5FF01C0E5FF02C0E5FF69 +:1000200003C0E5FF04C0E5FF05C0E5FF06C0E5FF2E +:1000300007C0E5FF08C0E5FF020EDBCF00F0030EAE +:10004000DBCF01F00050026E0150036E270E035CFF +:1000500002E1100E025C38E2026A0150001034E046 +:10006000600E0224036E046A000E04220050056E26 +:100070000150066E000EE56E0A0EE56E0650E56E46 +:100080000550E56EDBEC00F0076EF3CF08F0040ED0 +:10009000E12603C0E9FF04C0EAFF07C0EFFF000E3E +:1000A000E56E0A0EE56E0650E56E0550E56EE2EC73 +:1000B00001F0036EF3CF04F0040EE1260350006E4E +:1000C0000450016E022AC9D7E4CF08F0E4CF07F04C +:1000D000E4CF06F0E4CF05F0E4CF04F0E4CF03F082 +:1000E000E4CF02F0E4CF01F0E4CF00F0E4CFD9FF99 +:1000F0001200D9CFE5FFE1CFD9FF00C0E5FF020E26 +:10010000DBCF00F0100E005CD8B04FD0FA6AFB6A6B +:100110000034FA36E834FA36FC0B2A0FE56E010E8D +:10012000FA22000EFB22E450F96EB5EF00F0B7EFB3 +:1001300000F0B9EF00F0BBEF00F0BDEF00F0BFEF53 +:1001400000F0C1EF00F0C3EF00F0C5EF00F0C7EF23 +:1001500000F0C9EF00F0CBEF00F0CDEF00F0CFEFF3 +:1001600000F0D1EF00F0D3EF00F03F0E1FD0060EED +:100170001DD05B0E1BD04F0E19D0660E17D06D0E22 +:1001800015D07D0E13D0070E11D07F0E0FD06F0E3D +:100190000DD0770E0BD07C0E09D0390E07D05E0E35 +:1001A00005D0790E03D0710E01D0E86AE4CF00F0DB +:1001B000E4CFD9FF1200D9CFE5FFE1CFD9FF00C0CE +:1001C000E5FF01C0E5FF02C0E5FF03C0E5FF04C095 +:1001D000E5FF05C0E5FF06C0E5FF020EDBCF00F03E +:1001E000030EDBCF01F0040EDBCF02F0050EDBCFF8 +:1001F00003F0046A056A0350800BE844066E06505B +:1002000011E10250022603360350015C02E1025064 +:10021000005C04E2D8900332023204D0052A05C003 +:1002200004F0E9D70350015C02E10250005C04E3F2 +:100230000250005E0350015AD8900332023204C0CB +:1002400005F004060550EEE101C0F3FF0050E4CFD5 +:1002500006F0E4CF05F0E4CF04F0E4CF03F0E4CF00 +:1002600002F0E4CF01F0E4CF00F0E4CFD9FF1200B8 +:10027000D9CFE5FFE1CFD9FF00C0E5FF01C0E5FF21 +:100280008D6A896A600E00016425006E016A000EA5 +:10029000012200C0E9FF01C0EAFFEFCF00F00050EB +:1002A000E56E79EC00F08C6EE652040E0001645DA0 +:1002B00025E2FA6AFB6A00016435FA36E834FA3658 +:1002C000FC0BD20FE56E020EFA22000EFB22E45068 +:1002D000F96E71EF01F075EF01F078EF01F07BEF4F +:1002E00001F0896A040E8D6E09D0020E8D6E06D063 +:1002F000010E8D6E03D08D6A100E896E0001642B85 +:10030000040E0001645D02E30001646BE4CF01F0C0 +:10031000E4CF00F0E4CFD9FF120011EEFFF021EEA0 +:10032000FFF0F86AA68EA69C07EEFFF00068ED6A63 +:100330000050FDE1CE0EF66E060EF76E000EF86E62 +:100340000900F5CF05F00900F5CF06F034D009001B +:10035000F5CF00F00900F5CF01F00900F5CF02F06C +:1003600009000900F5CFE9FF0900F5CFEAFF090010 +:1003700009000900F5CF03F00900F5CF04F00900EA +:100380000900F6CF07F0F7CF08F0F8CF09F000C06A +:10039000F6FF01C0F7FF02C0F8FF03D00900F5CF58 +:1003A000EEFF0306FBE20406F9E207C0F6FF08C011 +:1003B000F7FF09C0F8FF0506CAE20606C8E224EC0A +:1003C00003F0FFD7D9CFE5FFE1CFD9FF00C0E5FFAC +:1003D00001C0E5FF02C0E5FF03C0E5FF04C0E5FF83 +:1003E00005C0E5FF06C0E5FF07C0E5FF020EDBCF55 +:1003F00000F0030EDBCF01F0040EDBCF02F0050EA0 +:10040000DBCF03F0046A056A100E066E0150800B04 +:10041000E844076E005000260136045004260536D5 +:100420000750D8A404800350055C02E10250045C2C +:1004300005E30250045E0350055A0080060606508C +:10044000E5E101C0F3FF0050E4CF07F0E4CF06F090 +:10045000E4CF05F0E4CF04F0E4CF03F0E4CF02F002 +:10046000E4CF01F0E4CF00F0E4CFD9FF1200E806BA +:10047000E56E630E63EC02F0E4500BE000D0E56E35 +:10048000630E63EC02F000D000D00000E450E82ED0 +:10049000F6D71200E806E56E630E37EC02F0630E45 +:1004A00063EC02F0E4500EE000D0E56E630E37EC32 +:1004B00002F0630E63EC02F000D000D00000E450C4 +:1004C000E82EF3D71200E8060000E85007E000D05D +:1004D00000D000D000D00000E82EFAD71200D9CF0B +:1004E000E5FFE1CFD9FF00C0E5FF01C0E5FF02C095 +:1004F000E5FF03C0E5FF0F0E006E270E016ED880EA +:1005000001AED89013E20050026E0150036E03500A +:10051000E56E0250E56E06EC00F0E652E652050E7E +:100520004AEC02F0FF0E00260122E9D7E4CF03F0E7 +:10053000E4CF02F0E4CF01F0E4CF00F0E4CFD9FF44 +:100540001200D9CFE5FFE1CFD9FF00C0E5FF01C020 +:10055000E5FF02C0E5FF03C0E5FF006A016A015044 +:10056000800F590F02E10F0E005C12E20050026E84 +:100570000150036E0350E56E0250E56E06EC00F08C +:10058000E652E652050E4AEC02F0004A012AE7D78D +:10059000E4CF03F0E4CF02F0E4CF01F0E4CF00F0C9 +:1005A000E4CFD9FF1200D8CFE5FFE0CFE5FFE56E3D +:1005B000F3CFE5FFF4CFE5FFE9CFE5FFEACFE5FFB5 +:1005C000FACFE5FFFBCFE5FFD9CFE5FFE1CFD9FFBC +:1005D000F2A404D038EC01F0E60ED66EF294E4CF2B +:1005E000D9FFE4CFFBFFE4CFFAFFE4CFEAFFE4CF8B +:1005F000E9FFE4CFF4FFE4CFF3FFE450E4CFE0FF02 +:10060000E4CFD8FF1000D9CFE5FFE1CFD9FF8C6A46 +:10061000956AFF0E936E8A6A966A8D6A010E926ED3 +:10062000896AF28EF28CF296F19EF180D08EF28A77 +:10063000F184D58CD59AD596D550F80B0709D56E8F +:10064000D58EE4CFD9FF120003EC03F040EC03F0A9 +:10065000C280C282640E37EC02F0C2B2FED76EECEA +:1006600003F0006EF3CF01F058EC03F00150E56E9B +:100670000050E56E06EC00F0E652E652EAD71200B2 +:10068000D9CFE5FFE1CFD9FFC250C30BC26EC15035 +:10069000F00B0E09C16EC08EC050C70B2809C06E8A +:1006A000C050F80B0109C06EC280E4CFD9FF120020 +:1006B000D9CFE5FFE1CFD9FF0001606B0001616B8D +:1006C0000001626B0001636BE4CFD9FF12000100EF +:1006D000E40600006000000006000000C4CFF3FF45 +:0A06E000C3501200000000000000EB +:020000040030CA +:010001000CF2 +:010003001EDE +:02000500038175 +:00000001FF diff --git a/c/lcd/Makefile b/c/lcd/Makefile new file mode 100755 index 0000000..4243940 --- /dev/null +++ b/c/lcd/Makefile @@ -0,0 +1,32 @@ +# My pic workflow makefile by Fernando R Jacobo +# Dependencies +# SDCC Small Device C Compiler +# pk2cmd for pickit pic programmers + +# C compiler variables +SRC=*.c +CC=sdcc +FAMILY=pic16 +PROC=18f4550 + +# ASM and program variables +PPROC=PIC18F4550 +ASMPROC=18F4550 + +all: $(SRC:.c=.hex) + +comp: $(SRC) + $(CC) --use-non-free -m$(FAMILY) -p$(PROC) $^ + +clean: + rm -f $(SRC:.c=.asm) $(SRC:.c=.cod) $(SRC:.c=.hex) $(SRC:.c=.lst) $(SRC:.c=.o) + +program: + pk2cmd -M -P${PPROC} -Fmain.hex + +asm: *.asm + gpasm -p ${ASMPROC} -o main.hex $^ + +asmp: asm program + +.PHONY: all clean diff --git a/c/lcd/main.asm b/c/lcd/main.asm new file mode 100644 index 0000000..c3a3494 --- /dev/null +++ b/c/lcd/main.asm @@ -0,0 +1,737 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15242 (Linux) +;-------------------------------------------------------- +; PIC16 port for the Microchip 16-bit core micros +;-------------------------------------------------------- + list p=18f4550 + radix dec + CONFIG XINST=OFF + CONFIG FOSC=HS + CONFIG WDT=OFF + CONFIG LVP=OFF + CONFIG MCLRE=OFF + + +;-------------------------------------------------------- +; public variables in this module +;-------------------------------------------------------- + global _LCD_Initialize + global _LCDWriteNibble + global _LCDPutChar + global _LCDPutCmd + global _LCDPutStr + global _LCDGoto + global _sram_end + global _main + +;-------------------------------------------------------- +; extern variables in this module +;-------------------------------------------------------- + extern __gptrload + extern __gptrget1 + extern _stdin + extern _stdout + extern _SPPCFGbits + extern _SPPEPSbits + extern _SPPCONbits + extern _UFRMLbits + extern _UFRMHbits + extern _UIRbits + extern _UIEbits + extern _UEIRbits + extern _UEIEbits + extern _USTATbits + extern _UCONbits + extern _UADDRbits + extern _UCFGbits + extern _UEP0bits + extern _UEP1bits + extern _UEP2bits + extern _UEP3bits + extern _UEP4bits + extern _UEP5bits + extern _UEP6bits + extern _UEP7bits + extern _UEP8bits + extern _UEP9bits + extern _UEP10bits + extern _UEP11bits + extern _UEP12bits + extern _UEP13bits + extern _UEP14bits + extern _UEP15bits + extern _PORTAbits + extern _PORTBbits + extern _PORTCbits + extern _PORTDbits + extern _PORTEbits + extern _LATAbits + extern _LATBbits + extern _LATCbits + extern _LATDbits + extern _LATEbits + extern _DDRAbits + extern _TRISAbits + extern _DDRBbits + extern _TRISBbits + extern _DDRCbits + extern _TRISCbits + extern _DDRDbits + extern _TRISDbits + extern _DDREbits + extern _TRISEbits + extern _OSCTUNEbits + extern _PIE1bits + extern _PIR1bits + extern _IPR1bits + extern _PIE2bits + extern _PIR2bits + extern _IPR2bits + extern _EECON1bits + extern _RCSTAbits + extern _TXSTAbits + extern _T3CONbits + extern _CMCONbits + extern _CVRCONbits + extern _CCP1ASbits + extern _ECCP1ASbits + extern _CCP1DELbits + extern _ECCP1DELbits + extern _BAUDCONbits + extern _BAUDCTLbits + extern _CCP2CONbits + extern _CCP1CONbits + extern _ECCP1CONbits + extern _ADCON2bits + extern _ADCON1bits + extern _ADCON0bits + extern _SSPCON2bits + extern _SSPCON1bits + extern _SSPSTATbits + extern _T2CONbits + extern _T1CONbits + extern _RCONbits + extern _WDTCONbits + extern _HLVDCONbits + extern _LVDCONbits + extern _OSCCONbits + extern _T0CONbits + extern _STATUSbits + extern _INTCON3bits + extern _INTCON2bits + extern _INTCONbits + extern _STKPTRbits + extern _SPPDATA + extern _SPPCFG + extern _SPPEPS + extern _SPPCON + extern _UFRM + extern _UFRML + extern _UFRMH + extern _UIR + extern _UIE + extern _UEIR + extern _UEIE + extern _USTAT + extern _UCON + extern _UADDR + extern _UCFG + extern _UEP0 + extern _UEP1 + extern _UEP2 + extern _UEP3 + extern _UEP4 + extern _UEP5 + extern _UEP6 + extern _UEP7 + extern _UEP8 + extern _UEP9 + extern _UEP10 + extern _UEP11 + extern _UEP12 + extern _UEP13 + extern _UEP14 + extern _UEP15 + extern _PORTA + extern _PORTB + extern _PORTC + extern _PORTD + extern _PORTE + extern _LATA + extern _LATB + extern _LATC + extern _LATD + extern _LATE + extern _DDRA + extern _TRISA + extern _DDRB + extern _TRISB + extern _DDRC + extern _TRISC + extern _DDRD + extern _TRISD + extern _DDRE + extern _TRISE + extern _OSCTUNE + extern _PIE1 + extern _PIR1 + extern _IPR1 + extern _PIE2 + extern _PIR2 + extern _IPR2 + extern _EECON1 + extern _EECON2 + extern _EEDATA + extern _EEADR + extern _RCSTA + extern _TXSTA + extern _TXREG + extern _RCREG + extern _SPBRG + extern _SPBRGH + extern _T3CON + extern _TMR3 + extern _TMR3L + extern _TMR3H + extern _CMCON + extern _CVRCON + extern _CCP1AS + extern _ECCP1AS + extern _CCP1DEL + extern _ECCP1DEL + extern _BAUDCON + extern _BAUDCTL + extern _CCP2CON + extern _CCPR2 + extern _CCPR2L + extern _CCPR2H + extern _CCP1CON + extern _ECCP1CON + extern _CCPR1 + extern _CCPR1L + extern _CCPR1H + extern _ADCON2 + extern _ADCON1 + extern _ADCON0 + extern _ADRES + extern _ADRESL + extern _ADRESH + extern _SSPCON2 + extern _SSPCON1 + extern _SSPSTAT + extern _SSPADD + extern _SSPBUF + extern _T2CON + extern _PR2 + extern _TMR2 + extern _T1CON + extern _TMR1 + extern _TMR1L + extern _TMR1H + extern _RCON + extern _WDTCON + extern _HLVDCON + extern _LVDCON + extern _OSCCON + extern _T0CON + extern _TMR0 + extern _TMR0L + extern _TMR0H + extern _STATUS + extern _FSR2L + extern _FSR2H + extern _PLUSW2 + extern _PREINC2 + extern _POSTDEC2 + extern _POSTINC2 + extern _INDF2 + extern _BSR + extern _FSR1L + extern _FSR1H + extern _PLUSW1 + extern _PREINC1 + extern _POSTDEC1 + extern _POSTINC1 + extern _INDF1 + extern _WREG + extern _FSR0L + extern _FSR0H + extern _PLUSW0 + extern _PREINC0 + extern _POSTDEC0 + extern _POSTINC0 + extern _INDF0 + extern _INTCON3 + extern _INTCON2 + extern _INTCON + extern _PROD + extern _PRODL + extern _PRODH + extern _TABLAT + extern _TBLPTR + extern _TBLPTRL + extern _TBLPTRH + extern _TBLPTRU + extern _PC + extern _PCL + extern _PCLATH + extern _PCLATU + extern _STKPTR + extern _TOS + extern _TOSL + extern _TOSH + extern _TOSU + extern _delay1ktcy + +;-------------------------------------------------------- +; Equates to used internal registers +;-------------------------------------------------------- +STATUS equ 0xfd8 +PCLATH equ 0xffa +WREG equ 0xfe8 +TBLPTRL equ 0xff6 +TBLPTRH equ 0xff7 +FSR1L equ 0xfe1 +FSR2L equ 0xfd9 +POSTINC1 equ 0xfe6 +POSTDEC1 equ 0xfe5 +PREINC1 equ 0xfe4 +PLUSW2 equ 0xfdb +PRODH equ 0xff4 + + +; Internal registers +.registers udata_ovr 0x0000 +r0x00 res 1 +r0x01 res 1 +r0x02 res 1 +r0x03 res 1 +r0x04 res 1 +r0x05 res 1 +r0x06 res 1 + + +ustat_main_00 udata 0X07FF +_sram_end res 0 + +;-------------------------------------------------------- +; interrupt vector +;-------------------------------------------------------- + +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +; I code from now on! +; ; Starting pCode block +S_main__main code +_main: +; .line 72; main.c OSCCON=0x72; // Select internal oscillator with frequency = 8MHz + MOVLW 0x72 + MOVWF _OSCCON +; .line 73; main.c LCD_Initialize(); + CALL _LCD_Initialize +; .line 74; main.c LCDPutStr(" Hello World!"); //Display String "Hello World" + MOVLW UPPER(___str_0) + MOVWF r0x02 + MOVLW HIGH(___str_0) + MOVWF r0x01 + MOVLW LOW(___str_0) + MOVWF r0x00 + MOVF r0x02, W + MOVWF POSTDEC1 + MOVF r0x01, W + MOVWF POSTDEC1 + MOVF r0x00, W + MOVWF POSTDEC1 + CALL _LCDPutStr + MOVLW 0x03 + ADDWF FSR1L, F +; .line 75; main.c LCDGoto(8,1); //Go to column 8 of second line + MOVLW 0x01 + MOVWF POSTDEC1 + MOVLW 0x08 + MOVWF POSTDEC1 + CALL _LCDGoto + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 76; main.c LCDPutChar('1'); //Display character '1' + MOVLW 0x31 + MOVWF POSTDEC1 + CALL _LCDPutChar + MOVF POSTINC1, F +; .line 77; main.c DisplayClr(); // Clear the display + MOVLW 0x01 + MOVWF POSTDEC1 + CALL _LCDPutCmd + MOVF POSTINC1, F +; .line 79; main.c LCDPutStr(" LCD Display"); // Dispay a string "LCD Display" + MOVLW UPPER(___str_1) + MOVWF r0x02 + MOVLW HIGH(___str_1) + MOVWF r0x01 + MOVLW LOW(___str_1) + MOVWF r0x00 + MOVF r0x02, W + MOVWF POSTDEC1 + MOVF r0x01, W + MOVWF POSTDEC1 + MOVF r0x00, W + MOVWF POSTDEC1 + CALL _LCDPutStr + MOVLW 0x03 + ADDWF FSR1L, F +; .line 80; main.c LCDGoto(0,1); //Go to second line + MOVLW 0x01 + MOVWF POSTDEC1 + MOVLW 0x00 + MOVWF POSTDEC1 + CALL _LCDGoto + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 81; main.c LCDPutStr("Micro Lab"); //Display String "Micro Lab" + MOVLW UPPER(___str_2) + MOVWF r0x02 + MOVLW HIGH(___str_2) + MOVWF r0x01 + MOVLW LOW(___str_2) + MOVWF r0x00 + MOVF r0x02, W + MOVWF POSTDEC1 + MOVF r0x01, W + MOVWF POSTDEC1 + MOVF r0x00, W + MOVWF POSTDEC1 + CALL _LCDPutStr + MOVLW 0x03 + ADDWF FSR1L, F +_00106_DS_: +; .line 82; main.c while (1) + BRA _00106_DS_ +; .line 87; main.c } + RETURN + +; ; Starting pCode block +S_main__LCDGoto code +_LCDGoto: +; .line 191; main.c void LCDGoto(char pos,char ln) + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVFF r0x02, POSTDEC1 + MOVLW 0x02 + MOVFF PLUSW2, r0x00 + MOVLW 0x03 + MOVFF PLUSW2, r0x01 +; .line 194; main.c if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1))) + MOVF r0x01, W + MOVWF r0x02 + MOVF r0x02, W + ADDLW 0x80 + ADDLW 0x7e + BC _00141_DS_ + MOVLW 0x10 + SUBWF r0x00, W + BNC _00142_DS_ +_00141_DS_: +; .line 197; main.c return; + BRA _00144_DS_ +_00142_DS_: +; .line 201; main.c LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos)); + MOVF r0x01, W + XORLW 0x01 + BNZ _00146_DS_ + MOVLW 0xc0 + IORWF r0x00, W + MOVWF r0x01 + BRA _00147_DS_ +_00146_DS_: + MOVLW 0x80 + IORWF r0x00, W + MOVWF r0x01 +_00147_DS_: + MOVF r0x01, W + MOVWF POSTDEC1 + CALL _LCDPutCmd + MOVF POSTINC1, F +; .line 204; main.c delay1ktcy(LCD_delay); + MOVLW 0x05 + CALL _delay1ktcy +_00144_DS_: +; .line 205; main.c } + MOVFF PREINC1, r0x02 + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__LCDPutStr code +_LCDPutStr: +; .line 178; main.c void LCDPutStr(const char *str) + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVFF r0x02, POSTDEC1 + MOVFF r0x03, POSTDEC1 + MOVFF r0x04, POSTDEC1 + MOVFF r0x05, POSTDEC1 + MOVFF r0x06, POSTDEC1 + MOVLW 0x02 + MOVFF PLUSW2, r0x00 + MOVLW 0x03 + MOVFF PLUSW2, r0x01 + MOVLW 0x04 + MOVFF PLUSW2, r0x02 +; .line 183; main.c while (str[i]) + CLRF r0x03 +_00133_DS_: + MOVF r0x03, W + ADDWF r0x00, W + MOVWF r0x04 + CLRF WREG + ADDWFC r0x01, W + MOVWF r0x05 + CLRF WREG + ADDWFC r0x02, W + MOVWF r0x06 + MOVFF r0x04, TBLPTRL + MOVFF r0x05, TBLPTRH + MOVFF r0x06, PCLATH + CALL __gptrload + CALL __gptrget1 + MOVWF r0x04 + MOVF r0x04, W + BZ _00136_DS_ +; .line 186; main.c LCDPutChar(str[i++]); + MOVF r0x03, W + ADDWF r0x00, W + MOVWF r0x04 + CLRF WREG + ADDWFC r0x01, W + MOVWF r0x05 + CLRF WREG + ADDWFC r0x02, W + MOVWF r0x06 + INCF r0x03, F + MOVFF r0x04, TBLPTRL + MOVFF r0x05, TBLPTRH + MOVFF r0x06, PCLATH + CALL __gptrload + CALL __gptrget1 + MOVWF r0x04 + MOVF r0x04, W + MOVWF POSTDEC1 + CALL _LCDPutChar + MOVF POSTINC1, F + BRA _00133_DS_ +_00136_DS_: +; .line 189; main.c } + MOVFF PREINC1, r0x06 + MOVFF PREINC1, r0x05 + MOVFF PREINC1, r0x04 + MOVFF PREINC1, r0x03 + MOVFF PREINC1, r0x02 + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__LCDPutCmd code +_LCDPutCmd: +; .line 161; main.c void LCDPutCmd(char ch) + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVLW 0x02 + MOVFF PLUSW2, r0x00 +; .line 163; main.c delay1ktcy(LCD_delay); + MOVLW 0x05 + CALL _delay1ktcy +; .line 166; main.c LCDWriteNibble(ch,instr); + MOVLW 0x00 + MOVWF POSTDEC1 + MOVF r0x00, W + MOVWF POSTDEC1 + CALL _LCDWriteNibble + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 169; main.c ch = (ch << 4); + SWAPF r0x00, W + ANDLW 0xf0 + MOVWF r0x01 +; .line 171; main.c delay1ktcy(1); + MOVLW 0x01 + CALL _delay1ktcy +; .line 174; main.c LCDWriteNibble(ch,instr); + MOVLW 0x00 + MOVWF POSTDEC1 + MOVF r0x01, W + MOVWF POSTDEC1 + CALL _LCDWriteNibble + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 175; main.c } + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__LCDPutChar code +_LCDPutChar: +; .line 146; main.c void LCDPutChar(char ch) + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVLW 0x02 + MOVFF PLUSW2, r0x00 +; .line 148; main.c delay1ktcy(LCD_delay); + MOVLW 0x05 + CALL _delay1ktcy +; .line 151; main.c LCDWriteNibble(ch,data); + MOVLW 0x01 + MOVWF POSTDEC1 + MOVF r0x00, W + MOVWF POSTDEC1 + CALL _LCDWriteNibble + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 154; main.c ch = (ch << 4); + SWAPF r0x00, W + ANDLW 0xf0 + MOVWF r0x01 +; .line 157; main.c LCDWriteNibble(ch,data); + MOVLW 0x01 + MOVWF POSTDEC1 + MOVF r0x01, W + MOVWF POSTDEC1 + CALL _LCDWriteNibble + MOVF POSTINC1, F + MOVF POSTINC1, F +; .line 158; main.c } + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__LCDWriteNibble code +_LCDWriteNibble: +; .line 119; main.c void LCDWriteNibble(char ch, char rs) + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L + MOVFF r0x00, POSTDEC1 + MOVFF r0x01, POSTDEC1 + MOVFF r0x02, POSTDEC1 + MOVLW 0x02 + MOVFF PLUSW2, r0x00 + MOVLW 0x03 + MOVFF PLUSW2, r0x01 +; .line 122; main.c ch = (ch >> 4); + SWAPF r0x00, W + ANDLW 0x0f + MOVWF r0x00 +; .line 125; main.c ch = (ch & 0x0F); + MOVLW 0x0f + ANDWF r0x00, F +; .line 128; main.c LCD_PORT = (LCD_PORT & 0xF0); + MOVFF _PORTD, r0x02 + MOVLW 0xf0 + ANDWF r0x02, W + MOVWF _PORTD +; .line 131; main.c LCD_PORT = (LCD_PORT | ch); + MOVF r0x00, W + IORWF _PORTD, F +; .line 134; main.c LCD_RS = rs; + MOVF r0x01, W + ANDLW 0x01 + SWAPF WREG, W + MOVWF PRODH + MOVF _PORTDbits, W + ANDLW 0xef + IORWF PRODH, W + MOVWF _PORTDbits +; .line 137; main.c LCD_RW = 0; + BCF _PORTDbits, 5 +; .line 140; main.c LCD_EN = 1; + BSF _PORTDbits, 6 +; .line 143; main.c LCD_EN = 0; + BCF _PORTDbits, 6 +; .line 144; main.c } + MOVFF PREINC1, r0x02 + MOVFF PREINC1, r0x01 + MOVFF PREINC1, r0x00 + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +S_main__LCD_Initialize code +_LCD_Initialize: +; .line 89; main.c void LCD_Initialize() + MOVFF FSR2L, POSTDEC1 + MOVFF FSR1L, FSR2L +; .line 92; main.c LCD_PORT = 0; + CLRF _PORTD +; .line 94; main.c TRISD = 0x00; + CLRF _TRISD +; .line 97; main.c LCD_PWR = 1; + BSF _PORTDbits, 7 +; .line 100; main.c delay1ktcy(LCD_Startup); + MOVLW 0x0f + CALL _delay1ktcy +; .line 103; main.c LCDPutCmd(0x32); + MOVLW 0x32 + MOVWF POSTDEC1 + CALL _LCDPutCmd + MOVF POSTINC1, F +; .line 106; main.c LCDPutCmd(FUNCTION_SET); + MOVLW 0x28 + MOVWF POSTDEC1 + CALL _LCDPutCmd + MOVF POSTINC1, F +; .line 109; main.c LCDPutCmd(DISPLAY_SETUP); + MOVLW 0x0c + MOVWF POSTDEC1 + CALL _LCDPutCmd + MOVF POSTINC1, F +; .line 111; main.c DisplayClr(); + MOVLW 0x01 + MOVWF POSTDEC1 + CALL _LCDPutCmd + MOVF POSTINC1, F +; .line 114; main.c LCDPutCmd(ENTRY_MODE); + MOVLW 0x06 + MOVWF POSTDEC1 + CALL _LCDPutCmd + MOVF POSTINC1, F +; .line 116; main.c } + MOVFF PREINC1, FSR2L + RETURN + +; ; Starting pCode block +___str_0: + DB 0x20, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64 + DB 0x21, 0x00 +; ; Starting pCode block +___str_1: + DB 0x20, 0x4c, 0x43, 0x44, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79 + DB 0x00 +; ; Starting pCode block +___str_2: + DB 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x20, 0x4c, 0x61, 0x62, 0x00 + + +; Statistics: +; code size: 802 (0x0322) bytes ( 0.61%) +; 401 (0x0191) words +; udata size: 0 (0x0000) bytes ( 0.00%) +; access size: 7 (0x0007) bytes + + + end diff --git a/c/lcd/main.c b/c/lcd/main.c new file mode 100644 index 0000000..037f3c1 --- /dev/null +++ b/c/lcd/main.c @@ -0,0 +1,205 @@ +//#include +#include +#include +#include +#include +#include + +#pragma config XINST = OFF +#pragma config FOSC = HS +#pragma config WDT = OFF +#pragma config LVP = OFF +#pragma config MCLRE = OFF +//#include "newxc8_header.h" +#define _XTAL_FREQ 8000000 +//#define delay1ktcy(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) +// set up the timing for the LCD delays +#define LCD_delay 5 // ~5mS +#define LCD_Startup 15 // ~15mS + +// Command set for Hitachi 44780U LCD display controller +#define LCD_CLEAR 0x01 +#define LCD_HOME 0x02 +#define LCD_CURSOR_BACK 0x10 +#define LCD_CURSOR_FWD 0x14 +#define LCD_PAN_LEFT 0x18 +#define LCD_PAN_RIGHT 0x1C +#define LCD_CURSOR_OFF 0x0C +#define LCD_CURSOR_ON 0x0E +#define LCD_CURSOR_BLINK 0x0F +#define LCD_CURSOR_LINE2 0xC0 + +// display controller setup commands from page 46 of Hitachi datasheet +#define FUNCTION_SET 0x28 // 4 bit interface, 2 lines, 5x8 font +#define ENTRY_MODE 0x06 // increment mode +#define DISPLAY_SETUP 0x0C // display on, cursor off, blink offd + +#define LCDLine1() LCDPutCmd(LCD_HOME) // legacy support +#define LCDLine2() LCDPutCmd(LCD_CURSOR_LINE2) // legacy support +#define shift_cursor() LCDPutCmd(LCD_CURSOR_FWD) // legacy support +#define cursor_on() LCDPutCmd(LCD_CURSOR_ON) // legacy support +#define DisplayClr() LCDPutCmd(LCD_CLEAR) // Legacy support + + +//---------------------------------------------------------------------- +// Definitions specific to the PICDEM 2 Plus +// These apply to the Black (2011) version. +//---------------------------------------------------------------------- + +// single bit for selecting command register or data register +#define instr 0 +#define data 1 + +// These #defines create the pin connections to the LCD in case they are changed on a future demo board +#define LCD_PORT PORTD +#define LCD_PWR PORTDbits.RD7 // LCD power pin +#define LCD_EN PORTDbits.RD6 // LCD enable +#define LCD_RW PORTDbits.RD5 // LCD read/write line +#define LCD_RS PORTDbits.RD4 // LCD register select line + +#define NB_LINES 2 // Number of display lines +#define NB_COL 16 // Number of characters per line + +void LCD_Initialize(void); +void LCDPutChar(char ch); +void LCDPutCmd(char ch); +void LCDPutStr(const char *); +void LCDWriteNibble(char ch, char rs); +void LCDGoto(char pos, char ln); + +void main(void) +{ + OSCCON=0x72; // Select internal oscillator with frequency = 8MHz + LCD_Initialize(); + LCDPutStr(" Hello World!"); //Display String "Hello World" + LCDGoto(8,1); //Go to column 8 of second line + LCDPutChar('1'); //Display character '1' + DisplayClr(); // Clear the display + + LCDPutStr(" LCD Display"); // Dispay a string "LCD Display" + LCDGoto(0,1); //Go to second line + LCDPutStr("Micro Lab"); //Display String "Micro Lab" + while (1) + { + // Add your application code + } + return; +} + +void LCD_Initialize() +{ + // clear latches before enabling TRIS bits + LCD_PORT = 0; + + TRISD = 0x00; + + // power up the LCD + LCD_PWR = 1; + + // required by display controller to allow power to stabilize + delay1ktcy(LCD_Startup); + + // required by display initialization + LCDPutCmd(0x32); + + // set interface size, # of lines and font + LCDPutCmd(FUNCTION_SET); + + // turn on display and sets up cursor + LCDPutCmd(DISPLAY_SETUP); + + DisplayClr(); + + // set cursor movement direction + LCDPutCmd(ENTRY_MODE); + +} + + +void LCDWriteNibble(char ch, char rs) +{ + // always send the upper nibble + ch = (ch >> 4); + + // mask off the nibble to be transmitted + ch = (ch & 0x0F); + + // clear the lower half of LCD_PORT + LCD_PORT = (LCD_PORT & 0xF0); + + // move the nibble onto LCD_PORT + LCD_PORT = (LCD_PORT | ch); + + // set data/instr bit to 0 = insructions; 1 = data + LCD_RS = rs; + + // RW - set write mode + LCD_RW = 0; + + // set up enable before writing nibble + LCD_EN = 1; + + // turn off enable after write of nibble + LCD_EN = 0; +} + +void LCDPutChar(char ch) +{ + delay1ktcy(LCD_delay); + + //Send higher nibble first + LCDWriteNibble(ch,data); + + //get the lower nibble + ch = (ch << 4); + + // Now send the low nibble + LCDWriteNibble(ch,data); +} + + +void LCDPutCmd(char ch) +{ + delay1ktcy(LCD_delay); + + //Send the higher nibble + LCDWriteNibble(ch,instr); + + //get the lower nibble + ch = (ch << 4); + + delay1ktcy(1); + + //Now send the lower nibble + LCDWriteNibble(ch,instr); +} + + +void LCDPutStr(const char *str) +{ + char i=0; + + // While string has not been fully traveresed + while (str[i]) + { + // Go display current char + LCDPutChar(str[i++]); + } + +} + +void LCDGoto(char pos,char ln) +{ + // if incorrect line or column + if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1))) + { + // Just do nothing + return; + } + + // LCD_Goto command + LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos)); + + // Wait for the LCD to finish + delay1ktcy(LCD_delay); +} diff --git a/c/lcd/main.hex b/c/lcd/main.hex new file mode 100644 index 0000000..92222ce --- /dev/null +++ b/c/lcd/main.hex @@ -0,0 +1,82 @@ +:020000040000FA +:1000000060EF00F0D9CFE5FFE1CFD9FF00C0E5FFF9 +:1000100001C0E5FF02C0E5FF03C0E5FF04C0E5FF46 +:1000200005C0E5FF06C0E5FF020EDBCF00F0030EC2 +:10003000DBCF01F0040EDBCF02F0036A0350002493 +:10004000046EE86A0120056EE86A0220066E04C0AC +:10005000F6FF05C0F7FF06C0FAFF2AEC02F037EC06 +:1000600002F0046E04501BE003500024046EE86AA2 +:100070000120056EE86A0220066E032A04C0F6FF1E +:1000800005C0F7FF06C0FAFF2AEC02F037EC02F0D9 +:10009000046E0450E56ECEEC01F0E652CFD7E4CF0B +:1000A00006F0E4CF05F0E4CF04F0E4CF03F0E4CFB2 +:1000B00002F0E4CF01F0E4CF00F0E4CFD9FF12006A +:1000C00011EEFFF021EEFFF0F86AA68EA69C07EE77 +:1000D000FFF00068ED6A0050FDE1920EF66E040E2E +:1000E000F76E000EF86E0900F5CF05F00900F5CFA8 +:1000F00006F034D00900F5CF00F00900F5CF01F08B +:100100000900F5CF02F009000900F5CFE9FF090069 +:10011000F5CFEAFF090009000900F5CF03F0090057 +:10012000F5CF04F009000900F6CF07F0F7CF08F08B +:10013000F8CF09F000C0F6FF01C0F7FF02C0F8FFDA +:1001400003D00900F5CFEEFF0306FBE20406F9E257 +:1001500007C0F6FF08C0F7FF09C0F8FF0506CAE2AE +:100160000606C8E2B5EC00F0FFD7720ED36E05ECC0 +:1001700001F0000E026E020E016E560E006E02506D +:10018000E56E0150E56E0050E56E02EC00F0030EE6 +:10019000E126010EE56E080EE56E3EEC01F0E6523A +:1001A000E652310EE56ECEEC01F0E652010EE56E40 +:1001B000A3EC01F0E652000E026E020E016E640E18 +:1001C000006E0250E56E0150E56E0050E56E02ECE7 +:1001D00000F0030EE126010EE56E000EE56E3EEC2A +:1001E00001F0E652E652000E026E020E016E720E31 +:1001F000006E0250E56E0150E56E0050E56E02ECB7 +:1002000000F0030EE126FFD71200D9CFE5FFE1CFC2 +:10021000D9FF836A956A838E0F0EF6EC01F0320ED9 +:10022000E56EA3EC01F0E652280EE56EA3EC01F0BA +:10023000E6520C0EE56EA3EC01F0E652010EE56EFF +:10024000A3EC01F0E652060EE56EA3EC01F0E652D7 +:10025000E4CFD9FF12002048656C6C6F20576F7295 +:100260006C642100204C434420446973706C6179B4 +:1002700000004D6963726F204C616200D9CFE5FFC9 +:10028000E1CFD9FF00C0E5FF01C0E5FF02C0E5FFF7 +:10029000020EDBCF00F0030EDBCF01F00150026E47 +:1002A0000250800F7E0F03E2100E005C01E312D0BB +:1002B0000150010A04E1C00E0010016E03D0800E4F +:1002C0000010016E0150E56EA3EC01F0E652050E40 +:1002D000F6EC01F0E4CF02F0E4CF01F0E4CF00F05F +:1002E000E4CFD9FF1200D9CFE5FFE1CFD9FF00C09D +:1002F000E5FF01C0E5FF02C0E5FF020EDBCF00F025 +:10030000030EDBCF01F000380F0B006E0F0E00164E +:1003100083CF02F0F00E0214836E0050831201505E +:10032000010BE838F46E8350EF0BF410836E839A60 +:10033000838C839CE4CF02F0E4CF01F0E4CF00F0A3 +:10034000E4CFD9FF1200D9CFE5FFE1CFD9FF00C03C +:10035000E5FF01C0E5FF020EDBCF00F0050EF6EC75 +:1003600001F0000EE56E0050E56E73EC01F0E65210 +:10037000E6520038F00B016E010EF6EC01F0000EB3 +:10038000E56E0150E56E73EC01F0E652E652E4CF03 +:1003900001F0E4CF00F0E4CFD9FF1200D9CFE5FFA0 +:1003A000E1CFD9FF00C0E5FF01C0E5FF020EDBCFC2 +:1003B00000F0050EF6EC01F0010EE56E0050E56E62 +:1003C00073EC01F0E652E6520038F00B016E010EBC +:1003D000E56E0150E56E73EC01F0E652E652E4CFB3 +:1003E00001F0E4CF00F0E4CFD9FF1200E806E56E9B +:1003F000630E09EC02F0E4500BE000D0E56E630EF2 +:1004000009EC02F000D000D00000E450E82EF6D74E +:100410001200E8060000E85007E000D000D000D04D +:1004200000D00000E82EFAD71200F2CFF6FFF29EBD +:10043000A680A850A92AA680A8CFF3FFA92AA68043 +:10044000A8CFF4FFA92AA680A8CFF5FFA92AF6BE57 +:10045000F28E1200FAAE05D0F7CFEAFFF6CFE9FF31 +:100460001200FABC55EF02F0FACFF8FF1200FAAE14 +:1004700002D0EE501200FABC59EF02F00900F5501C +:100480001200F2CFF6FFF29EA680A850F6BEF28EC2 +:1004900012000100B6040000660000000100000028 +:1004A000F6CFA9FFA69EA69C120050EF02F015EF12 +:0804B00002F041EF02F0000030 +:020000040030CA +:010001000CF2 +:010003001EDE +:02000500038175 +:00000001FF