; list p=PIC16F628 #include ; ; charger.asm version 2 ; (c) 2003 Sugihara Toshio. ; All rights reserved. ; ; PIC16F628 ; Clock=32768Hz 8192 orders/s ; WDT=on, PowerUpTimer=on ; Protect=off, Oscllator=LP ; BrownOutDetect=off ; Low Voltage Program=off ;########################### hourset equ H'70' ;Hours to charge setted cset equ H'71' ;Current (0-15):000mA-300mA ;Remaining time to charge hour equ H'72' ;hours min equ H'73' ;minutes sec equ H'74' ;seconds ;General status value gst equ H'75' ;0=boot(None) ;2=ChargeDone(bit1) ;4=WDTreboot(bit2) ;8=Now Charging(bit3) xms equ H'76' ;Wait timer outbuf equ H'77' ;LCD output buffer n10buf equ H'78' ;10shinsuu 2 ketabuf n10h equ H'79' reps equ H'7a' ;Repating status ;0=not preesed ;1-63=pressed 1-63 times ;64=pressed many bnow equ H'7b' ;button now ;################################ ; ; ;Program starts from 0 even after WDT RESET org H'0' ;Check WDT Reboot clrf INTCON ;Disable all interruption bcf STATUS,IRP ;select bank 0 bcf STATUS,RP1 bcf STATUS,RP0 movlw D'4' movwf gst btfsc STATUS,4 clrf gst ; Initialize variables clrwdt clrf reps clrf bnow clrf hourset clrf cset clrf hour clrf min clrf sec ;Initialize I/O ;When charge is off clrwdt movlw B'00111000' ;Choose bank 1 movwf STATUS movlw B'00000100' ;TMR0 overflows every second movwf OPTION_REG bcf STATUS,RP0 ;choose bank 0 clrf PORTA movlw H'07' movwf CMCON bsf STATUS,RP0 ;choose bank 1 movlw B'11110100' movwf TRISA movlw B'11110000' ;B7:B4 inputs with pull-ups movwf TRISB movlw B'11100000'; output voltage is 0V movwf VRCON bcf STATUS,RP0 ;choose bank 0 clrf PORTA ;Stop charging clrf PORTB ;Initial values are 0 ;Reset timer clrf TMR0 clrf INTCON ;Set and show initial setting call initLCD call ChangeIO ; select charge current and time ; and receive start button Mainloop clrwdt btfsc INTCON,2 ;if TMR0 is overflow call Susumu ;Yes. Susumu will be called ;No. Do nothing ;read button with repeat control movf PORTB,W iorlw B'00001111' movwf bnow btfss PORTA,4 ;A4->act as bnow,3 bcf bnow,3 incf bnow,W btfss STATUS,Z goto ButtonPreesed ;No button is pressed clrf reps goto Mainloop ButtonPreesed movf reps,F btfss STATUS,Z goto Button2nd ;Button is pressed 1st incf reps,F goto Buttonblanch Button2nd ;Button is pressed again btfsc reps,6 ;pressed >= 64 times? goto Buttonblanch ;Yes. Go to blanch ;No. trap some while incf reps,F goto Mainloop ;Evaluate button values Buttonblanch btfsc bnow,4 ;current up? goto ButtonID ;No. ;Yes. incf cset,F ;cset++ btfsc cset,4 ;if cset>=16 decf cset,F ;then cset-- call ChangeIO ButtonID btfsc bnow,5 ;current down? goto ButtonTU ;No. ;Yes. movf cset,F ;if cset!=0 btfss STATUS,Z ;then decf cset,F ;cset-- call ChangeIO ButtonTU btfsc bnow,6 ;time up? goto ButtonTD ;No. ;Yes. incf hourset,F ;hourset++ btfsc hourset,5 ;if hourset>=32 decf hourset,F ;hourset-- call ChangeIO ButtonTD btfsc bnow,7 ;time down? goto ButtonST ;No. ;Yes. movf hourset,F btfss STATUS,Z ;if hourset!=0 decf hourset,F ;then hourset-- call ChangeIO ButtonST btfsc bnow,3 ;start button? goto Mainloop ;No. ;Yes. movf hourset,W ;set hour-min-sec movwf hour clrf min clrf sec movlw D'8' ;set charging mode movwf gst clrf TMR0 ;init timer call Susumu goto Mainloop ; Only wait for about xReg ms Waitxms movwf xms Waitxmsnext clrwdt nop nop nop nop decfsz xms,F goto Waitxmsnext return ; Called every second. ; 0,2,4=InitLCD again and display 8=Decrease timer Susumu clrwdt clrf INTCON ;Clear overflow flag btfss gst,3 ;charging now? goto SusumuNCR ;No. ;Yes. decrease timer decf sec,F incfsz sec,W ;if sec<0? goto ChangeIO ;No. ;Yes. movlw D'59' movwf sec call initLCD ;call initLCD every minutes decf min,F incfsz min,W ;if min<0? goto ChangeIO ;No. ;Yes. movlw D'59' movwf min decf hour,F incfsz hour,W ;if hour<0? goto ChangeIO ;No. ;Yes; ;Charge is done. movlw D'2' ;Change general status movwf gst ;to Charge is done clrf hour ;clear remaining time clrf min clrf sec goto ChangeIO ;Susumu not at charging SusumuNCR call initLCD ;init LCD every second ;Change I/O outputs according to variables ChangeIO clrwdt movlw B'00111000' ;Choose bank 1 movwf STATUS movlw B'00000100' ;TMR0 overflows every second movwf OPTION_REG bcf STATUS,RP0 ;choose bank 0 clrf PORTA movlw H'07' movwf CMCON bsf STATUS,RP0 ;choose bank 1 movlw B'11110000' ;B7:B4 inputs with pull-ups movwf TRISB movlw B'11110100' movwf TRISA movlw B'11100000'; Set output voltage iorwf cset,W ; in cset. movwf VRCON bcf STATUS,RP0 ;choose bank 0 movlw B'00001000' btfss gst,3 ;Is gst charging? movlw B'00000000' ;No. Stop charging ;Yes. Do charging movwf PORTA ;Charge becomes on/off clrf PORTB ;Initial values are 0 goto Display ;Show current status into LCD Display clrwdt ;Display 1st line movlw D'128' ;move cursor call putrs0 ;to 1st line 1st char bcf STATUS,C rlf cset,W ;Make 2 x cset call put10s movlw A'0' call putrs1 movlw A'm' call putrs1 movlw A'A' call putrs1 movlw A' ' call putrs1 movf hourset,W call put10s movlw A'h' call putrs1 movlw A'r' call putrs1 ;show 2nd line movlw D'192' call putrs0 btfsc gst,3 goto DisplayCharging btfsc gst,2 goto DisplayWdtReboot btfsc gst,1 goto DisplayChargeDone Displayboot movlw A'B' call putrs1 movlw A'O' call putrs1 movlw A'O' call putrs1 movlw A'T' call putrs1 return DisplayCharging movf hour,W call put10s movlw A':' call putrs1 movf min,W call put10s movlw A':' call putrs1 movf sec,W call put10s return DisplayWdtReboot movlw A'W' call putrs1 movlw A'E' call putrs1 movlw A'R' call putrs1 movlw A'R' call putrs1 return DisplayChargeDone movlw A'C' call putrs1 movlw A'O' call putrs1 movlw A'M' call putrs1 movlw A'P' call putrs1 movlw A'L' call putrs1 movlw A'E' call putrs1 movlw A'T' call putrs1 movlw A'E' call putrs1 return initLCD clrwdt bcf PORTA,0 bcf PORTA,1 movlw D'20' call Waitxms movlw b'00000011' movwf PORTB bsf PORTA,1 bcf PORTA,1 movlw D'6' call Waitxms bsf PORTA,1 bcf PORTA,1 movlw D'2' call Waitxms bsf PORTA,1 bcf PORTA,1 bcf PORTB,0 bsf PORTA,1 bcf PORTA,1 ;Setup movlw b'00101000' call putrs0 movlw b'00001000' call putrs0 movlw b'00000001' call putrs0 movlw D'3' call Waitxms movlw b'00000110' call putrs0 movlw b'00001100' call putrs0 return putrs0 clrwdt movwf outbuf swapf outbuf,W movwf PORTB bcf PORTA,0 bsf PORTA,1 bcf PORTA,1 movf outbuf,W movwf PORTB bsf PORTA,1 bcf PORTA,1 clrf PORTB return putrs1 clrwdt movwf outbuf swapf outbuf,W movwf PORTB bsf PORTA,0 bsf PORTA,1 bcf PORTA,1 movf outbuf,W movwf PORTB bsf PORTA,1 bcf PORTA,1 bcf PORTA,0 clrf PORTB return put10s movwf n10buf clrf n10h movlw D'10' put10s1 clrwdt incf n10h,F subwf n10buf,F btfsc STATUS,C goto put10s1 movf n10h,W addlw A'/' call putrs1 movf n10buf,W addlw A':' call putrs1 return end