piccodelock_PIC16F84
Code:
'**************************************************************** '* Name : CodeLock.bas * '* Author : LonelyCatSoft * '* Date : 30.03.2012 * '* Version : 1.0 * '* Notes : Programable Code Lock with the PIC-16F84 * '**************************************************************** 'Ma khoa duoc nhap tu ban phim ma tran 4x3. 'Mat khau mac dinh la: 1234 'De thay doi mat khau hien tai, vi du la 1961, ta an: 1234*1961#1961# @ device xt_osc, wdt_off, pwrt_on, protect_off '************************************************** RL1_ON_time con 1000 * 3 'sec. Relay ON time '************************************************** TrisA = 0 ' PORTA, all outputs PortA = 16 ' turn off Buzer OPTION_REG.7 = 0 ' PORTB Pullups. TrisB = 0000 ' PORTB.0-3 outputs, 4-7 inputs PortB = 0 LD1 var PortA.2 RL1 var PortA.3 BUZ var portA.4 cnt var byte key var byte col var byte row var byte keycnt var byte pwOK var bit keybuf var byte[15] pwbuf var byte[4] EEPROM 0,[1,2,3,4] 'Default password 1,2,3,4 programmed at EEprom location 0..3 Read 0, pwbuf[0] 'Copy password from EEprom address 0..3 in to pwbuf[0..3] Read 1, pwbuf[1] Read 2, pwbuf[2] Read 3, pwbuf[3] pwOK = 0 keycnt = 0 Main: high ld1 gosub Chk_KEYPAD pause 1 goto Main Chk_KEYPAD: for row = 0 to 3 PORTB = (dcd row) ^ $f pause 1 col = PORTB >> 4 if (col <> $f) then 'key pressed key = (row * 3) + (ncd (col ^ $f)) gosub Got_KEY key = 255 endif next return Beep: low ld1 low buz pause 40 high buz return Got_KEY: gosub Beep while (PORTB >> 4) <> $f pause 1 wend if key = 11 then key = 0 keybuf[keycnt] = key gosub Chk_keycnt return Chk_PwOK: PwOK = 0 if (keybuf[0] = pwbuf[0]) and (keybuf[1] = pwbuf[1]) and (keybuf[2] = pwbuf[2]) and (keybuf[3] = pwbuf[3]) then pwok = 1 return Chk_NewPwOK: PwOK = 0 if (keybuf[5] = keybuf[10]) and (keybuf[6] = keybuf[11]) and (keybuf[7] = keybuf[12]) and (keybuf[8] = keybuf[13]) then pwok = 1 return Pw_Change: pwbuf[0] = keybuf[5] pwbuf[1] = keybuf[6] pwbuf[2] = keybuf[7] pwbuf[3] = keybuf[8] Write 0, pwbuf[0] 'Store new password to EEprom location 0..3 Write 1, pwbuf[1] Write 2, pwbuf[2] Write 3, pwbuf[3] return Chk_keycnt: select case keycnt case 4 gosub Chk_PwOK if pwOK then if keybuf[keycnt] = 12 then Access_OK if keybuf[keycnt] <> 10 then Clr_keybuf gosub Beep else goto Clr_keybuf endif case 9 if keybuf[keycnt] <> 12 then Clr_keybuf gosub Beep case 14 if keybuf[keycnt] <> 12 then Clr_keybuf gosub Beep gosub Chk_NewPwOK if pwOK then gosub Beep gosub Pw_Change gosub Beep goto Clr_keybuf else goto Clr_keybuf endif case else if keybuf[keycnt] = 12 then Clr_keybuf end select keycnt = keycnt + 1 return Access_OK: High RL1 pause RL1_ON_time low RL1 Clr_keybuf: for cnt = 0 to 14 keybuf[cnt] = cnt next keycnt = 0 goto Main end
piccodelock_PIC16F84.rar
Comment