;------------------------------------------------------------------------------ ; ECG Heart Rate Monitor ; Biocard MQP ; WPI ECE ; Dan Moyer ; 3/1/2011 ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Processor Declaration ;------------------------------------------------------------------------------ LIST p=16LF722 #INCLUDE ;------------------------------------------------------------------------------ ; Configuration Setup ;------------------------------------------------------------------------------ __CONFIG _CONFIG1, _DEBUG_OFF & _PLL_DIS & _BORV_1_9 & _BOR_OFF & _CP_OFF & _MCLR_EN & _PWRT_EN & _WDT_OFF & _EXTRCIO __CONFIG _CONFIG2, _VCAP_DIS ;------------------------------------------------------------------------------ ; Configuration Definitions ;------------------------------------------------------------------------------ #DEFINE TRISA_CONFIG 0x9B ; PORTA TRIS Configuration #DEFINE TRISC_CONFIG 0x03 ; PORTC TRIS Configuration #DEFINE ANSELA_CONFIG 0x1B ; PORTA ANSEL Configuration #DEFINE INTCON_CONFIG 0x40 ; INTCON Configuration #DEFINE PIE1_CONFIG 0x41 ; PIE1 Configuration #DEFINE T1CON_CONFIG 0x9C ; Timer1 Configuration #DEFINE ADCON1_CONFIG 0x30 ; ADC Control Register 1 Configuration #DEFINE ADCON0_CH3 0x0D ; ADC CH3 Configuration ;------------------------------------------------------------------------------ ; Memory Allocation ;------------------------------------------------------------------------------ #DEFINE DIV_TABLE 0x20 ; Division Lookup Table #DEFINE T_MEM 0x60 ; Previous 8 Periods #DEFINE LCD1_TABLE 0xA0 ; LCD Lookup Table for Port B (Digit 2, COM) #DEFINE LCD2_TABLE 0xAA ; LCD Lookup Table for Ports A, C (Digit 1, 3) S0 EQU 0x68 ; Sorted Periods S1 EQU 0x69 ; S2 EQU 0x6A ; S3 EQU 0x6B ; S4 EQU 0x6C ; S5 EQU 0x6D ; S6 EQU 0x6E ; S7 EQU 0x6F ; X1 EQU 0x71 ; Previous Samples X2 EQU 0x72 ; X3 EQU 0x73 ; X4 EQU 0x74 ; YL EQU 0x75 ; Filter Output YH EQU 0x76 ; ZL EQU 0x77 ; Standard Deviation Estimate ZM EQU 0x78 ; ZH EQU 0x79 ; PERIOD EQU 0x7A ; Current Period LOCKOUT EQU 0x7B ; Lockout Timer T EQU 0x7C ; Pointer to New Period LCDA EQU 0x7D ; Value Written to PORTA LCDB EQU 0x7E ; Value Written to PORTB LCDC EQU 0x7F ; Value Written to PORTC ;------------------------------------------------------------------------------ ; Reset Vector ;------------------------------------------------------------------------------ RESET ORG 0x0000 ; Reset Vector GOTO initialize_ ; ;------------------------------------------------------------------------------ ; Interrupt Vector ;------------------------------------------------------------------------------ ISR ORG 0x0004 ; Interrupt Vector Location GOTO initialize_ ; ;------------------------------------------------------------------------------ ; Initialize ; ; Initializes Timer, Interrupts, ADC, ; Division Table, LCD Tables and Ports ;------------------------------------------------------------------------------ initialize_ CLRF STATUS ; Configure Bank 0 MOVLW T1CON_CONFIG ; Timer1 MOVWF T1CON ; MOVLW INTCON_CONFIG ; Global Interrupts MOVWF INTCON ; CLRF PORTA ; Clear Port Values CLRF PORTB ; CLRF PORTC ; BSF STATUS, 5 ; Configure Bank 1 MOVLW PIE1_CONFIG ; Interrupts MOVWF PIE1 ; MOVLW ADCON1_CONFIG ; ADC MOVWF ADCON1 ; MOVLW TRISA_CONFIG ; Port Tri-State Buffers MOVWF TRISA ; CLRF TRISB ; MOVLW TRISC_CONFIG ; MOVWF TRISC ; BSF STATUS, 6 ; Configure Bank 3 MOVLW ANSELA_CONFIG ; Port Analog Select MOVWF ANSELA ; CLRF ANSELB ; CLRF STATUS ; Initialize Division Table MOVLW 0xE1 ; MOVWF (DIV_TABLE + 0x00) ; MOVLW 0xDD ; MOVWF (DIV_TABLE + 0x01) ; MOVLW 0xDA ; MOVWF (DIV_TABLE + 0x02) ; MOVLW 0xD6 ; MOVWF (DIV_TABLE + 0x03) ; MOVLW 0xD3 ; MOVWF (DIV_TABLE + 0x04) ; MOVLW 0xD0 ; MOVWF (DIV_TABLE + 0x05) ; MOVLW 0xCD ; MOVWF (DIV_TABLE + 0x06) ; MOVLW 0xCA ; MOVWF (DIV_TABLE + 0x07) ; MOVLW 0xC8 ; MOVWF (DIV_TABLE + 0x08) ; MOVLW 0xC5 ; MOVWF (DIV_TABLE + 0x09) ; MOVLW 0xC2 ; MOVWF (DIV_TABLE + 0x0A) ; MOVLW 0xC0 ; MOVWF (DIV_TABLE + 0x0B) ; MOVLW 0xBD ; MOVWF (DIV_TABLE + 0x0C) ; MOVLW 0xBB ; MOVWF (DIV_TABLE + 0x0D) ; MOVLW 0xB8 ; MOVWF (DIV_TABLE + 0x0E) ; MOVLW 0xB6 ; MOVWF (DIV_TABLE + 0x0F) ; MOVLW 0xB4 ; MOVWF (DIV_TABLE + 0x10) ; MOVLW 0xB1 ; MOVWF (DIV_TABLE + 0x11) ; MOVLW 0xAF ; MOVWF (DIV_TABLE + 0x12) ; MOVLW 0xAD ; MOVWF (DIV_TABLE + 0x13) ; MOVLW 0xAB ; MOVWF (DIV_TABLE + 0x14) ; MOVLW 0xA9 ; MOVWF (DIV_TABLE + 0x15) ; MOVLW 0xA7 ; MOVWF (DIV_TABLE + 0x16) ; MOVLW 0xA5 ; MOVWF (DIV_TABLE + 0x17) ; MOVLW 0xA3 ; MOVWF (DIV_TABLE + 0x18) ; MOVLW 0xA1 ; MOVWF (DIV_TABLE + 0x19) ; MOVLW 0xA0 ; MOVWF (DIV_TABLE + 0x1A) ; MOVLW 0x9E ; MOVWF (DIV_TABLE + 0x1B) ; MOVLW 0x9C ; MOVWF (DIV_TABLE + 0x1C) ; MOVLW 0x9A ; MOVWF (DIV_TABLE + 0x1D) ; MOVLW 0x99 ; MOVWF (DIV_TABLE + 0x1E) ; MOVLW 0x97 ; MOVWF (DIV_TABLE + 0x1F) ; MOVLW 0x96 ; MOVWF (DIV_TABLE + 0x20) ; MOVLW 0x94 ; MOVWF (DIV_TABLE + 0x21) ; MOVLW 0x92 ; MOVWF (DIV_TABLE + 0x22) ; MOVLW 0x91 ; MOVWF (DIV_TABLE + 0x23) ; MOVLW 0x90 ; MOVWF (DIV_TABLE + 0x24) ; MOVLW 0x8E ; MOVWF (DIV_TABLE + 0x25) ; MOVLW 0x8D ; MOVWF (DIV_TABLE + 0x26) ; MOVLW 0x8B ; MOVWF (DIV_TABLE + 0x27) ; MOVLW 0x8A ; MOVWF (DIV_TABLE + 0x28) ; MOVLW 0x89 ; MOVWF (DIV_TABLE + 0x29) ; MOVLW 0x87 ; MOVWF (DIV_TABLE + 0x2A) ; MOVLW 0x86 ; MOVWF (DIV_TABLE + 0x2B) ; MOVLW 0x85 ; MOVWF (DIV_TABLE + 0x2C) ; MOVLW 0x84 ; MOVWF (DIV_TABLE + 0x2D) ; MOVLW 0x82 ; MOVWF (DIV_TABLE + 0x2E) ; MOVLW 0x81 ; MOVWF (DIV_TABLE + 0x2F) ; MOVLW 0x80 ; MOVWF (DIV_TABLE + 0x30) ; MOVLW 0x7F ; MOVWF (DIV_TABLE + 0x31) ; MOVLW 0x7E ; MOVWF (DIV_TABLE + 0x32) ; MOVLW 0x7D ; MOVWF (DIV_TABLE + 0x33) ; MOVLW 0x7C ; MOVWF (DIV_TABLE + 0x34) ; MOVLW 0x7B ; MOVWF (DIV_TABLE + 0x35) ; MOVLW 0x7A ; MOVWF (DIV_TABLE + 0x36) ; MOVLW 0x79 ; MOVWF (DIV_TABLE + 0x37) ; MOVLW 0x78 ; MOVWF (DIV_TABLE + 0x38) ; MOVLW 0x77 ; MOVWF (DIV_TABLE + 0x39) ; MOVLW 0x76 ; MOVWF (DIV_TABLE + 0x3A) ; MOVLW 0x75 ; MOVWF (DIV_TABLE + 0x3B) ; MOVLW 0x74 ; MOVWF (DIV_TABLE + 0x3C) ; MOVLW 0x73 ; MOVWF (DIV_TABLE + 0x3D) ; MOVLW 0x72 ; MOVWF (DIV_TABLE + 0x3E) ; MOVLW 0x71 ; MOVWF (DIV_TABLE + 0x3F) ; BSF STATUS, 5 ; Initialize LCD Tables MOVLW 0x6F ; MOVWF (LCD1_TABLE + 0) ; MOVLW 0x03 ; MOVWF (LCD1_TABLE + 1) ; MOVLW 0x76 ; MOVWF (LCD1_TABLE + 2) ; MOVLW 0x57 ; MOVWF (LCD1_TABLE + 3) ; MOVLW 0x1B ; MOVWF (LCD1_TABLE + 4) ; MOVLW 0x5D ; MOVWF (LCD1_TABLE + 5) ; MOVLW 0x7D ; MOVWF (LCD1_TABLE + 6) ; MOVLW 0x07 ; MOVWF (LCD1_TABLE + 7) ; MOVLW 0x7F ; MOVWF (LCD1_TABLE + 8) ; MOVLW 0x5F ; MOVWF (LCD1_TABLE + 9) ; MOVLW 0xFA ; MOVWF (LCD2_TABLE + 0) ; MOVLW 0x60 ; MOVWF (LCD2_TABLE + 1) ; MOVLW 0xB6 ; MOVWF (LCD2_TABLE + 2) ; MOVLW 0xF4 ; MOVWF (LCD2_TABLE + 3) ; MOVLW 0x6C ; MOVWF (LCD2_TABLE + 4) ; MOVLW 0xDC ; MOVWF (LCD2_TABLE + 5) ; MOVLW 0xDE ; MOVWF (LCD2_TABLE + 6) ; MOVLW 0x70 ; MOVWF (LCD2_TABLE + 7) ; MOVLW 0xFE ; MOVWF (LCD2_TABLE + 8) ; MOVLW 0xFC ; MOVWF (LCD2_TABLE + 9) ; CLRF STATUS ; CLRF LCDA ; Clear LCD CLRF LCDB ; BSF LCDB, 4 ; CLRF LCDC ; BSF LCDC, 2 ; MOVLW 0x40 ; Clear Period List MOVWF (T_MEM + 0) ; MOVWF (T_MEM + 1) ; MOVWF (T_MEM + 2) ; MOVWF (T_MEM + 3) ; MOVWF (T_MEM + 4) ; MOVWF (T_MEM + 5) ; MOVWF (T_MEM + 6) ; MOVWF (T_MEM + 7) ; MOVWF S0 ; Clear Sorted List MOVWF S1 ; MOVWF S2 ; MOVWF S3 ; MOVWF S4 ; MOVWF S5 ; MOVWF S6 ; MOVWF S7 ; MOVLW 0x78 ; Initialize Period MOVWF PERIOD ; MOVLW 0x14 ; Initialize Lockout MOVWF LOCKOUT ; CLRF T ; Initialize Period Pointer CLRF ZH ; Initialize Standard MOVLW 0x78 ; Deviation Estimate MOVWF ZM ; CLRF ZL ; MOVLW 0xFE ; Initialize Timer MOVWF TMR1H ; MOVLW 0xEF ; MOVWF TMR1L ; BSF T1CON, 0 ; Start Timer ;------------------------------------------------------------------------------ ; Drive LCD ;------------------------------------------------------------------------------ driveLCD_ MOVF LCDA, 0 ; MOVWF PORTA ; MOVF LCDB, 0 ; MOVWF PORTB ; MOVF LCDC, 0 ; MOVWF PORTC ; COMF LCDA, 1 ; COMF LCDB, 1 ; COMF LCDC, 1 ; BCF LCDA, 2 ; ;------------------------------------------------------------------------------ ; Sample ; 60 Hz sampling rate ;------------------------------------------------------------------------------ sample_ SLEEP ; BSF ADCON0, 0 ; Turn on ADC BCF T1CON, 0 ; Stop Timer1 MOVLW 0xFE ; Reset Timer1 MOVWF TMR1H ; MOVLW 0xEF ; MOVWF TMR1L ; BCF PIR1, 0 ; Clear Timer Interrupt BSF T1CON, 0 ; Start Timer1 BSF ADCON0, 1 ; Start ADC SLEEP ; BCF ADCON0, 0 ; Disable ADC BCF PIR1, 6 ; Clear ADC Interrupt BSF PORTA, 2 ; Sample ;------------------------------------------------------------------------------ ; Matched Whitening Filter ; FIR [-1, -3, 3, 8, -7] ;------------------------------------------------------------------------------ CLRF YH ; MOVF X4, 0 ; SUBWF X3, 0 ; MOVWF YL ; BTFSS STATUS, 0 ; DECF YH, 1 ; BCF STATUS, 0 ; RLF YL, 1 ; RLF YH, 1 ; BCF STATUS, 0 ; RLF YL, 1 ; RLF YH, 1 ; MOVF X2, 0 ; ADDWF YL, 1 ; BTFSC STATUS, 0 ; INCF YH, 1 ; MOVF X1, 0 ; SUBWF YL, 1 ; BTFSS STATUS, 0 ; DECF YH, 1 ; BCF STATUS, 0 ; RLF YL, 1 ; RLF YH, 1 ; MOVF X4, 0 ; ADDWF YL, 1 ; BTFSC STATUS, 0 ; INCF YH, 1 ; MOVF X3, 0 ; MOVWF X4 ; MOVF X2, 0 ; ADDWF YL, 1 ; BTFSC STATUS, 0 ; INCF YH, 1 ; MOVWF X3 ; MOVF X1, 0 ; SUBWF YL, 1 ; BTFSS STATUS, 0 ; DECF YH, 1 ; MOVWF X2 ; MOVF ADRES, 0 ; SUBWF YL, 1 ; BTFSS STATUS, 0 ; DECF YH, 1 ; MOVWF X1 ; ;------------------------------------------------------------------------------ ; Standard Deviation Estimate ; Absolute Value ; IIR [255/256, 1] ;------------------------------------------------------------------------------ MOVF ZM, 0 ; Filter SUBWF ZL, 1 ; BTFSS STATUS, 0 ; DECF ZM, 1 ; MOVF ZH, 0 ; SUBWF ZM, 1 ; BTFSS STATUS, 0 ; DECF ZH, 1 ; MOVF YL, 0 ; Absolute Value BTFSC YH, 7 ; GOTO abs1_ ; ADDWF ZL, 1 ; CLRW ; BTFSC STATUS, 0 ; MOVLW 0x01 ; ADDWF ZM, 1 ; BTFSC STATUS, 0 ; INCF ZH, 1 ; MOVF YH, 0 ; ADDWF ZM, 1 ; BTFSC STATUS, 0 ; INCF ZH, 1 ; GOTO abs2_ ; abs1_ SUBWF ZL, 1 ; CLRW ; BTFSC STATUS, 0 ; MOVLW 0x01 ; ADDWF ZM, 1 ; BTFSC STATUS, 0 ; INCF ZH, 1 ; COMF YH, 0 ; ADDWF ZM, 1 ; BTFSC STATUS, 0 ; INCF ZH, 1 ; abs2_ ;------------------------------------------------------------------------------ ; Saturation ; Resets lockout when input is within 1/8 ADC FSC of power rails ;------------------------------------------------------------------------------ MOVF ADRES, 0 ; ADDLW 0x20 ; ADDLW 0xC0 ; MOVF LOCKOUT, 0 ; BTFSS STATUS, 0 ; MOVLW 0x1E ; MOVWF LOCKOUT ; ;------------------------------------------------------------------------------ ; Detect ; Detects beat if 2 seconds have elapsed or if the lockout ; timer has expired and the input exceeds the threshold value ;------------------------------------------------------------------------------ BCF PORTA, 2 ; Hold DECF PERIOD, 1 ; Period BTFSC STATUS, 2 ; GOTO standby_ ; DECFSZ LOCKOUT, 1 ; Lockout GOTO driveLCD_ ; INCF LOCKOUT, 1 ; RLF ZL, 0 ; Threshold RLF ZM, 0 ; 2 Standard Deviations SUBWF YL, 1 ; BTFSS STATUS, 0 ; DECF YH, 1 ; RLF ZM, 0 ; RLF ZH, 0 ; SUBWF YH, 1 ; BTFSC YH, 7 ; GOTO driveLCD_ ; ;------------------------------------------------------------------------------ ; Standby ; Checks for user each time a beat is detected ;------------------------------------------------------------------------------ standby_ MOVLW ADCON0_CH3 ; Configure ADC MOVWF ADCON0 ; BSF ADCON0, 1 ; Start ADC SLEEP ; CLRF ADCON0 ; Disable ADC BCF PIR1, 6 ; Clear ADC Interrupt MOVLW 0x20 ; Check for User SUBWF ADRES, 0 ; BTFSS STATUS, 0 ; GOTO updatePeriod_ ; CLRF LCDA ; Clear LCD CLRF LCDB ; BSF LCDB, 4 ; CLRF LCDC ; BSF LCDC, 2 ; GOTO driveLCD_ ; ;------------------------------------------------------------------------------ ; Update Period ;------------------------------------------------------------------------------ updatePeriod_ INCF T, 1 ; Update T BTFSC T, 3 ; CLRF T ; MOVLW T_MEM ; Update list ADDWF T, 0 ; MOVWF FSR ; ;------------------------------------------------------------------------------ ; Remove Old Period ;------------------------------------------------------------------------------ search3_ MOVF INDF, 0 ; SUBWF S3, 0 ; BTFSS STATUS, 0 ; GOTO search5_ ; search1_ MOVF INDF, 0 ; SUBWF S1, 0 ; BTFSS STATUS, 0 ; GOTO search2_ ; search0_ MOVF INDF, 0 ; SUBWF S0, 0 ; BTFSC STATUS, 0 ; GOTO shift0_ ; GOTO shift1_ ; search2_ MOVF INDF, 0 ; SUBWF S2, 0 ; BTFSC STATUS, 0 ; GOTO shift2_ ; GOTO shift3_ ; search5_ MOVF INDF, 0 ; SUBWF S5, 0 ; BTFSS STATUS, 0 ; GOTO search6_ ; search4_ MOVF INDF, 0 ; SUBWF S4, 0 ; BTFSC STATUS, 0 ; GOTO shift4_ ; GOTO shift5_ ; search6_ MOVF INDF, 0 ; SUBWF S6, 0 ; BTFSC STATUS, 0 ; GOTO shift6_ ; GOTO shift7_ ; shift0_ MOVF S1, 0 ; MOVWF S0 ; shift1_ MOVF S2, 0 ; MOVWF S1 ; shift2_ MOVF S3, 0 ; MOVWF S2 ; shift3_ MOVF S4, 0 ; MOVWF S3 ; shift4_ MOVF S5, 0 ; MOVWF S4 ; shift5_ MOVF S6, 0 ; MOVWF S5 ; shift6_ MOVF S7, 0 ; MOVWF S6 ; shift7_ ;------------------------------------------------------------------------------ ; Insert New Period ;------------------------------------------------------------------------------ MOVF PERIOD, 0 ; SUBLW 0x78 ; MOVWF INDF ; compare3_ SUBWF S3, 0 ; BTFSS STATUS, 0 ; GOTO compare5_ ; compare1_ MOVF INDF, 0 ; SUBWF S1, 0 ; BTFSS STATUS, 0 ; GOTO compare2_ ; compare0_ MOVF INDF, 0 ; SUBWF S0, 0 ; BTFSC STATUS, 0 ; GOTO insert0_ ; GOTO insert1_ ; compare2_ MOVF INDF, 0 ; SUBWF S2, 0 ; BTFSC STATUS, 0 ; GOTO insert2_ ; GOTO insert3_ ; compare5_ MOVF INDF, 0 ; SUBWF S5, 0 ; BTFSS STATUS, 0 ; GOTO compare6_ ; compare4_ MOVF INDF, 0 ; SUBWF S4, 0 ; BTFSC STATUS, 0 ; GOTO insert4_ ; GOTO insert5_ ; compare6_ MOVF INDF, 0 ; SUBWF S6, 0 ; BTFSC STATUS, 0 ; GOTO insert6_ ; GOTO insert7_ ; insert0_ MOVF S6, 0 ; MOVWF S7 ; MOVF S5, 0 ; MOVWF S6 ; MOVF S4, 0 ; MOVWF S5 ; MOVF S3, 0 ; MOVWF S4 ; MOVF S2, 0 ; MOVWF S3 ; MOVF S1, 0 ; MOVWF S2 ; MOVF S0, 0 ; MOVWF S1 ; MOVF INDF, 0 ; MOVWF S0 ; GOTO sum_ ; insert1_ MOVF S6, 0 ; MOVWF S7 ; MOVF S5, 0 ; MOVWF S6 ; MOVF S4, 0 ; MOVWF S5 ; MOVF S3, 0 ; MOVWF S4 ; MOVF S2, 0 ; MOVWF S3 ; MOVF S1, 0 ; MOVWF S2 ; MOVF INDF, 0 ; MOVWF S1 ; GOTO sum_ ; insert2_ MOVF S6, 0 ; MOVWF S7 ; MOVF S5, 0 ; MOVWF S6 ; MOVF S4, 0 ; MOVWF S5 ; MOVF S3, 0 ; MOVWF S4 ; MOVF S2, 0 ; MOVWF S3 ; MOVF INDF, 0 ; MOVWF S2 ; GOTO sum_ ; insert3_ MOVF S6, 0 ; MOVWF S7 ; MOVF S5, 0 ; MOVWF S6 ; MOVF S4, 0 ; MOVWF S5 ; MOVF S3, 0 ; MOVWF S4 ; MOVF INDF, 0 ; MOVWF S3 ; GOTO sum_ ; insert4_ MOVF S6, 0 ; MOVWF S7 ; MOVF S5, 0 ; MOVWF S6 ; MOVF S4, 0 ; MOVWF S5 ; MOVF INDF, 0 ; MOVWF S4 ; GOTO sum_ ; insert5_ MOVF S6, 0 ; MOVWF S7 ; MOVF S5, 0 ; MOVWF S6 ; MOVF INDF, 0 ; MOVWF S5 ; GOTO sum_ ; insert6_ MOVF S6, 0 ; MOVWF S7 ; MOVF INDF, 0 ; MOVWF S6 ; GOTO sum_ ; insert7_ MOVF INDF, 0 ; MOVWF S7 ; ;------------------------------------------------------------------------------ ; Sum Periods ;------------------------------------------------------------------------------ sum_ MOVF S2, 0 ; ADDWF S3, 0 ; MOVWF PERIOD ; MOVF S4, 0 ; ADDWF S5, 0 ; ADDWF PERIOD, 1 ; ;------------------------------------------------------------------------------ ; Divide ; Period must be between 64 and 511 (including carry) ;------------------------------------------------------------------------------ CLRF LOCKOUT ; BTFSC STATUS, 0 ; BSF LOCKOUT, 0 ; BTFSC LOCKOUT, 0 ; RRF PERIOD, 1 ; BTFSC PERIOD, 7 ; BSF LOCKOUT, 1 ; BTFSC LOCKOUT, 1 ; RRF PERIOD, 1 ; BCF PERIOD, 7 ; MOVF PERIOD, 0 ; ADDLW (DIV_TABLE - 0x40) ; MOVWF FSR ; MOVF INDF, 0 ; MOVWF PERIOD ; BCF STATUS, 0 ; BTFSC LOCKOUT, 0 ; RRF PERIOD, 1 ; BCF STATUS, 0 ; BTFSC LOCKOUT, 1 ; RRF PERIOD, 1 ; MOVF PERIOD, 0 ; ;------------------------------------------------------------------------------ ; Update LCD ; W must be between 0 and 199 ;------------------------------------------------------------------------------ BSF STATUS, 5 ; CLRF LCDA ; CLRF LCDB ; ADDLW 0x9C ; BTFSC STATUS, 0 ; BSF LCDA, 5 ; BTFSS LCDA, 5 ; ADDLW 0x64 ; ADDLW 0xB0 ; BTFSC STATUS, 0 ; BSF LCDB, 3 ; BTFSS LCDB, 3 ; ADDLW 0x50 ; ADDLW 0xD8 ; BTFSC STATUS, 0 ; BSF LCDB, 2 ; BTFSS LCDB, 2 ; ADDLW 0x28 ; ADDLW 0xEC ; BTFSC STATUS, 0 ; BSF LCDB, 1 ; BTFSS LCDB, 1 ; ADDLW 0x14 ; ADDLW 0xF6 ; BTFSC STATUS, 0 ; BSF LCDB, 0 ; BTFSS LCDB, 0 ; ADDLW 0x0A ; ADDLW LCD2_TABLE ; MOVWF FSR ; MOVF INDF, 0 ; MOVWF LCDC ; MOVF LCDB, 0 ; ADDLW LCD1_TABLE ; MOVWF FSR ; MOVF INDF, 0 ; MOVWF LCDB ; BTFSC LCDC, 1 ; BSF LCDA, 6 ; CLRF STATUS ; ;------------------------------------------------------------------------------ ; Reset ;------------------------------------------------------------------------------ MOVLW 0x78 ; Reset Period MOVWF PERIOD ; MOVLW 0x14 ; Reset Lockout MOVWF LOCKOUT ; CLRF PORTA ; Clear LCD CLRF PORTB ; CLRF PORTC ; GOTO sample_ ; ;------------------------------------------------------------------------------ ; End of Program ;------------------------------------------------------------------------------ NOP ; END ;