;************************************* ; Author : Mike Baird ; Program : Countdown timer Linked with a Talkbot Brain ; Date : December 23rd,2009 ;************************************* List P=16F882 #include "P16F882.INC" __CONFIG _CONFIG1, _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BOR_OFF & _LVP_OFF & _CP_OFF & _MCLRE_OFF __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF errorlevel -302, -305 ;*** Cblock *** CBLOCK 0x20 Count1 ; For delay! CountA ; CountB ; SecLow ; SecHigh ; MinLow ; MinHigh ; SecL SecH MinL ; MinH ; W_TEMP ; STATUS_TEMP ; X ; ENDC ;*** Defines *** #Define Bits PORTB,2 #Define Clock PORTB,1 #Define Latch PORTB,0 #Define SLow PORTA,4 #Define SHigh PORTA,3 #Define MLow PORTA,5 #Define MHigh PORTA,7 ;*** Macro *** HC595 MACRO Var,Var1 Local Loop ; Local Label MOVLW .8 ; Transfer 8 bits MOVWF Var1 ; Initializing counter Loop RLF Var,f ; Rotate "Var" one place to the left BTFSS STATUS,C ; Is carry 1? BCF Bits ; If not set data line to 0 BTFSC STATUS,C ; Is carry 0? BSF Bits ; If not set data line to 1 BSF Clock ; Generate one clock BCF Clock ; DECFSZ Var1,f ; Has 8 bits been sent? GOTO Loop ; If not, repeat BSF Latch ; If all 8 bits have been sent, set latch BCF Latch ; RLF Var,f ; Restore to Orginal ENDM ;*** START OF RAM *** ORG 0x000 ; Start of program vector GOTO Start ; ORG 0x004 ; Interrupt vector GOTO ISR Table: ADDWF PCL RETLW b'00111111' ; 0 (3) RETLW b'00000110' ; 1 (4) RETLW b'01011011' ; 2 (5) RETLW b'01001111' ; 3 (6) RETLW b'01100110' ; 4 (7) RETLW b'01101101' ; 5 (8) RETLW b'01111101' ; 6 (9) RETLW b'00000111' ; 7 (10) RETLW b'01111111' ; 8 (11) RETLW b'01101111' ; 9 (12) RETLW b'00000000' ; Blank ;*** Interrupt Service Routine *** ISR: MOVWF W_TEMP ; SWAPF STATUS,W ; Context Saving MOVWF STATUS_TEMP ; BCF PIR1,TMR1IF ; Clear Interupt Flag BSF TMR1H,7 ; Reload the start up value into the timer ;*** Code Insert *** DECF SecLow MOVF SecLow,W SUBLW .255 BTFSS STATUS,Z GOTO Exit MOVLW .9 MOVWF SecLow DECF SecHigh MOVF SecHigh,W SUBLW .255 BTFSS STATUS,Z GOTO Exit MOVLW .5 MOVWF SecHigh DECF MinLow MOVF MinLow,W SUBLW .255 BTFSS STATUS,Z GOTO Exit MOVLW .9 MOVWF MinLow DECF MinHigh MOVF MinHigh,W SUBLW .255 BTFSS STATUS,Z GOTO Exit MOVLW .0 MOVWF MinHigh MOVWF MinLow MOVWF SecLow MOVWF SecHigh BCF T1CON,0 ; Stop the timer MOVLW 'A' Call Send Exit: SWAPF STATUS_TEMP,W ; Restore Status and W MOVWF STATUS ; SWAPF W_TEMP,F ; SWAPF W_TEMP,W ; RETFIE ; ;*** End of ISR *** Start CLRF PORTA ; PortA all low CLRF PORTB ; PortB all low BSF STATUS,RP0 ; Bank 1 MOVLW b'00000111' ; MOVWF TRISA ; CLRF TRISB ; Move to PortB MOVLW b'11000011' MOVWF TRISC BSF PIR1,TMR1IE BCF STATUS,RP0 ; Bank 0 BANKSEL ANSEL CLRF ANSEL CLRF ANSELH BANKSEL PORTA ;*** Timer1 set up *** BSF INTCON,7 ; Enable Global interrupts BSF INTCON,6 ; Enable all unmasked interrupts BSF TMR1H,7 ; Load a start up value into the timer BCF T1CON,6 BCF T1CON,5 ; BCF T1CON,4 ; 1,2,4,8 prescaler BSF T1CON,T1OSCEN ;3 ; Timer1 External Clock Input Synchronization Control bit BCF T1CON,T1SYNC ;2 ; Sync to external clock BSF T1CON,TMR1CS ;1 ; External clock from pin RB6/T1OSO/T1CKI/PGC (on the rising edge) BCF PIR1,0 ; Reset interupt flag BCF T1CON,0 ;0 ; Start the timer ;*** UART Set Up *** BANKSEL BAUDCTL MOVLW b'00000000' MOVWF BAUDCTL BANKSEL SPBRG MOVLW 0x0C ; 0x19 = 9600 BPS (0x0C = 19200 BPS) MOVWF SPBRG ; Baud Rate Generator Store Location MOVLW b'10100100' MOVWF TXSTA BCF STATUS,RP0 ; Bank 0 BSF RCSTA,SPEN ; Serial Port Enable bit BSF RCSTA,CREN ; Continuous Receive Enable bit ;*** MOVLW .0 MOVWF MinHigh MOVWF MinLow MOVWF SecHigh MOVWF SecLow Main: Call TurnOffNumbers MOVF SecLow,W Call Table MOVWF SecL HC595 SecL,X BSF SLow Call Delay5 Call TurnOffNumbers MOVF SecHigh,W Call Table MOVWF SecH HC595 SecH,X BSF SHigh Call Delay5 Call TurnOffNumbers MOVF MinLow,W Call Table MOVWF MinL HC595 MinL,X BSF MLow Call Delay5 Call TurnOffNumbers MOVF MinHigh,W Call Table MOVWF MinH HC595 MinH,X BSF MHigh Call Delay5 BTFSS PORTA,1 CAll SetSecond BTFSS PORTA,0 Call SetMinute BTFSS PORTA,2 BSF T1CON,0 ; Start the timer GOTO Main Reset: MOVLW .0 MOVWF MinHigh MOVWF MinLow MOVWF SecHigh MOVWF SecLow Call Delay100 RETURN SetSecond: BTFSS PORTA,0 GOTO Reset Call TurnOffNumbers INCF SecLow Call CheckSec Call Delay100 Return SetMinute: Call TurnOffNumbers INCF MinLow Call CheckMin Call Delay100 RETURN TurnOffNumbers: BCF MLow BCF MHigh BCF SLow BCF SHigh RETURN CheckMin: MOVF MinLow,W SUBLW .10 BTFSS STATUS,Z Return CLRF MinLow INCF MinHigh MOVF MinHigh,W SUBLW .10 BTFSS STATUS,Z Return CLRF MinHigh RETURN CheckSec: MOVF SecLow,W SUBLW .10 BTFSS STATUS,Z Return CLRF SecLow INCF SecHigh MOVF SecHigh,W SUBLW .6 BTFSS STATUS,Z Return CLRF SecHigh Return ;*** Receive *** Receive: BTFSS PIR1,RCIF ; P1R1 is set when byte is recieved GOTO Receive ; MOVF RCREG,W ; Move received data into W RETURN ;*** Send *** Send: MOVWF TXREG ; Load W into TXREG BSF STATUS,RP0 ; RAM Page 1 Wait: BTFSS TXSTA,TRMT ; Transmission is complete when High GOTO Wait ; BCF STATUS,RP0 ; RAM Page 0 RETURN ; *** Delay *** Delay255 MOVLW d'255' ; Delay 255 mS GOTO d0 Delay100 MOVLW d'100' ; Delay 100mS GOTO d0 Delay50 MOVLW d'50' ; Delay 50mS GOTO d0 Delay20 MOVLW d'20' ; Delay 20mS GOTO d0 Delay5 MOVLW d'5' ; Delay 5.000 ms (4 MHz clock) d0 MOVWF Count1 d1 MOVLW 0xC7 ; Delay 1mS MOVWF CountA MOVLW 0x01 MOVWF CountB Delay_0 DECFSZ CountA,F GOTO $+2 DECFSZ CountB,F GOTO Delay_0 DECFSZ Count1,F GOTO d1 RETURN ;*** END ;*********************************************************8 ; Table ; (f) Left Top = bit5 ; __ (a) Top = bit0 (b) Righ Top = bit1 ; |__| (g) Middle = bit6 (e) Left Bot = bit4 ; |__| (d) Bottom = bit3 (c) Righ Bot = bit2 ; ; = b'00000000' ;0 = b'00111111' ;1 = b'00000110' ;2 = b'01011011' ;3 = b'01001111' ;4 = b'01100110' ;5 = b'01101101' ;6 = b'01111101' ;7 = b'00001111' ;8 = b'01111111' ;9 = b'01101111' ; ; That's all folks! ;*************************************