;----------------------------------------------------------------------; ; COMBO4M.ASM A combination lock 4 Mhz ; ;----------------------------------------------------------------------; ; Hold both buttons down when power applied to enter code set routine ; A total of 8 button presses makes up the combination. If the correct ; combination is entered, all four LEDs will flash 6 times else once. ; .-----------. ; -|RA2 RA1|- V+ = 4.5 or 5V ; -|RA3 RA0|- X = 4 MHz cer. res. ; -|RA4 OSC1|--|X|___ gnd ; -{r}- = 470 ohm V+ ---|MCLR OSC2|--|X| ; -|<- = LED gnd ---|Vss Vdd|--- V+ ; gnd ---|<--{r}--|RB0 RB7|- ; gnd ---|<--{r}--|RB1 RB6|- ; gnd ---|<--{r}--|RB2 RB5|---[PB]--- gnd ; gnd ---|<--{r}--|RB3 RB4|---[PB]--- gnd ; '-----------' ; PIC16F84 -[PB]- pushbutton LIST P=16F84 ; tells which processor is used INCLUDE "p16f84.inc" ; defines various registers etc. Look ERRORLEVEL -224 ; supress annoying message from tris ERRORLEVEL -302 ; " " " page change __CONFIG _PWRTE_ON & _XT_OSC & _WDT_OFF ; config.switches #define PB1 PORTB, 4 ; Pushbutton #1, generates a '0' bit #define PB2 PORTB, 5 ; Pushbutton #2, generates a '1' bit #define LED1 PORTB, 3 ; LED #1 #define LED2 PORTB, 0 ; LED #2 ; register usage: CBLOCK H'C' combo ; holds combination count ; general count register codevalue ; holds code value cntmsec ; used to count milliseconds ENDC ORG 0 ; start a program memory location zero goto main ; jump over the interrupt routine ;----------------------------------------------------------------------; ; Initialize the ports etc. ; ;----------------------------------------------------------------------; init: movlw B'00000000' ; all bits low in W tris PORTA ; contents of W copied to PORT A ... movlw B'00110000' ; Rb4,RB5 inputs, all other output tris PORTB ; into PORT B clrf PORTB ; LEDs blanked movlw 0 option ; Port B pullups enabled return ;----------------------------------------------------------------------; ; Read a byte from the data EEPROM at address given in W ; ;----------------------------------------------------------------------; readee movwf EEADR ; set up eeprom address from W bsf STATUS,RP0 ; change to page 1 bsf EECON1,RD ; set the read bit bcf STATUS,RP0 ; back to page 0 movf EEDATA,W ; return value in W return ;----------------------------------------------------------------------; ; This routine writes a byte to data EEPROM ; ; set up EEADR and EEDATA before entry ; ;----------------------------------------------------------------------; writee: bsf STATUS,RP0 ; enter page 1 clrf EECON1 bsf EECON1,WREN ; enable write movlw H'55' ; magic sequence movwf EECON2 movlw H'AA' movwf EECON2 bsf EECON1,WR eeloop: btfsc EECON1,WR ; wait for WR to go low goto eeloop ; not yet bsf EECON1,WREN bcf EECON1,EEIF ; clear the interrupt flag bcf STATUS,RP0 ; return to page 0 movlw D'10' ; delay to 'burn' in call nmsec return ;----------------------------------------------------------------------; ; Enter Code ; ;----------------------------------------------------------------------; entercode: movlw 1 ; flash once call flashleds movlw 8 ; set up to count 8 presses movwf count waitboth: btfss PB1 ; wait until pushbutton 1 up goto waitboth btfss PB2 ; and pushbutton 2 up goto waitboth call msec20 ; bypass any bouncing bcf LED1 bcf LED2 eitherbutton: ; wait until either button pressed comf PORTB, W ; compliment of Port B in W andlw B'00110000' ; look at buttons, ( 0's if up) btfsc STATUS, Z ; skip if either pressed goto eitherbutton ; try again call msec20 ; debounce press (not in 32 kHz ver) bcf STATUS, C ; clear carry btfss PB1 ; if one pressed leave carry clear goto PB1pressed bsf STATUS, C ; else set carry goto $ + 3 ; skip over PB1pressed bsf LED1 ; turn LED1 on goto $ + 2 ; skip over bsf LED2 ; turn LED2 on rrf combo, f ; roll result into combo high bit decfsz count, f ; more presses necessary goto waitboth ; next press movf combo, W ; transfer result to W return ;----------------------------------------------------------------------; ; time delay routines ; ;----------------------------------------------------------------------; micro4 addlw H'FF' ; subtract 1 from 'W' btfss STATUS,Z ; skip when you reach zero goto micro4 ; more loops return onesecond: ; a subroutine that delays for 1 sec call msec250 call msec250 call msec250 call msec250 return msec20 movlw D'20' ; 20 msec delay entry point goto nmsec msec250: ; a subroutine to delay 250 msec movlw D'250' ;*** N millisecond delay routine *** nmsec: movwf cntmsec ; delay for N (in W) millisec msecloop: movlw D'248' ; 1 usec for load call micro4 ; this instruction is 995 usec nop ; 1 usec decfsz cntmsec,f ; 1 usec, (2 if skip taken) goto msecloop ; 2 usec, loop = 995+5 = 1 msec return ;----------------------------------------------------------------------; ; Flash the LEDs, number of flashes in W on entry ; ;----------------------------------------------------------------------; flashleds: movwf count flashloop: movlw H'F' movwf PORTB call onesecond + 2 ; 1/2 sec on movlw 0 movwf PORTB call onesecond + 2 ; 1/2 sec off decfsz count, f goto flashloop return ;----------------------------------------------------------------------; ; Get combo value and place it in EEPROM location 0 ; ;----------------------------------------------------------------------; setcombo: call entercode ; get desired press combination movwf EEDATA ; set up data and address movlw 0 movwf EEADR call writee ; save combo in EEPROM movlw 2 ; flash leds 2 times call flashleds ; (one additional when entering main) return ;----------------------------------------------------------------------; ; The Main routine ; ;----------------------------------------------------------------------; main: call init ; initialize registers etc. movf PORTB, W ; check both buttons pressed on pwr-up andlw B'00110000' ; look at buttons, (0's if down) btfsc STATUS, Z ; skip if both not presssed call setcombo ; if both press set the combination movlw 0 ; get combo from EEPROM address 0 call readee movwf codevalue ; save it mainloop: call entercode subwf codevalue, W ; is it same as code? btfss STATUS, Z ; zero set if yes goto mainloop movlw 5 ; sucess, unlocking procedure would ... call flashleds ; be placed here. goto mainloop org 2100 ; this is location of EEPROM data dw H'33' ; the initial value of location 0 ... ; is set to B'00110011' end ; end of program
file: /Techref/piclist/cheapic/combo4m.asm, 9KB, , updated: 2000/12/7 16:55, local time: 2024/8/31 16:47,
3.14.141.128:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://massmind.org/techref/piclist/cheapic/combo4m.asm"> piclist cheapic combo4m</A> |
Did you find what you needed? |
Welcome to massmind.org! |
The Backwoods Guide to Computer Lingo |
.