;**************************************************************** ;* 2 Digit UP / Down Counter 17/6/2009 ;Port B drives two 7 segment displays ;Up Sw on RA2 Down Sw on RA3 ;"Units" drive on RA0 "Tens" drive on RA1 * ;* * ;**************************************************************** list P = 16F628A ;microcontroller include ;registers for F628A __CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF ;code protection - off ;low-voltage programming - off ;power-up timer - on ;watchdog timer - off ;use internal RC for 4MHz - all pins for in-out ;**************************************************************** ; variables - names and files ;**************************************************************** ;Files for F628A start at 20h temp1 equ 20h ;for delay temp2 equ 21h ;for delay SwUp equ 22h ; SwDwn equ 23h ; units equ 24h ; tens equ 25h ; Sw_Flag equ 26h ; ;**************************************************************** ;Equates ;**************************************************************** status equ 0x03 cmcon equ 0x1F rp1 equ 0x06 rp0 equ 0x05 ;**************************************************************** ;Beginning of program ;**************************************************************** reset org 00 ;reset vector address goto SetUp ;goto SetUp table addwf PCL,F ;02h,1 add W to program counter retlw b'00111111' ; "0" -|F|E|D|C|B|A retlw b'00000110' ; "1" -|-|-|-|C|B|- retlw b'01011011' ; "2" G|-|E|D|-|B|A retlw b'01001111' ; "3" G|-|-|D|C|B|A retlw b'01100110' ; "4" G|F|-|-|C|B|- retlw b'01101101' ; "5" G|F|-|D|C|-|A retlw b'01111101' ; "6" G|F|E|D|C|-|A retlw b'00000111' ; "7" -|-|-|-|C|B|A retlw b'01111111' ; "8" G|F|E|D|C|B|A retlw b'01101111' ; "9" G|F|-|D|C|B|A ;**************************************************************** ;* port A and B initialisation * ;**************************************************************** SetUp bsf status,rp0 movlw b'00001100' ;Make RA0,1 out RA2,3 in movwf 05h clrf 06h ;Make all RB output bcf status,rp0 ;select programming area - bank0 movlw b'10000000' ;Turn off T0CKI movwf OPTION_REG clrf 06h ;Clear Port B of junk  movlw 5 movwf units movlw 1 movwf tens clrf Sw_Flag movlw 07h ;turn comparators off and enable movwf cmcon ; pins for I/O functions goto Main ;Delay 10mS 10 x 1,000uS D_10mS movlw 0Ah movwf temp2 D_a nop decfsz temp1,1 goto D_a decfsz temp2,1 goto D_a retlw 00 Up btfsc Sw_Flag,2 retlw 00 bsf Sw_Flag,2 incf units,1 movlw 0Ah ;put 10 into w xorwf units,0 ;compare units file with 10 btfss 03,2 ;zero flag in status file. Will be set if units is 10 retlw 00 clrf units incf tens,1 movlw 0Ah ;put 10 into w xorwf tens,0 ;compare units file with 10 btfsc 03,2 ;zero flag in status file. Will be set if tens is 10 clrf tens retlw 00 ;display passes 99 but not below 0 Dwn btfsc Sw_Flag,3 retlw 00 bsf Sw_Flag,3 decf units,1 movlw 0FFh ;put FFh into w xorwf units,0 ;compare units file with FFh btfss 03,2 ;zero flag in status file. Will be set if units is 10 retlw 00 movlw 09 movwf units ;put 9 into units file decf tens,1 movlw 0FFh ;put 0FFh into w xorwf tens,0 ;compare tens file with 0FFh btfsc 03,2 ;zero flag in status file. Will be set if tens is 0FFh goto $+2 ;tens file is 0FFh Jump down 2 instructions retlw 00 clrf tens clrf units retlw 00 ;display not below 0 Main btfss 05,2 ;test switch-press for UP call Up ;UP switch pressed btfss 05,3 ;test switch-press for Down call Dwn ;Down switch pressed movlw b'00000001' ;Make RA0 HIGH for units drive movwf 05h movf units,0 ;copy unit value into w call table ;unit display value will return in w movwf 06h ;output units value call D_10mS ;call delay clrf 06h ;clear display movlw b'00000010' ;Make RA1 HIGH for tens drive movwf 05h movf tens,0 ;copy tens value into w call table ;tens display value will return in w movwf 06h ;output tens value call D_10mS ;call delay clrf 06h ;clear display btfsc 05,2 ;bit will be zero when sw is pressed bcf Sw_Flag,2 btfsc 05,3 ;bit will be zero when sw is pressed bcf Sw_Flag,3 goto Main END