?? mima.asm
字號:
//51密碼鎖源碼測試通過 沈建 2008
org 0000h
ajmp mian
mian:
acall lbaa
mov mrd,#40h ;讀密碼送顯示
mov numbyt,#6
mov ad24c01,#0
acall RDNBYT
acall lbaa
acall rpass
mov 30h,#0
mov 31h,#0
mov 3fh,#6
mov 33h,#40h
abc01:
acall keytest1
cjne a,#0eh,mmsr
mov 30h,#1
ajmp abc01
mmsr:cjne a,#0fh,mmsr1
mov a,30h ;是否修改密碼
cjne a,#3,mmxd2
acall wpass ;寫密碼
mov 41h,#0fh ;寫密碼顯示2位顯示f
mov 30h,#0
ajmp abc01
mmxd2:mov r0,#40h
mov r1,#46h
mov r7,#6
mmxd:mov a,@r0
mov b,@r1
inc r0
inc r1
cjne a,b,mmerr
djnz r7,mmxd
acall lbaa
mov a,30h
cjne a,#1,mmxd1 ;
mov 30h,#3
ajmp abc01
mmxd1:cjne a,#0,abc01 ;密碼正確
mov 43h,#0fh ;密碼開鎖3位顯示f
ajmp abc01
mmsr1:mov r0,33h
mov @r0,a
djnz 3fh,mmsr2
mov 3fh,#6
mov 33h,#40h
ajmp abc01
mmsr2:inc 33h
ajmp abc01
mmerr:acall lbaa
acall lbaa
acall lbaa
acall lbaa
acall lbaa
mov 40h,#0eh
mov 41h,#0eh
ajmp abc01
keytest1:acall display ;讀取鍵盤輸入
acall keytest
mov a,key
cjne a,#0ffh,keytest1f
ajmp keytest1
keytest1f:ret
wpass:mov mtd,#40h ;寫密碼
mov numbyt,#6
mov ad24c01,#0
acall WRNBYT
ret
rpass:mov mrd,#46h ;讀密碼
mov numbyt,#6
mov ad24c01,#0
acall RDNBYT
ret
; |-s6--e--| |--s7--7--| |--s8--4--| |--s9--1--|
;px.0 ---+--------------+------------+-------------+ |
; | | | |
; |-s10-0--| |--s11-8--| |--s12-5--| |--s13-2--|
;px.1 ----+--------------+------------+-------------+ |
; | | | |
; |-s14-f--| |--s15-9--| |--s16-6--| |--s17-3--|
;px.2-----+--------------+------------+-------------+ |
; | | | |
; |-s18-d--| |--s19-c--| |--s20-b--| |--s21-a--|
;px.3-----+--------------+------------+-------------+ |
; | | | |
;px.4--------------+ | | |
; | | |
;px.5------------------------------+ | |
; | |
;px.6-------------------------------------------+ |
; |
;px.7---------------------------------------------------------+
;aoke51 4*4鍵盤掃描程序
key equ 3bh ;鍵盤返回鍵值
keyp equ p3 ;鍵盤端口定義
keytest: mov keyp,#0fh
mov a,keyp
cjne a,#0fh,keynx ;判斷是否有鍵按下
mov key,#0ffh
ret
keynx:acall keyys ;延時程序
mov a,keyp
cjne a,#0fh,keynx1 ;判斷是否誤動作
ret
keynx1:mov key,#0ffh
mov keyp,#7fh
mov a,keyp
anl a,#0fh
cjne a,#0fh,key1
mov keyp,#0bfh
mov a,keyp
anl a,#0fh
cjne a,#0fh,key2
mov keyp,#0dfh
mov a,keyp
anl a,#0fh
cjne a,#0fh,key3
mov keyp,#0efh
mov a,keyp
anl a,#0fh
cjne a,#0fh,key4
keyerr:mov key,#0ffh
ret
key1: cjne a,#0eh,kye12
mov key,#1
ajmp keysf
kye12:cjne a,#0dh,key13
mov key,#2
ajmp keysf
key13:cjne a,#0bh,key14
mov key,#3
ajmp keysf
key14:cjne a,#07h,keyerr
mov key,#0ah
ajmp keysf
key2: cjne a,#0eh,kye22
mov key,#4
ajmp keysf
kye22:cjne a,#0dh,key23
mov key,#5
ajmp keysf
key23:cjne a,#0bh,key24
mov key,#6
ajmp keysf
key24:cjne a,#07h,keyerr
mov key,#0bh
ajmp keysf
key3:cjne a,#0eh,kye32
mov key,#7
ajmp keysf
kye32:cjne a,#0dh,key33
mov key,#8
ajmp keysf
key33:cjne a,#0bh,key34
mov key,#9
ajmp keysf
key34:cjne a,#07h,keyerr
mov key,#0ch
ajmp keysf
key4:cjne a,#0eh,kye42
mov key,#0eh
ajmp keysf
kye42:cjne a,#0dh,key43
mov key,#0
ajmp keysf
key43:cjne a,#0bh,key44
mov key,#0fh
ajmp keysf
key44:cjne a,#07h,keyerr
mov key,#0dh
ajmp keysf
keysf: mov keyp,#0fh
mov a,keyp
anl a,#0fh
cjne a,#0fh,keysfn
lbaa:mov r6,#255 ;喇叭
bbb:mov r7,#255
bba:djnz r7,bba
cpl p2.3
djnz r6,bbb
setb p2.3
ret
keysfn:acall display
ajmp keysf
keyys:mov r7,#9
keyys02: mov r6,#255
keyys01:djnz r6,keyys01
djnz r7,keyys02
ret
sda bit p2.0 ; 數據線定義
scl bit p2.1 ; 時鐘線定義
SLAW equ 0a0h ;
slar equ 0a1h ;
MRD equ 3eh ; 讀數據首地址
MTD equ 3dh ; 寫數據首地址
NUMBYT equ 3ch ; 讀寫數據位數
ad24c01 equ 3fh ;儲存器地址
;<<<<<<<<<<<<<<<<<<<<<<<<<I2C 軟件包
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<START
STA:SETB SDA
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<STOP
STOP:CLR SDA
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<MACK
MACK:CLR SDA
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<MNACK
MNACK:SETB SDA
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
reT
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<CACK
CACK:SETB SDA
SETB SCL
CLR F0
MOV C,SDA
JNC CEND
SETB F0
CEND:CLR SCL
NOP
RET
;*************************************************************************
;*
;* 名稱:WRBYT
;* 功能:寫一個字節到IIC ,不包括START,STOP操作
;* 調用函數:
;* 輸入:A=要寫的值
;* 輸出:
;* 使用寄存器:R7,A,C
;*
;*************************************************************************
WRBYT:MOV R7, #08H
WLP: RLC A
MOV SDA, C
SETB SCL
NOP
NOP
NOP
CLR SCL
DJNZ R7, WLP
RET
;*************************************************************************
;*
;* 名稱:WRNBYT
;* 功能:寫N個數到IIC
;* 調用函數:WRBYT,STA,CACK,STOP
;* 輸入:NUMBYT=輸出數個數,AD24C01=24C01的片內地址,MTD的值;
;* 輸出:輸出數在從MTD開始的緩沖區中
;* 使用寄存器:R7,A,C,R1,R0
;*
;*************************************************************************
WRNBYT:LCALL STA
MOV R0,NUMBYT
MOV A,#SLAW
LCALL WRBYT
LCALL CACK
JB F0, WRNBYT
MOV A,AD24C01
LCALL WRBYT
LCALL CACK
JB F0, WRNBYT
MOV R1, MTD
WRDA: MOV A, @R1
LCALL WRBYT
LCALL CACK
JB F0, WRNBYT
INC R1
DJNZ R0, WRDA
LCALL STOP
RET
;*************************************************************************
;*
;* 名稱:RDBYT
;* 功能:從IIC中讀一個字節到單片機中
;* 調用函數:
;* 輸入:
;* 輸出:A=要讀的值
;* 使用寄存器:R7,A,C
;*
;*************************************************************************
RDBYT:MOV R7, #08H
RLP:SETB SDA
SETB SCL
NOP
NOP
MOV C, SDA
RLC A
CLR SCL
NOP
NOP
DJNZ R7, RLP
RET
;*************************************************************************
;*
;* 名稱:RDNBYT
;* 功能:從IIC中讀N個數到單片機中
;* 調用函數:WRBYT,STA,CACK,STOP
;* 輸入:NUMBYT=從IIC中讀出數個數,AD24C01=24C01的片內地址, MRD的值;
;* 輸出:讀入數在從#MRD開始的緩沖區中
;* 使用寄存器:R7,A,C,R1,R0
;*
;*************************************************************************
RDNBYT:LCALL STA
MOV R0, NUMBYT
MOV A, #SLAW
LCALL WRBYT
LCALL CACK
JB F0, RDNBYT
MOV A,AD24C01
LCALL WRBYT
LCALL CACK
JB F0, RDNBYT
LCALL STA
MOV A,#SLAR
LCALL WRBYT
LCALL CACK
JB F0, RDNBYT
MOV R1, MRD
RDDA:LCALL RDBYT
MOV @R1, A
DJNZ R0, ACK
LCALL MNACK
LCALL STOP
RET
ACK:LCALL MACK
INC R1
SJMP RDDA
ret
;AOKE51 led顯示程序 顯示數據40h-46h
dula bit P2.6;led顯示器數據鎖存
wela bit P2.7;led顯示器位數鎖存
delayxms:mov r4,#4 ;r4,r5,r6用于延時 r6為參數x 延時1*x ms
delaya: mov r5,#40
nop
nop
djnz r5,$
djnz r4,delaya
djnz r6,delayxms
ret ;延時返回
display: mov r2,#06h ;顯示程序
mov r1,#40h
mov b,#0feh
MOV DPTR,#TABLE
dispnx:clr dula;
mov a,@r1
MOVC a,@A+DPTR
mov p0,a ;
setb dula;
clr dula;
clr wela;
mov P0,b;
setb wela;
clr wela;
mov r6,#5h
call delayxms
mov a,b
rl a ;顯示位數移動一位
mov b,a
inc r1 ;顯示地址加1
djnz r2,dispnx
ret ;六位顯示完成返回
table:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,
db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -