; LIST P = 16C74, F = INHX8M TITLE "Thermometer, RTD rev 1.0" ;********************************************************* ; PROJECT: THCHK REV. 1.0 ; By: Ray Gallant DATE: 11-03-02 ; email: rayg@nb.sympatico.ca ; instant messenger active ; I would like your feedback; positive, negative, foolish, errors, ; typos, concepts, or any other form. Lay it on the line please! ; PROBE = ; PROCESSOR SETUP AS 16C74 ; CLOCK: 4MHz ; PROGRAM CLOCK TYPE = XT ; PROGRAM CODE PROTECTED ; POWER ON TIMER ACTIVE ; CHECK SUM ON MASTER = ; FILE NAME = C:\PROGRAM FLIES\MPLAB\glass.HEX ; PROJECT FILE = C:\PROGRAM FILES\MPLAB\glass.PJT ; MPLAB VER 5.4 ;********************************************************* ;SOFTWARE DETAILS ;********************************************************* ;THERE IS NO SPELL CHECK IN THIS PFE EDITOR! SO PARDON THE TYPOS! ;READ RTD BETWEEN SERVICING THE DISPLAY. AFTER 16 SAMPLES, ;UPDATE THE RESULT. TO MANAGE ANY FLICKERING OF LAST DECIMAL ;POINTED DIGIT. ONLY UPDATE THIS LAST DIGIT DATA TWICE PER SECOND. ;IN SLEEP MODE THE UNIT WILL RETAIN THE USER'S CHOSEN OPTION OF ;Deg C OR F WHICH IS DONE VIA THE C/F MOMEMTARY SWITCH DEPRESSION. ;THE ON/OFF MOMEMTARY SWITCH: THIS SWITCH IS TOGGLED TO POWER UP ;THE UNIT OR TO PUT IT IN SLEEP MODE. ANOTHER REASON FOR THE SLEEP ;MODE, IS THE DATA RETENTION OF THE REGISTER "DEGCF" OF THE USER'S ;LAST Deg C OR F FEATURE SELECTION. ;AN AWAKE FROM SLEEP MODE DOES NOT ERRASE THAT VALUE AND THUS I ;AM NOT REQUIRING AN EXTERNAL SINGLE WORD DATA STORAGE. SCHEME FOR ;Deg C TO Deg F CONVERSION WITHOUT USING DIVIDE ROUTINE IS COMPLETE. ;ALPHA-NUMERICS THAT I CAN PRINT ARE: 0 1 2 3 4 5 6 7 8 9 ; A b c d g h C E F H L P S t ;WORDS INCLUDE: 0FF bAt 0Ut tESt CAL L0 H1 b10 1F PUt ;********************************************************* ;SCOPE CHa & CHb TEST POINTS = LCD PIN 1 & PIN 3 ;********************************************************* ;/////////////////////////////////////////////////////////// ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;********************************************************* ;PORTS CONFIGURATIONS ;********************************************************* ;PORT A - RTD, SHUT DOWN LP2951, DEGREE C/F SWITCH ; 5 4 3 2 1 0 ; | | | | | +---- I - 7893 PIN 5, DATA, PIC PIN 2 ; | | | | +------ O - 7893 PIN 7, CONVERT, PIC PIN 3 ; | | | +-------- O - OUTPUT SHUT DOWN LP2951ACN ; | | +---------- I - VREF PIC A/D, NOT USED, FREE ; | +------------ I - Deg C / Deg F MOMENTARY SWITCH, TOGGLES ; +-------------- O - 7893 PIN 4, CLK ;********************************************************* ;PORT B - INT - ON/OFF (SLEEP) SWITCH, LCD PLANE VOLTAGES, ; 7 6 5 4 3 2 1 0 DATA OUT JUMPER, DATA OUT ; | | | | | | | +---- I - ON/OFF (SLEEP) MOMENTARY SWITCH ; | | | | | | +------ I - FREE ; | | | | | +-------- I - SET = DATA OUT ENABLE JUMPER ; | | | | +---------- O - SINGLE PIN PROTOCOL, DATA OUT ; | | | +------------ O - COM1A - 1K RESISTOR TO LCD-PIN-17 ; | | +-------------- O - COM1B - 1K RESISTOR TO LCD-PIN-17 ; | +---------------- O - COM2A - 1K RESISTOR TO LCD-PIN-1 ; +------------------ O - COM2B - 1K RESISTOR TO LCD-PIN-1 ;********************************************************* ;PORT C - LCD DATA, COLON, 4TH NUMERIC, DEG C/F ICONS, ASYNC ; 7 6 5 4 3 2 1 0 ; | | | | | | | +---- O - 15 COM1-3d, COM2-minus LCD-PIN-7 ; | | | | | | +------ O - 16 COM1-3c, COM2-3b LCD-PIN-14 ; | | | | | +-------- O - 17 COM1-3g, COM2-3a LCD-PIN-13 ; | | | | +---------- O - 18 COM1-3e, COM2-3f LCD-PIN-12 ; | | | +------------ O - 23 COM1-n/c,COM2-Y LCD-PIN-15 ; | | +-------------- O - 24 COM1-Z2, COM2-Z1 LCD-PIN-16 ; | +---------------- I - RX FREE ; +------------------ O - TX FREE ;********************************************************* ;PORT D - LCD DATA, K, 2ND NUMERIC, 3RD NUMERIC, DP ; 7 6 5 4 3 2 1 0 ; | | | | | | | +---- O - 19 COM1-2d, COM2-DP LCD-PIN-11 ; | | | | | | +------ O - 20 COM1-2c, COM2-2b LCD-PIN-10 ; | | | | | +-------- O - 21 COM1-2g, COM2-2a LCD-PIN-9 ; | | | | +---------- O - 22 COM1-2e, COM2-2f LCD-PIN-8 ; | | | +------------ O - 27 COM1-1d, COM2-K LCD-PIN-3 ; | | +-------------- O - 28 COM1-1c, COM2-1b LCD-PIN-6 ; | +---------------- O - 29 COM1-1g, COM2-1a LCD-PIN-5 ; +------------------ O - 30 COM1-1e, COM2-1F LCD-PIN-4 ;********************************************************* ;PORT E - BATTERY MONITOR ; 2 1 0 ; | | +-- I - FREE ; | +---- I - FREE ; +------ I - LP2951ACN BATTERY LOW FEEDBACK ;********************************************************* ;DEGCF REGISTER ; 7 6 5 4 3 2 1 0 ; | | | | | | | +-- COUNTER BO FOR DIGIT BEING SERVICED ; | | | | | | +----- COUNTER B1 FOR DIGIT BEING SERVICED ; | | | | | +-------- SET = DISPLAYING COLON (on old glass only) ; | | | | +----------- SET = DISPLAYING DP (DECIMAL POINT) ; | | | +-------------- SET = IN SLEEP MODE ; | | +----------------- SET = WAS IN BANK1 WHEN INTERRUPTED ; | +-------------------- CLR = DISPLAYING MINUS SIGN ; +----------------------- SET = DISPLAYING DEG F ;********************************************************* ;DSPLAY REGISTER ; 7 6 5 4 3 2 1 0 ; | | | | | | | +-- SET = ; | | | | | | +----- SET = ; | | | | | +-------- SET = ; | | | | +----------- SET = SINGLE PIN XMIT PROTOCOL DATA OUT ; | | | +-------------- SET = INDICATES A NEW VALUE IS AVAILABLE ; | | +----------------- SET = DISPLAY Y ; | +-------------------- SET = ALL DIGIT COMPLETLY DISPLAYED ; +----------------------- SET = 12 BIT A/D 1ST 8 BITS IN ;********************************************************* ;LEADG0 REGISTER MANAGING NOT TO PRINT LEADING ZEROES ; 7 6 5 4 3 2 1 0 ; | | | | | | | +---- - K IS ZERO ; | | | | | | +------ - 1ST DIGIT IS ALSO ZERO ; | | | | | +-------- - 2ND DIGIT IS ALSO ZERO ; | | | | +---------- - ; | | | +------------ - ; | | +-------------- - ; | +---------------- - ; +------------------ - ;********************************************************* ;NMFLAG REGISTER ; 7 6 5 4 3 2 1 0 ; | | | | | | | +---- - CLR = (ACCaHI,ACCaLO = ACCbHI,ACCbHI) ; | | | | | | +------ - CLR = (ACCaHI, ACCaLO = 0) ; | | | | | +-------- - CLR = (ACCbHI, ACCaLO = 0) ; | | | | +---------- - CLR = (ACCaHI, ACCaLO > ACCbHI, ACCbLO) ; | | | +------------ - CLR = (ACCbHI, ACCbLO > ACCaHI, ACCaLO) ; | | +-------------- - ; | +---------------- - ; +------------------ - ;********************************************************* ; THE FOLLOWING PRACTICE IS NOT REQUIRED, BUT HELPFUL FOR TROUBLESHOOTING! ; IT IS IMPORTANT TO HAVE 2 DUPLICATE REGISTERS TO SUPPORT ; THE STORAGE OF PCLATH, STATUS AND WREG, FOR WE WANT TO VERIFY ; WHICH RESISTER BANK WE WILL BE IN WHEN WE GET INTERRUPTED. ; CBLOCK REGISTER ASSIGNMENTS HAS BEEN ADJUSTED SO, TO RECONFIRM. ; THE DATA BOOK MENTIONS THAT PCLATH IS STACKED DURING THE INTERRUPT, ; I AGREE, BUT I STORE IT ANYWAY FOR TROUBLESHOTING PURPOSES. ; DUPLICATE REGISTER IN THE HIGH BANK ARE ISTATH,IWREGH ; WHICH MATCH THE ADDRESS IN THE LOWER BANK (ISTAT,IWREG) ;********************************************************* ; DEFINITION TABLE ;********************************************************* CBLOCK 0x00 ;BANK0 REGISTERS INDF,TMR0,PCL,STATUS,FSR,PORTA,PORTB PORTC,PORTD,PORTE,PCLATH,INTCON,PIR1 PIR2,TMR1L,TMR1H ENDC CBLOCK 0x10 ;BANK0 REGISTERS T1CON,TMR2,T2CON,SSPBUF,SSPCON,CCPR1L CCPR1H,CCP1CON,RCSTA,TXREG,RCREG,CCPR2L CCPR2H,CCP2CON,ADRES,ADCON0 ENDC CBLOCK 0x20 ;A/D, SINGLE PIN COMM, LCD, BATTERY HIBYTE,LOBYTE,PARITY,NETID DIGTHI,DIGTLO,FREE26,FREE27 FREE28,FREE29,TEMP1,BATCNT DCML0,DCML1,DCML2,DCMTMP ENDC CBLOCK 0x30 ;LCD BUFFERS & 5 DIGIT BCD REGs LCDTMP,DEGCF,DSPLAY,LEADG0 HCOM1A,LCOM1A,HCOM2A,LCOM2A DIGITS,WREG0,DCIML0,DCIML1 DCIML2,HBYTE,LBYTE,BCDTMP ENDC CBLOCK 0x40 ;REGs FREE40,FREE41,FREE42,FREE43 FREE44,FREE45,FREE46,FREE47 FREE48,FREE49,FREE4A,FREE4B FREE4C,FREE4D,FREE4E,FREE4F ENDC CBLOCK 0x50 ;PUSH/POP,TMP,TMR1 COUNT FREE50,FREE51,FREE52,FREE53 FREE54,FREE55,FREE56,FREE57 FREE58,FREE59,FREE5A,FREE5B SLOW,IPCLAT,ISTAT,IWREG ENDC CBLOCK 0x60 ;REG's FREE60,FREE61,FREE62,FREE63 FREE64,FREE65,FREE66,FREE67 FREE68,FREE69,FREE6A,FREE6B FREE6C,FREE6D,FREE6E,FREE6F ENDC CBLOCK 0x70 ;REGs FREE70,FREE71,FREE72,FREE73 FREE74,FREE75,FREE76,FREE77 FREE78,FREE79,FREE7A,FREE7B FREE7C,FREE7D,FREE7E,FREE7F ENDC ; ;BANK1 REGISTERS BANK1 REGISTERS BANK1 REGISTERS BANK1 REGISTERS CBLOCK 0x81 ;BANK1 REGISTERS OPTN ;DON'T USE "OPTION", USE OPTN INSTEAD ENDC CBLOCK 0x85 ;BANK1 REGISTERS TRISA,TRISB,TRISC,TRISD,TRISE ENDC CBLOCK 0x8C ;BANK1 REGISTERS PIE1,PIE2,PCON ENDC CBLOCK 0x92 ;BANK1 REGISTERS PR2,SSPADD,SSPSTAT ENDC CBLOCK 0x98 ;BANK1 REGISTERS TXSTA,SPBRG ENDC CBLOCK 0x9F ;ASYNC STORAGE AND FLAGS ADCON1 ENDC CBLOCK 0xA0 ;REGs FREEA0,FREEA1,FREEA2,FREEA3 FREEA4,FREEA5,FREEA6,FREEA7 FREEA8,FREEA9,FREEAA,FREEAB FREEAC,FREEAD,FREEAE,FREEAF ENDC CBLOCK 0xB0 ;REGs FREEB0,FREEB1,FREEB2,FREEB3 FREEB4,FREEB5,FREEB6,FREEB7 FREEB8,FREEB9,FREEBA,FREEBB FREEBC,FREEBD,FREEBE,FREEBF ENDC CBLOCK 0xC0 ;REGs FREEC0,FREEC1,FREEC2,FREEC3 FREEC4,FREEC5,FREEC6,FREEC7 FREEC8,FREEC9,FREECA,FREECB FREECC,FREECD,FREECE,FREECF ENDC CBLOCK 0xD0 ;INTERRUPT TEST REGs, HIGH BANK FREED0,FREED1,FREED2,FREED3 FREED4,FREED5,FREED6,FREED7 FREED8,FREED9,FREEDA,FREEDB FREEDC,FREEDD,ISTATH,IWREGH ENDC CBLOCK 0xE0 ;REGs FREEE0,FREEE1,FREEE2,FREEE3 FREEE4,FREEE5,FREEE6,FREEE7 FREEE8,FREEE9,FREEEA,FREEEB FREEEC,FREEED,FREEEE,FREEEF ENDC CBLOCK 0xF0 ;REGs FREEF0,FREEF1,FREEF2,FREEF3 FREEF4,FREEF5,FREEF6,FREEF7 FREEF8,FREEF9,FREEFA,FREEFB FREEFC,FREEFD,FREEFE,FREEFF ENDC ;********************************************************* ; BIT ASSIGNMENTS & CONSTANTS ;********************************************************* CR EQU 0x0D ;ASCII CARRIER RETURN SP EQU 0x20 ;ASCII SPACE Z EQU 0x02 ;STATUS, ZERO FLAG C EQU 0x00 ;STATUS, CARRY FLAG ;********************************************************* ; MACRO ROUTINES ;********************************************************* BANK0 MACRO BCF STATUS,5 ;SET REGISTER BANK 0 ENDM BANK1 MACRO BSF STATUS,5 ;SET REGISTER BANK 1 ENDM PAAGE0 MACRO CLRF PCLATH ;SELECT 1ST PAGE ENDM PUSH MACRO BCF INTCON,7 ;DISABLE ALL IRQ BCF INTCON,6 MOVWF IWREG ;AFFECTS ZERO FLAG, STORE WORKING REG SWAPF STATUS,W ;IF IT WAS ZERO IT'S STILL ZERO. MOVWF ISTAT ;DUPLICATE REG IN BANK 0 & 1 BCF STATUS,Z ;PRE-CLR ZERO STATUS BIT BTFSC STATUS,5 ;SET = BANK1 BSF STATUS,Z ;SET = WE WERE IN BANK 1 WHEN INTERRUPTED BANK0 BCF DEGCF,5 ;PRE-CLEAR AS => WAS IN BANK0 WHEN INTERRUPTED BTFSC STATUS,Z BSF DEGCF,5 ;SET = WAS IN BANK 1 WHEN INTERRUPTED MOVFW PCLATH MOVWF IPCLAT ;DUPLICATE REG IN BANK 0 & 1 CLRF PCLATH ;6 CYCLES BEFORE CLR ENDM ;********************************************************* ;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ ;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ; *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* ;//////////////// SYSTEM INITIALIZATION \\\\\\\\\\\\\\\\\ ; *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* ;********************************************************* ; PROGRAM VECTOR ASSIGNMENTS ;********************************************************* ORG 0x00 RSTVEC NOP ;GOOD PLACE TO BREAK TO TROUBLESHOOT GOTO START ;RESET VECTOR ;///////////////////////////////////////////////////////// ;********************************************************* ORG 0x04 ;16C74A'S INT VECTOR INTVEC PUSH BTFSC INTCON,1 ;SET = EXT INT, RB0 (ON/OFF SW) HAS OCCURRED GOTO NIGHT NXINT BTFSC PIR1,1 ;TEST FOR TIMER 2 FLAG GOTO TIMMR2 ;SERVICE OTHER INTERRUPTS ; GOTO TTYTYM ;TIMER1 SERVICE ROUTINE ;********************************************************* TTYTYM BTFSS PIR1,0 ;TEST FOR TIMER 1 FLAG GOTO POPPER ;NO MORE INTERRUPTS ACTIVE MOVLW 0x0B ;0BDC = 500ms = TIMMER1 MOVWF TMR1H ;MAY SEED LATER MOVLW 0xDC ; MOVWF TMR1L BCF PIR1,0 ;CLR TMR1F, TIMER1 INT FLAG MOVLW 0x35 ;LOADING TIMER CLRS PRESET MOVWF T1CON ;TIMER1 PRESCALE = 8 BCF PIR1,0 ; GOTO POPPER ; POPPER MOVFW IPCLAT ;ALREADY IN BAN0, FROM BANK 0 MOVWF PCLATH ;NOT FOR NOW RESTORE UPPER PC LATCH BTFSC DEGCF,5 ;USED TO ID ORIGINAL BANK PRE-INTERRUPT BSF STATUS,5 ;SET = WE WERE IN IN BANK 1 WHEN PUSHED SWAPF ISTAT,W ;ISTAT, IWREG ARE DUPLICATED MOVWF STATUS ; IN BANK1 AS ISTATH & IWREG2 SWAPF IWREG,F ;IN SAME LOCATION BUT IN A DIFFERENT BANK SWAPF IWREG,W BSF INTCON,6 ; BSF INTCON,7 ;DONE BY DEFAULTON INT EXIT, ENABLE GLOBAL INT RETFIE NIGHT CLRF INTCON ;READY FOR WAKE UP INTERRUPT BANK1 CLRF PIE1 ;DISABLE MOST INTERRUPTS BANK0 BSF DEGCF,4 ;SLEEP STATUS GOTO POPPER ;RETURN FROM INTERRUPT ; TIMMR2 MOVFW DEGCF ;ONLY BO AND B1 VALID ANDLW 0x03 ;0x02 = DIGIT2, 0x03 = DIGIT1 ADDWF PCL GOTO MODE1A ;0x00 COM1 NORMAL GOTO MODE2A ;0x01 COM2 NORMAL GOTO MODE1B ;0x02 COM1 COMPLEMENT ; GOTO MODE2B ;0x03 COM2 COMPLEMENT ;****************************************************************** ; COM1 & COM2 BACKPLANE VOLTAGE LEVELS ;****************************************************************** ; 1K OHM ;RB4 ----/\/\/\/----| ; 1K OHM |------- LCD PIN 17 COM1 ;RB5 ----/\/\/\/----| ; ; 1K OHM ;RB6 ----/\/\/\/----| ; 1K OHM |------- LCD PIN 1 COM2 ;RB7 ----/\/\/\/----| ;****************************************************************** ;__________________________________________________________________ ;WEIGHT| 8 | 4 | 2 | 1 |___________________________| ; PIN | RB7 | RB6 | RB5 | RB4 | COM1 | COM2 | HEX | ; MODE | COM2B | COM2A | COM1B | COM1A | VOLTAGE | VOLTAGE | VALUE | ;------|-------|-------|-------|-------|---------|---------|-------| ; 1A | 0 | 1 | INPUT | 1 | 3.8 | 1.9 | 5 | ;------|-------|-------|-------|-------|---------|---------|-------| ; 2A | INPUT | 1 | 0 | 1 | 1.9 | 3.8 | 5 | ;------|-------|-------|-------|-------|---------|---------|-------| ; 1B | 0 | 1 | INPUT | 0 | 0 | 1.9 | 4 | ;------|-------|-------|-------|-------|---------|---------|-------| ; 2B | INPUT | 0 | 0 | 1 | 1.9 | 0 | 1 | ;------------------------------------------------------------------ ;******************************************************************* ; ;ALTERNATE DISPLAY VERIFIED ;__________________________________________________________________ ;WEIGHT| 8 | 4 | 2 | 1 |___________________________| ; PIN | RB7 | RB6 | RB5 | RB4 | COM2 | COM1 | HEX | ; MODE | COM1B | COM1A | COM2B | COM2A | VOLTAGE | VOLTAGE | VALUE | ;------|-------|-------|-------|-------|---------|---------|-------| ; 1A | 0 | 1 | INPUT | 1 | 5 | 2.5 | 5 | ;------|-------|-------|-------|-------|---------|---------|-------| ; 2A | INPUT | 1 | 0 | 1 | 2.5 | 5 | 5 | ;------|-------|-------|-------|-------|---------|---------|-------| ; 1B | 0 | 1 | INPUT | 0 | 0 | 2.5 | 4 | ;------|-------|-------|-------|-------|---------|---------|-------| ; 2B | INPUT | 0 | 0 | 1 | 2.5 | 0 | 1 | ;------------------------------------------------------------------ ;******************************************************************* ;NEED 4 PASSES ;a) BOTTOM OF ALL CHARACTERS, COM1A HI BYTE (HCOM1A) & LO BYTE (LCOM1A) ;b) TOP OF ALL CHARACTERS, COM1A HI BYTE (HCOM2A) & LO BYTE (LCOM2A) ;c) BOTTOM OF ALL CHARACTERS, COMPLEMENTED COM1A HI BYTE (HCOM1A -N) & ; LO BYTE (LCOM1A -N) ;d) TOP OF ALL CHARACTERS, COM1A HI BYTE (HCOM2A -N) & LO BYTE (LCOM2A -N) ; MODE2B MOVLW 0x06 ADDWF BATCNT ;USED IN BATTERY LO ROUTINE TO BLINK DISPLAY BCF DEGCF,0 ;PRESET FOR NEXT PASS 0x00 MODE1A BCF DEGCF,1 ;COM2B COMF HCOM2A,W ;FD COMPLEMENT THE DATA MOVWF PORTD COMF LCOM2A,W ;DC MOVWF PORTC BANK1 BCF TRISB,5 ;MAKE IT AN OUTPUT BANK0 BCF PORTB,6 BANK1 BSF TRISB,7 ;RB7 IS HI MAKE RB7 INPUT, HI-Z BANK0 BSF PORTB,4 GOTO BYELCD ; MODE1A BSF DEGCF,0 ;PRESET FOR NEXT PASS 0x01 MODE2A BCF DEGCF,1 ; MOVFW HCOM1A ;98 DATA NORMAL MOVWF PORTD MOVFW LCOM1A ;08 MOVWF PORTC BANK1 BSF TRISB,5 ;MAKE RB5 INPUT, HI-Z BCF TRISB,7 ;MAKE IT AN OUTPUT, IT SHOULD ALREADY BE RB7=LO GOTO UTILX ; MODE2A BCF DEGCF,0 ;PRESET FOR NEXT PASS 0x02 MODE1B BSF DEGCF,1 MOVFW HCOM2A ;02 DATA NORMAL MOVWF PORTD MOVFW LCOM2A ;23 MOVWF PORTC BANK1 BSF TRISB,7 ;MAKE RB5 INPUT, HI-Z BCF TRISB,5 ;MAKE IT AN OUTPUT, IT SHOULD ALREADY BE RB7=LO UTILX BANK0 BSF PORTB,4 BSF PORTB,6 BYELCD BCF PORTB,7 ; BCF PORTB,5 BCF PIR1,1 ;CLR TMR2IF, TIMER2 INT FLAG GOTO POPPER ;RETURN FROM INTERRUPT ; MODE1B BSF DEGCF,0 ;PRESET FOR NEXT PASS 0x03 MODE2B BSF DEGCF,1 ; COMF HCOM1A,W ;67 COMPLEMENT THE DATA MOVWF PORTD COMF LCOM1A,W ;F7 COMPLEMENTING BOTTOM HALF OF CHARACTERS MOVWF PORTC BANK1 BCF TRISB,7 ;MAKE IT AN OUTPUT BANK0 BCF PORTB,4 BANK1 BSF TRISB,5 ;MAKE RB5 INPUT, HI-Z BANK0 BSF PORTB,6 ;ALREADY SET GOTO BYELCD ;********************************************************* ; CONFIGURE I/O's ;********************************************************* START CLRF INTCON ;DIS GLOBAL/PERIPH/INT/TIMER PG14 MOVLW 0x4F MOVWF BCDTMP ;ADDITIONAL POWER UP DELAY SO LCD CAN BLEED ; MOVLW HIGH DOIOS ;KEEP INIT ROUTINES IN UPPER MEM ; MOVWF PCLATH CALL DOIOS ;INITIALIZE PIC CFG ; PAAGE0 BANK0 MOVLW 0x40 MOVWF DSPLAY MOVLW 0x00 ;DISPLAY ZEROES INSTEAD MOVWF HCOM1A ;POWER ON DISPLAY ALL SEGMENTS MOVWF HCOM2A MOVWF LCOM1A MOVWF LCOM2A BSF DSPLAY,6 ;SET = ALL DIGIT STATUS, WERE COMPLETLY PRINTED ;FOR DEMO ONLY, DON'T PRINT MIMUS SIGN BSF DEGCF,6 ;CLR = PRINT MINUS SIGN = WAS DEFAULT ;********************************************************* ; \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ ; /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ;*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* ; OPERATING PROGRAM & ALGORYTHM ;*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* ;********************************************************* RUN CLRF PCLATH ;ARE WE GOING TO SLEEP? BTFSS DEGCF,4 ;SET = IN SLEEP MODE GOTO BATEST ;TEST BATTERY BANK1 CLRF PIE1 ;DISABLE MOST INTERRUPTS MOVLW 0xFF MOVWF TRISB ;NOTE PREVIOUS CLRF PORTB, ALL LINE TO LCD ARE LO MOVWF TRISD MOVWF TRISC BSF TRISA,5 ;CHANGE TO INPUT FOR CURRENT CONSUMPTION BANK0 CLRF PIR1 ;ALL FLAG ARE CLEARED BCF PORTA,1 ;CONVST=LO 5.5us REQUIRED FOR SAMPLING BSF PORTA,2 ;SHUT DOWN ANALOG POWER SUPPLIES BCF T2CON,2 ;TURN TIMER2 OFF BCF T1CON,0 ;TURN TIMER1 OFF CALL DELAY CALL DELAY MOVLW 0x50 ;NO GIE (INTCON,7 BUT MUST HAVE PERIPHERAL ; ;ENABLE INTERRUPT & EXT INT ENABLE BIT ; ;TO WAKEUP FROM EXT INT. MOVWF INTCON ;WILL CONTINUE WITH INSTRUCTIONS FOLLOWING "SLEEP" SLEEP NOP GOTO RSTVEC ;1ST INSTRUCTION AFTER AWAKE FROM SLEEP! ;RESTART UNIT ; DELAY CLRF PCLATH MOVLW 0xFF ;USED AS DEBOUCE TIMING MOVWF TEMP1 ;ABOUT 200ms WEIST DECFSZ BCDTMP GOTO WEIST ;READY FOR WAKE UP INTERRUPT DECFSZ TEMP1 GOTO WEIST RETURN ;********************************************************* ;OMITTED FOR THIS DEMO TESTING THE BATTERY ;********************************************************* BATEST ; BTFSC PORTE,2 ; ; GOTO BATOK ;BATLOW MOVFW BATCNT ;WAS 0x20 ; SUBLW 0x7F ;THAT'S 0x80 - BATCNT ; BTFSC STATUS,C ;SET = W > BATCNT ; GOTO BLINK ; MOVLW 0x01 ;ALPHA b & A ; MOVWF HCOM1A ; MOVLW 0x71 ;DON'T PRINT DP ; MOVWF HCOM2A ;DON'T PRINT K ; MOVLW 0xF9 ;ALPHA "t" ; MOVWF LCOM1A ; MOVLW 0xFD ; ; MOVWF LCOM2A ;BYLOW BSF DSPLAY,4 ;INDICATES A NEW VALUE IS AVAILABLE ; GOTO RUN ; ;BLINK MOVLW 0xFF ;BATTERY LOW INDICATION FLASH ; MOVWF LCOM1A ; MOVWF LCOM2A ; MOVWF HCOM1A ; MOVWF HCOM2A ; GOTO BYLOW ; BATOK ; BTFSS PORTB,2 ;CIRCUIT WHICH MONITORS THE BATTERY ; GOTO UUTING BTFSC DEGCF,4 ;SET = WILL BE GOING IN SLEEP MODE GOTO UUTING BSF T1CON,0 ;ENABLE TIMER1 BANK1 BSF PIE1,0 ;ENABLE TIMER1 INTERRUPT BANK0 ; CALL A2DDMP ;TRANSMIT TEMPERATURE VALUE TO DATA LOG GOTO OUTING ;********************************************************* ; LCD CHARACTER TABLE FOR COM1 ;MAKE SURE YOU DON'T CROSS BOUNDRIES HERE! ;SPECIAL NOTE: DO COMF INSTRUCTION OF THIS TABLE FOR COM2 TABLE ;********************************************************* LCDMAP ADDWF PCL ;THIS IS AT BEGINING OF 1ST PAGE! RETLW 0x40 ; 0 0 HI NIBBLE = COM1, LO NIBBLE = COM2 RETLW 0xDC ; 1 1 RETLW 0x28 ; 2 2 RETLW 0x88 ; 3 3 RETLW 0x94 ; 4 4 RETLW 0x82 ; 5 5 RETLW 0x02 ; 6 6 RETLW 0xD8 ; 7 7 RETLW 0x00 ; 8 8 RETLW 0x90 ; 9 9 RETLW 0x10 ; A RETLW 0x06 ; b RETLW 0x2E ; c RETLW 0x22 ; E RETLW 0x32 ; F RETLW 0x80 ; g RETLW 0x16 ; h RETLW 0xDE ; i RETLW 0x0E ; o RETLW 0x30 ; P RETLW 0x36 ; t RETLW 0x4E ; u RETLW 0xFC ;BLANK DIGIT ; UUTING BANK1 BCF PIE1,0 ;DISABLE TIMER1 INTERRUPT BANK0 BCF T1CON,0 ;DISABLE TIMER1 OUTING BTFSS PORTA,4 ;HAS 10OK PULL DOWN, SET = TOGGLE Deg C/F GOTO RDA2D ; GETOFF BTFSC PORTA,4 ;LOOK FOR KEY RELEASE GOTO GETOFF ;WAITING FOR SWITCH TO BE RELEASED TOGGLE BTFSC DEGCF,7 GOTO FME BSF DEGCF,7 ;DEG F GOTO RDA2D FME BCF DEGCF,7 ;DEG C ; GOTO RDA2D ;********************************************************* ;EXAMPLE 91.0 Deg C = 195.8 Deg F ;********************** ;1.0 IS UNITS FROM THE LOCKUP TABLE ;9 IS HUNDREDS AND WAS PRE-EVALUATED FROM THE A/D RAW DATA RESULTS DUE TO ;IT'S VALUE IN THE DECADE RANGE. SO AT THE A/D PROCESS WE STORED NUMERICAL 9 ;IN A MULTI-PURPOSE REGISTER CALLED DIGTLO. ; ;IN OTHER WORDS ALL THAT'S INCLUDES IN MY LOOKUP TABLE IS THE UNITS (STORED AS UNIT * 10) ;THIS SCHEME MAKES MY TABLE SHORTER AND OFFER MUCH MORE POINTS. THE TABLE ;INCREMENT AT 0.1 DEGREE. SO TO RECOMPOSE MY VALUE, (9 * 100), THEN ADD (1.0 * 10) ;WHICH FINALLY RESULTS AS 910. WITH EXTREME ACCURACY THE NUMBER IS ;MATHEMATICALLY CONVERTED WITH A ROUTINE CALLED C2F (OMITTED HERE FOR DEMO) ;WHICH RESULTS IN Deg F WITH A VALUE IN THIS CASE OF 19580 OR 4C7C WHICH ;REALLY REPRESENTS 195.8 Deg F. THIS SAME C2F ROUTINE FULLY SUPPORTS ;NEGATIVE TEMPERATURE VALUES ALSO. ;FROM THE BDC ROUTINE I SHOULD HAVE ; 1 5 9 0 8 ;DCIML0-->;FIRST DIGIT ;DCIML1-->;DIGIT 3 & 2 ;DCIML2-->;DIGIT 5 & 4 ; ;LO NIB ;HI NIB & LO NIB ;HI NIB & LO NIB ; ;*******NOTE CAREFULLY! THE LAST NIBBLE OF DCIML2 IS NOT UTILIZED SINCE THE VALUES ;*******WHERE ORIGINALLY MULTIPLY BE 10.0 AS SEEN ABOVE AS SHOULD ALWAYS BE ZERO. ; ;********************************************************* ;THE FOLLOWING SMALL TEST ROUTINE SIMULATES: A/D OF RAW RTD, DECADE ;AND HUNDRED STORAGE, UNIT PART OF THE NUMBER TABLE LOOKUP, THEN COMPOSING ;THE RESULTING Deg C VALUE, AND CONVERTING THIS Deg C VALUE TO Deg F ;PRECISELY DUE TO USER'S DEPRESSION OF THE Deg C/F MOMEMTARY SWITCH FEATURE. ;********************************************************* RDA2D MOVLW 0x4C ;TEST VALUE, 91 Deg C or 195.8 Deg F MOVWF HBYTE MOVLW 0x7C MOVWF LBYTE ;********************************************************* ; CONVERSION OF 2 HEX BYTES (65536 MAX) TO 5 DIGIT ; BCD NUMBERS WHERE DCIML0 = MSD. Mem= 29, CYCLES = 776 ; WREG0,DCIML0,DCIML1,DCIML2,HBYTE,LBYTE MUST BE IN SEQUENCIAL ORDER ; IN REGISTER MAP. BCDTMP IS PREVIOUSLY PRELOADED WITH 16.0 ;********************************************************* BCD MOVLW 0x10 ;16.0 MOVWF BCDTMP ;PRELOAD TMP REG CLRF DCIML2 ;DIGIT 4 & 5 CLRF DCIML1 ;DIGIT 3 & 2 CLRF DCIML0 ;FIRST DIGIT BCF STATUS,C ;CONDITION CARRY BCDLP RLF LBYTE ;LSB HEX RLF HBYTE ;MSB HEX RLF DCIML2 ;DIGIT 5 & 4 RLF DCIML1 ;DIGIT 3 & 2 RLF DCIML0 ;FIRST DIGIT CLRZ DECFSZ BCDTMP ;=DCFSNZ TO MORBCD GOTO MORBCD GOTO ENDBCD ; MORBCD MOVLW DCIML0 ; MOVWF FSR ;0x3A DCIML0'S ADDRESS TO FSR ADJBCD MOVFW INDF ;ADJUST DCIML2 TO BCD ADDLW 0x03 ;CHECKING LS NIBBLE MOVWF WREG0 ;W VALUE = BCDTMP VALUE BTFSC WREG0,3 ;IS 4TH DIGIT > 7 MOVWF INDF ;SAVE AS 4TH DIGIT MOVFW INDF ;INDF = ORGINAL INDF OR ORGINAL INDF + 0x03 ADDLW 0x30 ;CHECKING MS NIBBLE MOVWF WREG0 ;W VALUE = BCDTMP VALUE BTFSC WREG0,7 ;IS 5TH DIGIT > 7 MOVWF INDF ;SAVE AS 5TH DIGIT INCF FSR ;CONTINUE CONVERSION WITH NEXT MOVLW HBYTE ; HEX BYTE CLRC CLRZ ; SUBWF FSR,W ; BTFSC STATUS,Z ;CHECKING IF DCIML2 (DIGIT 4 & 5) GOTO BCDLP ;HBYTE IS = & NOT BIGGER THAN FSR GOTO ADJBCD ;HYBYTE IS BIGGER THAN FSR ; ENDBCD BTFSS DSPLAY,6 ;SET = ALL DIGIT WERE COMPLETLY PRINTED GOTO RUN ; ; ;DO WE HAVE TIME TO UPDATE THE LCD DATA BUFFERS BEFORE THE TIMER EXPIRES????? ;********************************************************* ; DATA REFRESH RATE ;********************************************************* TYMEOK MOVFW TMR2 ;THAT'S 0x1D - PR2. NEED ABOUT 100us TO LOAD LCD BUFFERS SUBLW 0x1C ;(ONE LESS) = 0x1D = 19.0 = PR2 SEED BTFSS STATUS,C ;MAKE SURE YOU HAVE TIME BEFORE LCD NEEDS UPDATE GOTO RUN ;NO TIME TO RISK UPDATE, NEED ABOUT DECFSZ SLOW ;LCD DATA REFRESH RATE GOTO RUN ;INCR OR DECR TO CONTROL LCD DATA REFRESH TIME MOVLW 0x2F ;WE ARE DOING A LOT LESS WORK IN THIS DEMO! MOVWF SLOW ;WAS 0x2F IN FULL PROGRAM! 50ms MINIMUM MOVFW DCIML0 ;FROM BCD ROUTINE, BCD FIRST DIGIT MOVWF DCML0 ;LCD TABLE READY BUFFERS MOVFW DCIML1 ;FROM BCD ROUTINE, BCD DIGIT 2 & 3 MOVWF DCML1 ;LCD TABLE READY BUFFERS MOVWF HIBYTE ;ALSO READY FOR COMM IN DEG C ONLY MOVFW DCIML2 ;FROM BCD ROUTINE, BCD DIGIT 4 & 5 MOVWF DCML2 ;LCD TABLE READY BUFFERS MOVWF LOBYTE ;ALSO READY FOR COMM IN DEG C ONLY ; ;LOADING GLASS REGISTERS LOADING GLASS REGISTERS LOADING GLASS REGISTERS ;LOADING GLASS REGISTERS LOADING GLASS REGISTERS LOADING GLASS REGISTERS ; ;PREPARING ACTUAL LCD DATA DERIVED ;FROM BCD TO LCD TABLE READY BUFFERS TO DATA READY FOR I/O PINS. ;MUST FILL ORDERL & ORDERH REGISTERS WITH 14 BITS OF DATA FOR I/O PINS TO LCD ;WITH K, 1ST DIGIT, 2ND DIGIT, DECIMAL POINT DIGIT, ICONS (DP, - SIGN, Deg C or F) ;SPECIAL NOTES:IN THIS APPLICATION THE MOST SIGNIFICANT DIGIT IS ALWAYS 1.0 OR 0.0. ;(AGAIN) THE VALUE OFFERED TO THE BCD ROUTING WAS PREVIOUSLY MULTIPLIED ; BY 100.0. SO 1958 LOOK LIKE 19580. (19580 SIGNIFIES 195.8) ; ;IN THIS APPLICATION THE 1ST NUMERIC DOES NOT REQUIRE A SPOT IN THE LCD MAP LOOKUP ;TABLE SINCE IT IS "K" SEGMENT ON THE DISPLAY. IT'S EASIER TO HANDLE IT MANUALLY. ;******************************************************************* ;COM1A COM1A COM1A COM1A COM1A COM1A COM1A COM1A COM1A COM1A COM1A ;UPPER NIBBLE UPPER NIBBLE UPPER NIBBLE UPPER NIBBLE UPPER NIBBLE ;WILL BE USING HERE, BCD REGs AS GENERAL PURPOSE REGs/BUFFERS ;BDCTMP INTO HCOM1A ;DCMIL0 INTO HCOM2A ;DCMIL1 INTO LCOM1A ;DCMIL2 INTO LCOM2A ;******************************************************************* DIG1ME CLRF LEADG0 ;USING 19580 Deg F AS EXAMPLE SWAPF DCML1,W ;GET THE "9" ANDLW 0x0F CALL LCDMAP ;HI NIBBLE SEARCH IN HI NIBBLE RESULT MOVWF LCDTMP MOVLW 0x40 SUBWF LCDTMP,W BTFSC STATUS,Z ;SET = 0 BSF LEADG0,1 ;LEADING ZERO STATUS KTHER MOVFW LCDTMP ANDLW 0xF0 ;MASK HI NIBBLE MOVWF BCDTMP ;STORE IN HCOM1A LATER ; SWAPF LCDTMP,W ANDLW 0xF0 D1IS0 MOVWF DCIML0 ;C0 STORE IN HCOM2A LATER ; DIG2ME MOVFW DCML1 ;GET THE "5" ANDLW 0x0F CALL LCDMAP MOVWF LCDTMP MOVLW 0x40 SUBWF LCDTMP,W BTFSC STATUS,Z ;SET = 0 BSF LEADG0,2 ;LEADING ZERO STATUS SWAPF LCDTMP,W ANDLW 0x0F IORWF BCDTMP ;STORE IN HCOM1A LATER ; MOVFW LCDTMP ANDLW 0x0E ;0C WAS 0x0F, NOW DEFAULT DP ON IORWF DCIML0 ;STORE IN HCOM2A LATER ; DIG3ME SWAPF DCML2,W ;GET THE "8" ANDLW 0x0F ;HI NIBBLE SEARCH IN HI NIBBLE RESULT CALL LCDMAP MOVWF LCDTMP ANDLW 0x0E ;UPPER NIBBLE IS CLEARED MOVWF DCIML2 ;STORE IN LCOM2A LATER ; SWAPF LCDTMP,W ANDLW 0x0F ;UPPER NIBBLE IS CLEARED MOVWF DCIML1 ;STORE IN LCOM1A LATER ; KME BCF DCIML0,4 ;PRECLR K AS NO K, STORE IN HCOM2A LATER MOVFW DCML0 ;GET THE "1" (IN DIGIT 1 COM2 SECTION OF CHARACTER MAP) BTFSS STATUS,Z ;SET = DCML0 = 0 GOTO SIGNME BSF DCIML0,4 ;NO K, STORE IN HCOM2A LATER BSF LEADG0,0 ;LEADING ZERO STATUS SIGNME ;ALREADY CLEARED ABOVE BCF LCOM2A,0 BTFSC DEGCF,6 ;CLR = PRINT MINUS SIGN = DEFAULT ; ;TEST OF OLD GLASS. HERE WE PRETEND THAT THE COLON SEGMENT IS THE MINUS SEGMENT ;SINCE THIS OLD GLASS IS NOT CUTOMIZED FOR THE MINUS SIGN YET! NEW GLASS ON THE WAY ; BSF DCIML2,0 ;SET = DON'T PRINT MINUS SIGN, PRINT COLON INSTEAD FOR NOW ; ;STORE IN LCOM2A LATER WHYEME BCF DCIML2,4 ;PRINT DEGREE OR Y ALWAYS FOR THIS APPLICATION FORCME ;STORE IN LCOM2A LATER ;;;ALREADY CLEARED ABOVE BCF LCOM2A,4 ;NO DEGREE OR Y BTFSC DEGCF,7 ;SET = DISPLAY Deg F GOTO FFYNG BSF DCIML2,5 ;2D Z1 OFF, STORE IN LCOM2A LATER ;;;ALREADY CLEARED ABOVE BCF LCOM1A,5 ;Z2 ON, IS ALREADY AT SET STATUS GOTO BYDSPL ; FFYNG BSF DCIML1,5 ;Z2 OFF, STORE IN LCOM1A LATER ;;;ALREADY CLEARED ABOVE BCF LCOM2A,5 ;Z1 ON, IS ALREADY AT SET STATUS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;CHECK LEADING ZEROS;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BYDSPL BTFSS LEADG0,0 ;SET = WE ARE PRINTING "K", (1) GOTO BIDSPL BTFSS LEADG0,1 ;SET = FULL DIGIT 1 IS = 0, (9) GOTO BIDSPL MOVLW 0xF0 ;BLANK 1ST DIGIT IORWF BCDTMP ;MAKE UPPER NIBBLE = F, STORE IN HCOM1A LATER IORWF DCIML0 ;K IS ALREADY SET IF YOUR HERE, STORE IN HCOM2A LATER BTFSS LEADG0,2 ;SET = FULL DIGIT 2 IS = 0, (5) GOTO BIDSPL MOVLW 0x0F ;BLANK 2ND DIGIT IORWF BCDTMP ;MAKE LOWER NIBBLE = F, STORE IN HCOM1A LATER MOVLW 0x0E ;DON'T TOUCH DP STATUS, ON ALL THE TIME! IORWF DCIML0 ;STORE IN HCOM2A LATER ;DISABLE TIMER2 TEMPORARY TO AVOID ANY LCD FLICKERING FROM WRONG BUFFER DATA BIDSPL BANK1 BCF PIE1,1 ;DISABLE TIMER 2 INT BANK0 MOVFW BCDTMP ;TRANSFER BUFFERS MOVWF HCOM1A MOVFW DCIML0 MOVWF HCOM2A MOVFW DCIML1 MOVWF LCOM1A MOVFW DCIML2 MOVWF LCOM2A BANK1 BSF PIE1,1 ;ENABLE TIMER 2 INT BANK0 BSF DSPLAY,4 ;INDICATES A NEW VALUE IS AVAILABLE GOTO RUN ;DONE ;********************************************************* ; TEMPERATURE IS BEYOND SPEC'ED POSITIVE & MINUS RANGES ;********************************************************* RNGOUT BANK1 BCF PIE1,1 ;DISABLE TIMER 2 INT BANK0 MOVLW 0x04 ; MOVWF HCOM1A MOVLW 0xFF ;NO D.P., NO K MOVWF HCOM2A MOVLW 0xF9 ;ALPHA "Out" MOVWF LCOM1A MOVLW 0xFD ;WAS 0D MOVWF LCOM2A BANK1 BSF PIE1,1 ;ENABLE TIMER 2 INT BANK0 MOVLW 0x99 MOVWF HIBYTE ;INDICATE OVER TEMP & UNDER TEMP MOVLW 0x90 MOVWF LOBYTE BYOUT BSF DSPLAY,4 ;INDICATES A NEW VALUE IS AVAILABLE GOTO RUN ;TEMPERATURE OUT OF RANGE INDICATION! ;********************************************************* ; DON'T PRINT ICONS FOR WORD MESSAGES ;********************************************************* NOICON BSF LCOM2A,4 ;NO DEGREE OR Y BSF LCOM1A,5 ;NO Z2 BSF LCOM2A,5 ;NO Z1 GOTO BYDSPL ;********************************************************* ;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ ;///////////////////////////////////////////////////////// ;********************************************************* ; GLASS TID-BITS ;********************************************************* ;WHEN VCC = 5.0VDC, TO HELP UNDERSTAND THE STATIC CONDITION, ;WE CAN ALWAYS ASK THE QUESTION: WHAT POTENTIAL IS ACROSS THE ;SEGEMENT BIT. THE ANSWER WHEN USING TTL/RESISTOR DIVIDER STYLE ;DRIVING IS 2.5V WHILE ON AND 0 WHILE OFF. THIS RULE MUST ALWAYS ;APPLY. NOTE THAT THE POTENTIAL DIFFERENCE BETWEEN EACH BACKPLANE ;IS ALWAYS 2.5V. ; ;DURING TIMER INTERRUPT, MANAGE FRAME RATE, 1/2 BIAS, 1/2 DC. ;FRAME RATE = 50Hz; 1/50Hz = 20ms, SO EACH DIGIT REQUIRES TO BE UPDATE ;EVERY 20MS. 3 1/2 DIGITS AS WELL AS ICON MEANS FOUR SEGMENT COMPLEMENT ;OR FOUR SECTIONS WHICH NEED TO BE REFRESHED 5ms APART. FOUR BUFFER ;REGISTERS HOLD THE LCD DATA ALL DERIVED FROM THE TABLE BELOW. EVERY 5ms ;A DIFFERENT SEGMENT COMPLEMENT GETS UPDATED. TWO BACKPLANES x FOUR SEGMENT ;COMPLEMENTS. REGISTER NAMES CHOSEN FOR THESE SEGMENT COMPLEMENT BUFFERS ARE ;LCOM1A, HCOM1A, LCOM2A, HCOM2A ;NOTE THAT VCC ON THIS LAST DESIGN IS 3.8VDC SO 1/2 BIAS IS 1.9VDC. ;****************************************************************** ; DISPLAY CHARACTER BIT [ALSO SEE CHARACTER MAP, (LCDMAP)] ;****************************************************************** ; ; DIGIT1 HI NIB DIGIT1 LO NIB ; IN IN ; HCOM1A /\ HCOM2A /\ ;....................... HI NIB / \ HI NIB / \ ; (18xXxXx) . ______/COM2\_____ ______/COM1\_____ ; K & 1ST DIGIT . / \ / \ ;.......................|---------:---------|:|---------:---------| ; | LCD PIN# | 4 | 5 | 6 | 3 |:| 4 | 5 | 6 | 3 | ;...........| BIT | B7 | B6 | B5 | B4 |:| B7 | B6 | B5 | B4 | ; | PIC-I/O | RD7| RD6| RD5| RD4|:| RD7| RD6| RD5| RD4| ; DISPLAY | SEGMENT | 1e | 1g | 1c | 1d |:| 1f | 1a | 1b | K | ; CHARACTER | HEX | | | | |:| | | | | ;___________|___________|____|____|____|____|:|____|____|____|____| ; 0 | 0x40 | 0 | 1 | 0 | 0 |:| 0 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; 1 | 0xDC | 1 | 1 | 0 | 1 |:| 1 | 1 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; 2 | 0x28 | 0 | 0 | 1 | 0 |:| 1 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; 3 | 0x88 | 1 | 0 | 0 | 0 |:| 1 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; 4 | 0x94 | 1 | 0 | 0 | 1 |:| 0 | 1 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; 5 | 0x82 | 1 | 0 | 0 | 0 |:| 0 | 0 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; 6 | 0x02 | 0 | 0 | 0 | 0 |:| 0 | 0 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; 7 | 0xD8 | 1 | 1 | 0 | 1 |:| 1 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; 8 | 0x00 | 0 | 0 | 0 | 0 |:| 0 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; 9 | 0x90 | 1 | 0 | 0 | 1 |:| 0 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; A | 0x10 | 0 | 0 | 0 | 1 |:| 0 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; c | 0x2E | 0 | 0 | 1 | 0 |:| 1 | 1 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; E | 0x22 | 0 | 0 | 1 | 0 |:| 0 | 0 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; F | 0x32 | 0 | 0 | 1 | 1 |:| 0 | 0 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; g | 0x80 | 1 | 0 | 0 | 0 |:| 0 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; h | 0x16 | 0 | 0 | 0 | 1 |:| 0 | 1 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; i | 0xDE | 1 | 1 | 0 | 1 |:| 1 | 1 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; o | 0x0E | 0 | 0 | 0 | 0 |:| 1 | 1 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; P | 0x30 | 0 | 0 | 1 | 1 |:| 0 | 0 | 0 | X | ;-----------|-----------|-------------------|:|-------------------| ; t | 0x36 | 0 | 0 | 1 | 1 |:| 0 | 1 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; u | 0x4E | 0 | 1 | 0 | 0 |:| 1 | 1 | 1 | X | ;-----------|-----------|-------------------|:|-------------------| ; BLANK | 0xFC | 1 | 1 | 1 | 1 |:| 1 | 1 | 1 | X | ;------------------------------------------------------------------ ;****************************************************************** ; DIGIT2 HI NIB DIGIT2 LO NIB ; IN IN ; HCOM1A /\ HCOM2A /\ ;....................... LO NIB / \ LO NIB / \ ; (XXx8.Xx) . ______/COM2\_____ ______/COM1\_____ ; 2ND DIGIT & DP . / \ / \ ;.......................|---------:---------|:|---------:---------| ; | LCD PIN# | 8 | 9 | 10 | 11 |:| 8 | 9 | 10 | 11 | ;...........| BIT | B3 | B2 | B1 | B0 |:| B3 | B2 | B1 | B0 | ; DISPLAY | PIC-I/O | RD3| RD2| RD1| RD0|:| RD3| RD2| RD1| RD0| ; CHARACTER | SEGMENT | 2e | 2g | 2c | 2d |:| 2f | 2a | 2b | DP | ;___________|___________|___________________|:|___________________| ; SAME TABLE AS ABOVE SAME TABLE AS ABOVE SAME TABLE AS ABOVE| ;------------------------------------------------------------------ ;****************************************************************** ; DIGIT3 HI NIB DIGIT3 LO NIB ; IN IN ; LCOM1A /\ LCOM2A /\ ;....................... LO NIB / \ LO NIB / \ ; (XX:Xx8x) . ______/COM2\_____ ______/COM1\_____ ; 3RD DIGIT & COLON . / \ / \ ;.......................|---------:---------|:|---------:---------| ; | LCD PIN# | 12 | 13 | 14 | 7 |:| 12 | 13 | 14 | 7 | ;...........| BIT | B3 | B2 | B1 | B0 |:| B3 | B2 | B1 | B0 | ; DISPLAY | PIC-I/O | RC3| RC2| RC1| RC0|:| RC3| RC2| RC1| RC0| ; CHARACTER | SEGMENT | 3e | 3g | 3c | 3d |:| 3f | 3a | 3b | col| ;___________|___________|___________________|:|___________________| ; SAME TABLE AS ABOVE SAME TABLE AS ABOVE SAME TABLE AS ABOVE| ;------------------------------------------------------------------ ;****************************************************************** ; LCOM1A /\ LCOM2A /\ ;....................... HI NIB / \ HI NIB / \ ; (XXxXxXF) . ______/COM2\_____ ______/COM1\_____ ; Degree, C, F Icons . / \ / \ ;.......................|---------:---------|:|---------:---------| ; | LCD PIN# | 16 | 15 | |:| 16 | 15 | | ;...........| BIT | B5 | B4 | |:| B5 | B4 | | ; DISPLAY | PIC-I/O | RC5| RC4| |:| RC5| RC4| | ; CHARACTER | SEGMENT | Z2 | | |:| Z1 | Y | | ;___________|___________|___________________|:|___________________| ;Degree C | | 1 | X | |:| 0 | 0 | | ;-------------------------------------------|:|-------------------| ;Degree F | | 0 | X | |:| 1 | 0 | | ;------------------------------------------------------------------ ;****************************************************************** ;EXAMPLE: PRINTING 195.8 deg C (14 DATA BITS REQUIRED) ;1 IS K, 9 IS THE 1ST DIGIT, 5 IS THE 2ND DIGIT, 8 IS THE 3RD DIGIT ;FIND BIT PATTERN FROM TABLE. ;K, DP, MINUS, DEG, C, F ARE MANUALLY MANAGED. ; ;******************************************************************* ;COM1A THE 1ST BACKPLANE COM1A COM1A THE 1ST BACKPLANE COM1A ;******************************************************************* ;COM1A | RD7| RD6| RD5| RD4|| RD3| RD2| RD1| RD0| ;a) FIND HI NIBBLE FOR 9 ; 9 | 0x90 | 1 | 0 | 0 | 1 |:| 0 | 0 | 0 | X | ;b) MASK HI NIBBLE | 1 | 0 | 0 | 1 |:| ; ;c) FIND HI NIBBLE FOR 5 ; 5 | 0x82 | 1 | 0 | 0 | 0 |:| 0 | 0 | 1 | X | ;d) MASK HI NIBBLE AND MOVE TO LO NIBBLE POSITION ; 5 | 0x08 | | | | |:| 1 | 0 | 0 | 0 | ; ;e) INCLUSIVE-OR BOTH BYTES ; 9 5 ; /----1ST DIGIT----\ /----2ND DIGIT----\ ;COM1A | RD7| RD6| RD5| RD4|:| RD3| RD2| RD1| RD0| ;RESULT | 0x98 | 1 | 0 | 0 | 1 |:| 1 | 0 | 0 | 0 | ;............................................................................. ;NEXT ;f) FIND HI NIBBLE FOR 8 | RC7| RC6| RC5| RC4|:| RC3| RC2| RC1| RC0| ; 8 | 0x00 | 0 | 0 | 0 | 0 |:| 0 | 0 | 0 | X | ;g) MASK HI NIBBLE AND MOVE TO LO NIBBLE POSITION ; 8 | 0x00 | | | | |:| 0 | 0 | 0 | X | ;h) DE-ACTIVATE Z2, RC5 (PART OF "C") & DE-ACITVATE MINUS SIGN RC0 ;SET RC0 & RC5 MANUALLY | X | X | 1 | X |:| X | X | X | 1 | ; ^ ^ ;i) INCLUSIVE-OR BOTH BYTES ; Z2 8 ; /----ICONS---\ /----3ND DIGIT----\ ;COM1A | RC7| RC6| RC5| RC4|:| RC3| RC2| RC1| RC0| ;RESULT | 0x21 | X | X | 1 | X |:| 0 | 0 | 0 | 1 | ;............................................................................. ;............................................................................. ;............................................................................. ;******************************************************************* ;COM2A THE 1ST BACKPLANE COM2A COM2A THE 1ST BACKPLANE COM2A ;******************************************************************* ;COM2A | RD7| RD6| RD5| RD4|| RD3| RD2| RD1| RD0| ;j) FIND LO NIBBLE FOR 9 ; 9 | 0x90 | 1 | 0 | 0 | 1 |:| 0 | 0 | 0 | X | ;k) MASK LO NIBBLE & MOVE IT TO HI NIBBLE ; | 0 | 0 | 0 | X |:| | | | | ;l) FIND LO NIBBLE FOR 5 ; 5 | 0x82 | 1 | 0 | 0 | 0 |:| 0 | 0 | 1 | X | ;m) MASK LO NIBBLE ; 5 | 0x02 | | | | |:| 0 | 0 | 1 | X | ; ;n) INCLUSIVE-OR BOTH BYTES ; 9 5 ; /----1ST DIGIT----\ /----2ND DIGIT----\ ;COM2A | RD7| RD6| RD5| RD4|:| RD3| RD2| RD1| RD0| ;PRE-RESULT | 0x02 | 0 | 0 | 0 | X |:| 0 | 0 | 1 | X | ; ;o) ADJUST TO ABOVE RESULT BY SETTING DP AND K STATUS ; ACTIVATE DP & K ; DP CLR BIT0 MANUALLY | 0 | 0 | 0 | 0 |:| 0 | 0 | 1 | 0 | ; K CLR BIT4 MANUALLY ^ ^ ;FINAL-RESULT | 0x02 ;................................................................... ;NEXT ;p) FIND LO NIBBLE FOR 8 | RC7| RC6| RC5| RC4|:| RC3| RC2| RC1| RC0| ; 8 | 0x00 | 0 | 0 | 0 | 0 |:| 0 | 0 | 0 | X | ;q) MASK LO NIBBLE ; 8 | 0x00 | X | X | X | X |:| 0 | 0 | 0 | 0 | ;LCOM2A ;PRE-RESULT | 0x00 ;r) ADJUST TO ABOVE RESULT BY SETTING Y AND Z1 ; ACTIVATE Y (Deg SIGN & PART OF "F")-->RC4 -->Y ; AND ACTIVATE CENTER TAIL OF "F" -->RC5 -->ZI ;CLR RC4 & RC5 MANUALLY | X | X | 0 | 0 |:| 0 | 0 | 0 | 0 | ; ^ ^ ; Z1 8 ; /----ICONS---\ /----3ND DIGIT----\ ;COM2A | RC7| RC6| RC5| RC4|:| RC3| RC2| RC1| RC0| ;RESULT | 0x00 | X | X | 0 | 0 |:| 0 | 0 | 0 | 0 | ;****************************************************************** ; ;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ ;///////////////////////////////////////////////////////// ;********************************************************* ; SINGLE OUT SIMPLEX COMMUNICATION DATA OUT TID-BITS ;********************************************************* ; ;********************************************************* ; FEEL FREE TO ASK! TRANSMIT OUT THERMOSTOR VALUES ;********************************************************* ;SINGLE PIN PROPRIATARY PROTOCOL, TRANSMIT TEMPERATURE 3 DIGIT ;& DICMAL POINT VALUE, MINUS SIGN AND OTHER STATUS. ;CHECK TO SEE VIA TIMER IF YOU HAVE ENOUGH TIME ;TO TRANSMIT THE STREAM (SINGLE PIN TRANSMIT) ;THIS CHECK IS NOT REQUIRED BUT HAS BEEN ADAPTED TO ENSURE ;VADILITY OF LOBYTE & HIBYTE & MINUS SIGN ;********************************************************* ;IN THE SPREAD SHEET, TEST THE MINUS CELL. IF TRUE ( 1 ) THEN MULTIPLY ;VALUE BY -1. IF NOT TRUE, THEN DON'T MULTIPLY. ;********************************************************** ;CONTROL TO HOST PROTOCOL SB + 34 BITS + PARITY BIT TRAIN ;MSB = START BIT ;BYTE 4 B7-B3 = = HOST NETID (0x1A)->11010 B34-B30 ;BYTE 3 B7,B6,B5,B4,B3 = CONTROL NET I.D. B29-B25 ; ;BYTE 1 B7-B0 = SET POINT B13-B6 ; ;BYTE 0 B7-B0 = HOST NETID (0x1A) AGAIN B5-B1 ;PARITY BIT B0 ;VERIFICATON IS MADE AGAINS THE STOP BIT, THE PARITY BIT ;MOVED OR NOT AND THE ANDING OF THE TWO NET I.D. PACKET ; ;THE HOST DRIVER WILL HAVE A NET LIST UPDATABLE VIA CONFIGURATION ; ;WHEN RETREIVING THE ON BOARD NET I.D. VIA THE A/D, CONVERT IT ;TO A HEX NUMBER AND SHIFT IT TO THE 5 MSB POSTION ;FROM B0,B1,B2,B3,B4 ;TO---->B3,B4,B5,B6,B7 WHERE NEW B3 = OLD B0 ; ;********************************************************* ;TRANSMITTING (TEMPERATURE * 100) VALUE, TO HOST, ;SB + 16 DATA BITS + 11 TIMING/ID BITS FR CTRL TO HOST = 27 BIT STREAM ;BYTES TRANSMITTED PER SECOND = _______ TEMPERATURE = 12 BIT ;NOTE THAT THIS VALUE IS MULTIPLIED BY 100.0 ;TO DERIVE ACTUAL READING DIVIDE (HIBYTE LOBYTE) BY 100.0 ;IN THE SPREAD SHEET, IF THE SECOND BYTE = 0x01 THEN MULTIPLY ;RESULT BY -1.0 ;********************************************************* ;1st BYTE OUT = B34-B30 = HOST NETID (0x1A) ->1 1 0 1 0 ;2ND BYTE OUT = B29-B22 IS FOR MINUS SIGN = 0x01 ;3RD BYTE OUT = B21-B14 = HIBYTE REGISTER ->B8-B15 ;4TH BYTE OUT = B13-B6 = LOBYTE REGISTER ->B7-B0 ;5th BYTE OUT = B5-B1 = HOST NETID (0x1A) ->1 1 0 1 0 ;LAST BIT OUT = B0 = PARITY = DERRIVED WHILE TRANSMITTING ;EVEN PARITY. IF EVEN # OF ONES SEND OUT HI PARITY BIT ;EVEN PARITY. IF UN- EVEN # OF ONES SEND OUT LO PARITY BIT ;********************************************************* ; SEEMS TO BE 8 INSTRUCTION PER BIT ; 234 567 ; BEFORE CALL : 012 345 678 901 234 567 890 ; 01 123 : 456 789 111 111 111 122 222 222 223 ; 8 SYNC BITS I.E. 01..CALL TO HERE... 1xx : 1xx 1xx 1xx 0xx 1xx 1xx 1xx 0xx 0xx ; \__________/ \_________________/ ; 0x1A XXX1 1010 9.0 SYNC BITS HOST I.D. ;******************************************************************* ;6 instruction per bit ;5th BYTE OUT = B5-B1 = HOST NETID (0x1A) ->1 1 0 1 0 ; BITa BITb BITc BITd BITe ;CONTROL I.D. CODE SET AT 0x02 ;THREE BIT TIME TIMING, NEXT THREE BIT TIME = DATA BIT, REPEAT ;AFTER THE START BIT THE RECEIVER TAKE 8 BIT TIME FOR LOOK FOR THE 1ST ;DATA BIT WHICH IS DONE WITHIN THE INTERRUPT. ;18 LINES ;******************************************************************* ; ; ; ORG 0x0XXX ;TYPICALLY HAVE THESE IN HIGH PAGE ;********************************************************* ;ROUTINE WHICH OFFERS STATUS ON BOTH 16 BIT #' IN ACCa & ACCb ;NMFLAG INCLUDES ZERO, EQUAL, BIGGER & LESS THAN STATUS' ;ACCa & ACCb ARE RETURNED WITH THE SAME VALUE AS BEFORE ;SUB-ROUTINE RUN. TRY NOT TO PUT CALL WITHIN LONG CALLS ; ;THIS IS A MUST HAVE ROUTINE FOR EVERYBODY. NOT INCLUDED IN THIS DEMO ;********************************************************* NUMTST MOVLW 0x10 MOVWF TEMP1 NUMLP DECFSZ TEMP1 ;REPLACED IT WITH THIS DELAY FOR THIS DEMO! GOTO NUMLP RETURN ;********************************************************* ;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ;///////////////////////////////////////////////////////// ;********************************************************* ; CONFIGURE I/O PORTS ;********************************************************* ; ORG 0x0XXX ;WAS 0E3C DIFF = 1A OR 26 DOIOS BANK1 ;A/D PORT CFG PG74 OR PG10-111 MOVLW 0x06 ;RA0,RA1,RA2,RA3,RA4,RA5 MOVWF ADCON1 ;D D D D D D BANK0 ;COMEs UP FAST ENOUGH & PIC SEES,IT AS LOW BAT BCF PORTA,2 ;ENABLE ANALOG POWER SUPPLY BCF DEGCF,4 ;NO MORE SLEEP CLRF PORTB ; CLRF PORTC ; CLRF PORTD ; CLRF PORTE BANK1 MOVLW 0x19 ;PG 10-44, PG 74 MOVWF TRISA ;A/D0, A/D1, RA2, A/D3, RA4, RA5 MOVLW 0x05 ; MOVWF TRISB ;0000 010 1(EXT INT) MOVLW 0xC0 ;1011 1111 RC7=RX,RC6=TX/STIR,RC5=1 MOVWF TRISC ;RC4=1,RC3=1,RC2=1,RC1=1,RC0=1 CLRF TRISD ;0000 0000 ; CLRF TRISE ;RE0-RE2=INPUT, DEFAULT ; BANK0 ;PRESET PORTE UNACTIVATED I/O's ;********************************************************* ; SET POWER ON RESET FLAGS ;********************************************************* ;NOTICE DIFF WITH 74A IN PCON, BROWN-OUT VERSUS POWER-ON RESET ; BANK1 MOVLW 0x03 ; CAPTURE2\COMPARE2\PWM2 MOVWF PCON ;RESET POWERON FLAG PG18 ;********************************************************* ; DIABLE ALL INTERRUPTS ;********************************************************* ; CLRF PIE1 ; BCF INTCON,5 ;DISABLE TMR0 INT (DONE ALREADY) ; BANK0 ; BCF PIR2,0 ;CLEAR CCP2IF FLAG ;********************************************************* ; CONFIGURE TIMER0 ;;PRESCALER --> WATCH-DOG ;********************************************************* MOVLW 0xC7 ;RISING EDGE TRIGGER RB0 EXT INT, NO WDT MOVWF OPTN ;INT OPTIONS OPTION REG PG13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;SETTING THE GLASS' DUTY CYCLE;;;;;;;;;;;; ;SEE CONFIGURE TIMER 2 NOTE BELOW ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; MOVLW 0x12 ;MAX = 22, MIN =04, MOVLW 0x1D ;0x1D = 7.680ms PER CYCLE, 33Hz REFRESH MOVWF PR2 ; BSF PIE1,1 ;ENABLE TIMER 2 INT BSF PIE1,0 ;ENABLE TIMER 1 INT BANK0 ; CLRF TMR0 ;CLEAR TIMER 0 ;********************************************************* ; CONFIGURE TIMER1 PRESCALER = MAX = 8 ;********************************************************* ;TIMER1 IS A 16 BIT TIMER (TMR1H,TMR1L) WITH INTERRUPT ;STATUS @ PIR1,1. IT CAN BE TURNED OFF BY T1CON,0=LO ;PRESCALE = 8 * 1us * 65536 = 524.288ms ;TIMER1 IS NOT ACTIVATED YET ;********************************************************* MOVLW 0x35 ; 00 11 0 1 0 1 PG36 MOVWF T1CON ;TIMER1 PRESCALE = 8 ;********************************************************* ; CONFIGURE TIMER2 ;PRESCALE=16, POSTSCALE=16 ;********************************************************* ;TIMER2 IS A 8 BIT TIMER (TMR2) WITH INTERRUPT ;STATUS @ PIR1,0. IT CAN BE TURNED OFF BY T1CON,0=LO ;PRESCALE = 16, POSTSCALE =16 (65.536ms MAX) @ 4MHz CRYSTAL ;OSC/4 = 4MHz/4 = 1MHz ...1us INCREMENT ;TMR2 COUNTS UP UNTIL IT REACHES VALUE IN PR2, THEN IT RESETS TO 0. ;I.E. TMR2 = PRESCALE * POSTSCAL * PR2 * 1us ;I.E. TMR2 / PRESCALE * POSTSCAL = PR2 ; ; ; if.........if WE WERE USING 50Hz DC THEN 20ms WOULD INCLUDE ;REFRESHING 4 CYCLES (MODES) OR THE COMPLETE GLASS AT 5ms A CYCLE. ; ;50Hz OR 20ms FOR DC OR 5ms REFRESH TIME PER SEGMENT COMPLEMENT (MODE). ;I.E. (20ms / 256 / 1us = 78.125 FOR FOUR FOUR CYCLE LENGHTS ;78.125 / 4 CYCLES = 19.53 OR (18 + 1) ;I.E. (5ms / 256 / 1us = 19.53 FOR APPROXIMATE PR2 VALUE FOR ONE CYCLE ;I.E. 19 * 256 * 1us = 4.864ms ;SO FOR THIS DC RATE 1 + 18.0 = 0x12 FOR PR2 VALUE FOR A REFRESH RATE OF 51Hz. ;COULD ALSO BE, 1 + 19.0 * 256 * 1us = 5.12ms ;YOU CAN FINE TUNE THIS IF YOU REALLY WANT TO IN THE INTERRUPT ROUTINE, BUT ;FINE TUNING IN MY OPINION IS NOT REQUIRED. CONSIDER THE GLASS' PERSISTENCE. ;DIFFERENT MANUFACTURE, DIFFERENT PERSISTENCE & THRESHOLD LEVELS! ;DON'T FORGET YOU MAY HAVE SOMETHING WHICH REQUIRES TIME TO DO BETWEEN ;REFRESH CYCLES, LIKE DIGITAL FILTERING YOUR A/D, SO FASTER IS NOT ;ALWAYS BETTER. TOO FAST REFRESH WILL CAUSE SHADOWING (GHOSTING), TOO LOW WILL ;CAUSE FLICKERING. CHECK VOLTAGE dc TO ASSURE NULL OR MINIMUM VALUE. ;SURE MAKES IT NICE WHEN DUTY CYCLE IS PROGRAMMABLE LIKE WITH THESE PICs. ; ;THIS SPECIFIC DESIGN INCLUDES A 3.8VDC SUPPLY TO THE 16c74A. ;MY PR2 IS 0x1D, 29.0. OR 30 PERIODS. MY REFRESH RATE IS ABOUT 32Hz. NOTE AGAIN THAT ;THE LAST DECIMAL POINT'S DATA SHOULD ONLY BE UPDATED TWICE A SECOND ;OR ELSE IT WILL FLICKER DUE TO DATA UPDATES. ;(1.0 + 29.0) * 256 * 1us = 7.680ms, THEN ABOUT 40 INSTRUCTION IN INTERRUPT ROUTINE ;4 * 7.680ms = 30.720ms OR 32Hz (LESS POWER REQUIREMENT AT LOWER FREQUENCIES) ;IF YOU'VE GOTTEN TO THIS POINT, YOU MUST BE HAVING FUN. ;********************************************************* MOVLW 0xFF ; 0 1111 1 11 PG2-575, PG40 MOVWF T2CON ;TIMER2 PRESCALE = 16, POSTSCALER = 16 PRERUN ; BSF DSPLAY,6 ;SET = ALL DIGIT WERE COMPLETLY PRINTED WAIST CALL NUMTST ;WASTE ANOTHER 100us TIME DECFSZ BCDTMP ;WAIST ABOUT 12ms GOTO WAIST CLRF TEMP1 MOVLW 0xD0 ;EXT INT, PERIPHERAL INT, GLOBAL INT MOVWF INTCON RETURN ; ; ; END