LIST P=16F84 __CONFIG 3FF3 include include ;------------------------------------------------------------- ORG 0 BSF RP0 ; bank 1 MOVLW 0FF ; MOVWF TRISB ; rb7-rb0 = inputs (keyboard) CLRF TRISA ; ra0..ra4 = outputs BCF RBPU ; inputs = pull-up to '1' BCF RP0 ; bank0 CLRF PORTA MOVLW 2 MOVWF FRECQ CLRF CHAN CLRF FLAGS CALL DELAYMX CALL DELAYMX CALL DELAYMX BSF LED CALL INIT GOTO GO ;------------------------------------------------------------- LEDTAB2 ADDWF PCL,F ; w + pcl -> pcl ; BFAG.DEC ; lsdigit DT B'00011000',B'01111110',B'01001001',B'01001010',B'00101110' DT B'10001010',B'10001000',B'01011110',B'00001000',B'00001010' ;------------------------------------------------------------- LEDTAB1 ADDWF PCL,F ; w + pcl -> pcl ; GAFB.CED DT B'10001000',B'11101011',B'00101100',B'00101010',B'01001011' DT B'00011010',B'00011000',B'10101011',B'00001000',B'00001010' ;------------------------------------------------------------- DECTAB ADDWF PCL,F ; w + pcl -> pcl DT 0,0,0A ; 10 DT 0,0,64 ; 100 DT 0,3,0E8 ; 1000 ;------------------------------------------------------------ DELAY ; delay (7+3*help)*count+3 micros, i.e. 3+100*count MOVWF COUNT DEL1 MOVLW .31 MOVWF HELP NOP NOP DEL DECFSZ HELP,F GOTO DEL NOP DECFSZ COUNT,F GOTO DEL1 NOP RETURN ;------------------------------------------------------------ DELAYM MOVLW .250 CALL DELAY RETURN ;------------------------------------------------------------ DELAYMX CALL DELAYM CALL DELAYM CALL DELAYM RETURN OUTBY MOVWF TEMP ; push w to temp (msb or lsb) MOVLW .8 MOVWF COUNT ; number of rotation in count LOOP BCF DA ; make sure da=0 RLF TEMP,F ; rotate left BTFSC CF ; cf=MSbit BSF DA ; if cf wasn't 0 then make '1' CALL CLOCK DECFSZ COUNT,F ; dec count B LOOP ; 8 rotations ? RETURN ; yes, then over ;----------------------------------------------------------- RDCH BCF RP0 MOVFW CHAN MOVWF EEADR BSF RP0 BCF GIE BSF RD BCF RP0 MOVFW EEDATA MOVWF FRECQ BSF GIE RETURN ;------------------------------------------------------------ WRCH BCF RP0 MOVFW FRECQ MOVWF EEDATA MOVFW CHAN MOVWF EEADR BSF RP0 BCF GIE BSF WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF WR WAITING BTFSS EEIF GOTO WAITING BCF EEIF BCF WR BCF RP0 BSF GIE BCF CHFLAG BSF LED RETURN ;------------------------------------------------------------ INIT BCF DA BSF ES CALL CLOCK MOVLW MSBI CALL OUTBY MOVLW LSBI CALL OUTBY BCF DA BCF ES CALL CLOCK RETURN ;------------------------------------------------------------ INITFR MOVLW 70 MOVWF LOWB MOVLW 03 MOVWF HIGB MOVFW FRECQ ADDWF LOWB,F ADDCF HIGB,F RETURN ;----------------------------------------------------------- INKEY NOP COMF PORTB,W CALL DELAYM COMF PORTB,W BNZ KEYON CLRF COUNTER GOTO INKEY KEYON CALL DELAYM BTFSS UP GOTO PROCUP BTFSS DW GOTO PROCDW BTFSS ST GOTO PROCST BTFSS CH GOTO PROCCH GOTO INKEY ;----- PROCUP BTFSC CHFLAG GOTO U2 BTFSS CHFLAG GOTO U1 U2 INCF CHAN,W ANDLW 07 MOVWF CHAN WU NOP COMF PORTB,W BNZ WU GOTO ENDKEY U1 INCF FRECQ,F MOVFW FRECQ SUBLW .200 SKPC CLRF FRECQ GOTO ENDKEY ;----- PROCDW BTFSC CHFLAG GOTO D2 BTFSS STFLAG GOTO D1 D2 DECF CHAN,W ANDLW 07 MOVWF CHAN WD NOP COMF PORTB,W BNZ WD GOTO ENDKEY D1 DECF FRECQ,F MOVFW FRECQ SUBLW .200 SKPNC GOTO ENDKEY MOVLW .200 MOVWF FRECQ GOTO ENDKEY ;----- PROCST MOVFW FLAGS XORLW STFL MOVWF FLAGS BSF CHFLAG BCF LED BTFSS STFLAG CALL WRCH WAIT1 CALL DELAYM BTFSS ST GOTO WAIT1 GOTO ENDKEY ;----- PROCCH BSF LED BCF STFLAG MOVFW FLAGS XORLW CHFL MOVWF FLAGS WAIT2 NOP BTFSS CH GOTO WAIT2 GOTO ENDKEY NOP ENDKEY INCF COUNTER,F MOVFW COUNTER ANDLW B'11111100' SKPNZ CALL DELAYMX CALL DELAYM ; CALL DELAYM RETURN ;------------------------------------------------------------- CLOCK BSF CK NOP NOP NOP NOP BCF CK RETURN ;----------------------------------------------------------- SUBC24 CLRF TEMP ; IT WILL TEMPORARY SAVE CF MOVFW INDEX ; POINTER TO LOW BYTE OF CONSTANT MOVWF HINDEX ; W -> HINDEX CALL DECTAB ; W RETURNED WITH LOW BYTE OF CONSTANT BSF CF ; SET CF SUBWF LOWB,F ; LOWB - W -> LOWB ; IF UNDERFLOW -> C=0 BTFSC CF GOTO STEP1 BSF CF MOVLW 1 SUBWF HIGB,F ; DECREMENT HIGB BTFSC CF ; IF UNDERFLOW -> C=0 GOTO STEP1 BSF TEMP,C ; SET C STEP1 DECF HINDEX,F MOVFW HINDEX ; POINTER TO HIGH BYTE OF CONST CALL DECTAB BSF CF SUBWF HIGB,F ; HIGB - W -> HIGB BTFSC CF ; IF UNDERFLOW -> C=0 GOTO CLEARCF BSF CF GOTO SUBEND CLEARCF RRF TEMP,C ; C -> STATUS SUBEND RETLW 0 ;----------------------------------------------------------- ADDC24 CLRF TEMP ; REGISTER FOR TEMPORARY STORAGE OF CF MOVFW INDEX ; POINTER TO LOWER BYTE OF CONST INTO W MOVWF HINDEX ; SAVE IT INTO HINDEX CALL DECTAB ; W CONTAINS LOW BYTE OF CONST BCF CF ; CLEAR C ADDWF LOWB,1 ; W + LOWB -> LOWB BTFSS CF ; TEST OVERFLOW GOTO ADD2 BCF CF MOVLW 1 ADDWF HIGB,F ; INCREMENT HIGB BTFSS CF ; TEST OVERFLOW GOTO ADD2 BSF TEMP,C ; STORE C ADD2 DECF HINDEX,F ; POINTER TO HIGHER BYTE INTO W MOVFW HINDEX CALL DECTAB BSF CF ADDWF HIGB,F ; W + HIGB -> HIGB, BTFSS CF GOTO CLARCF BSF CF GOTO ADDEND CLARCF RRF TEMP,C ; C -> STATUS ADDEND RETLW 0 ;----------------------------------------------------------- CONV MOVLW 3*3-1 ; POINTER TO DEC. TABLE MOVWF INDEX ; 3*3-1 -> INDEX MOVLW 9 ; MAXIMUM OF SUBSTRACTIONS MOVWF COUNT ; 9 -> COUNT CLRF HELP MOVLW 3 MOVWF LEDIND DIVIDE CALL SUBC24 ; SUBSTRACT UNTILL RESULT IS NEGATIVE, BC ADD24 ; ADD LAST SUBSTRACTED NUMBER INCF HELP,F DECF COUNT,F BNZ DIVIDE MOVLW 3 SUBWF INDEX,F GOTO NEXT ADD24 CALL ADDC24 MOVLW 3 SUBWF INDEX,F NEXT MOVLW 9 MOVWF COUNT MOVLW LED1 ; LED1 -> W ADDWF LEDIND,W; LED1 + LEDIND -> W MOVWF TEMP DECF TEMP,F ; LEDIND+LED1-1 -> TEMP MOVFW TEMP MOVWF FSR ; W -> FSR MOVFW HELP ; HELP -> W CLRF HELP ; SAVE RESULT AT LEDX MOVWF INDF ; W -> LED(6..1) DECF LEDIND,F MOVLW 1 ADDWF INDEX,W BTFSS ZF GOTO DIVIDE MOVFW LOWB MOVWF LED0 ; THE REST -> LED0 RETURN ;----------------------------------------------------------- SETSY CALL INIT BTFSC CHFLAG CALL RDCH CALL INITFR MOVLW 6B ADDWF LOWB,F ADDCF HIGB,F CLRC RLF LOWB,F RLF HIGB,F RLF LOWB,F RLF HIGB,F RLF LOWB,F RLF HIGB,F BCF DA BSF ES CALL CLOCK MOVFW HIGB CALL OUTBY MOVFW LOWB CALL OUTBY BCF ES BCF DA CALL CLOCK RETURN ;----------------------------------------------------------- SETDY BCF ONE CALL INITFR BTFSS CHFLAG GOTO DY1 CLRF HIGB MOVFW CHAN MOVWF LOWB DY1 CALL CONV TSTF LED3 SKPZ BSF ONE MOVFW LED2 CALL LEDTAB2 BTFSC ONE ANDLW POINT BTFSC CHFLAG MOVLW C3 CALL OUTBY MOVFW LED1 CALL LEDTAB1 BTFSS CHFLAG ANDLW POINT CALL OUTBY MOVFW LED0 CALL LEDTAB2 BTFSC ONE ANDLW POINT CALL OUTBY BSF ED NOP BCF ED RETURN ;----------------------------------------------------------- GO CLRF PCLATH BTFSS STFLAG CALL SETSY CALL SETDY CALL INKEY GOTO GO ORG 0 END