📄 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 + -