;************************************************************************* ; Copyright 2004 Hata Akihiro ; ;  第5章 PICアイデア集 ; 5−9 ポートを入力用と出力用に兼用する。 ;------------------------------------------------------------------------- ;プログラムの説明 ;<概要> ; のテストプログラム。 ; ;<動作> ; 電源ON時にDIP SWから読みとった値に応じた周期で、4個のLEDを ; シフト点灯する。 ; ;------------------------------------------------------------------------- ; ; 2004/08/23 V1.00 初回リリース ; ; ; ; ;------------------------------------------------------------------------- ; CONFIGRATION FUSE ; WDT:Disable OSC:Int RC Code Protect:OFF Power up timer:ON ; OSCILLATOR ; 4MHz ;************************************************************************* ; LIST P=PIC16F628A, R=DEC ;Target Processor INCLUDE P16F628A.INC ; __CONFIG _BODEN_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF __idlocs H'0100' ;V1.00 2004/08/23 ; ;------------------------------------------------------------------------- ; DEFINE I/O Port ;------------------------------------------------------------------------- ; PortA ; RA0 input/output ; RA1 input/output ; RA2 input/output ; RA3 input/output ; RA4 input ; RA5 input ; ; PortB ; RB0 input ; RB1 input ; RB2 input ; RB3 input ; RB4 input ; RB5 input ; RB6 input ; RB7 input ; ;------------------------------------------------------------------------- ; Variables ;------------------------------------------------------------------------- ; ; ; ;------------------------------------------------------------------------- ; Registers ;------------------------------------------------------------------------- ; ST_TEMP EQU H'20' ; Status Reg. Temp. for Interupt W_TEMP EQU H'21' ; Work Reg. Temp. for Interupt INT_COUNTER EQU H'22' ; Interupt Counter PERIOD EQU H'23' ; LED Shift Period TEMP EQU H'24' ; Tempolary REG. ;------------------------------------------------------------------------- ; Program code ;------------------------------------------------------------------------- ; ORG H'00' ; Power ON GOTO INITIALIZE ; ; ORG H'04' ; Go Interupt GOTO INTERUPT ;------------------------------------------------------------------------- ; Initialize ;------------------------------------------------------------------------- INITIALIZE BSF STATUS,RP0 ; BANK1 MOVLW B'11010111' ; INT CLK,1/256Prescaler MOVWF OPTION_REG MOVLW B'11111111' ; Set I/O Port INPUT/OUTPUT MOVWF TRISA MOVLW B'11111111' MOVWF TRISB BCF STATUS,RP0 ; BANK0 MOVLW H'FF' MOVWF CMCON ; Set CMCON CLRF TMR0 BSF INTCON,T0IE ; TIMER0 Interupt Enable ;---------------------- ; OUTPUT Initialize ;---------------------- MOVLW B'00000000' MOVWF PORTA ;******************************************************* ; MAIN PROGRAM ;******************************************************* MAIN COMF PORTA,W ANDLW H'0F' MOVWF PERIOD CLRF INT_COUNTER BSF STATUS,RP0 ; BANK1 MOVLW B'11110000' MOVWF TRISA BCF STATUS,RP0 ; BANK0 MOVLW B'00000001' MOVWF PORTA ; Set PORTA BSF INTCON,GIE ; Global Interupt Enable ENDLESS_LOOP GOTO ENDLESS_LOOP ; ;******************************************************* ; INTERUPT ;******************************************************* INTERUPT ;**** save W register & status register MOVWF W_TEMP ;save w reg SWAPF STATUS,W ;status to wreg MOVWF ST_TEMP ;save status ; MOVF INT_COUNTER,W SUBWF PERIOD,W BTFSS STATUS,Z ; Compare INT_COUNTER & PERIOD GOTO INT_SKIP CLRF INT_COUNTER MOVF PORTA,W MOVWF TEMP ; Load PORTA to Tempolary REG. BSF STATUS,C BTFSS PORTA,3 BCF STATUS,C RLF TEMP,W ; Left Rotate TEMP ANDLW B'00001111' MOVWF PORTA ; Set PORTA GOTO INT_END INT_SKIP INCF INT_COUNTER,F INT_END BCF INTCON,T0IF ;**** register restore and return SWAPF ST_TEMP,W ;get saved status MOVWF STATUS SWAPF W_TEMP,F ;get saved wreg SWAPF W_TEMP,W RETFIE ; END