密码锁—微机原理及应用课程设计报告 下载本文

第五章 软件流程框图及调试结果

5.1 主程序流程图 错误次数到6次? 报警 返回 PIN比较-相清楚PIN 写PIN 写时间 门铃呼叫 覆盖上次输入的数输入数据有6位? 是数字键? 是功能键? 转对应的功能键 有键按下? 开机显示HELLO 初始化 保存键盘 OK ESC SET TIMESET CALL 输入限制次数减一 驱动电磁锁 图3 软件流程图

第 12 页 共 33页

5.2 程序源代码

;************************************************************ ;按键分布 ; 0 1 2 3 ; 4 5 6 7 ; 8 9 -- -- ; CALL SET ESC OK ;P3.0连接黄灯,表示锁合 ;P3.1连接绿灯,表示锁开启

;P3.2连接红灯,表示输入六次密码均有误

;------------------------------------------------------------------ ;输入

;行线低4位P1.0~P1.3 IN EQU P1

;列线高4位P1.4~P1.7 ;输出

DOUT EQU P2

;显示 段码P0,位码P2.0~P2.5 DCOUT EQU P2.6 ;电磁驱动机构 SPOUT EQU P2.7 ;报警驱动 ;数据

RDS EQU 23H ;23H~26H,6个数据存储单元来存放密码 ;标志

FLAGE1 EQU 21H ;数据输入标志 TEMP EQU 22H

;------------------------------------------------------------------ ;器件地址定义

AT24C02 EQU 0A0H ;0A0/0A1,W/R ;------------------------------------------------------------------ ;I2C总线及信号线定义 SDA BIT P3.7 SCL BIT P3.6

;------------------------------------------------------------------ ;为I2C软件包定义 ACK BIT 00H ;应答标志位变量 SLA DATA 40H ;器件从地址变量 SUBA DATA 41H ;器件子地址变量 NUMBYTE DATA 42H ;读/写的字节数变量 ;------------------------------------------------------------------ ;常量定义

第 13 页 共 33页

MTD EQU 30H ;发送数据缓冲区首址(30H~35H) MRD EQU 36H ;接受数据缓冲区首址(36H~3CH) ;------------------------------------------------------------------

;****************************************************************** ;主程序开始

;****************************************************************** ORG 0000H LJMP ZSTART ORG 0040H

ZSTART: MOV SP,#70H ST0: MOV TEMP,#00H ;错误记录 MOV DPTR,#TAB0 ;将TAB0的首地址赋给DPTR MOV R0,#RDS ;给R0赋地址初值 MOV R2,#6

CLR A ;清楚A

ST1: MOV @R0,A ;6个数据存储区清零 INC R0

DJNZ R2,ST1 MOV R2,#0

DSPL0: LCALL DISPLAY2 ;开机显示HELLO! LCALL DISPLAY2 DJNZ R2,DSPL0 DSPL1: LCALL DISPLAY2 LCALL DISPLAY2 DJNZ R2,DSPL1 MOV R0,#RDS ;占用R0

SETB P3.0 NOP CPL P3.0

;------------------------------------------------------------------- ;键盘扫描

K1: MOV IN,#0FEH ;第一行 111111110 NOP

MOV A,IN

CJNE A,#0FEH,K10S ;有键按下,转K10 K2: MOV IN,#0FDH ;第二行 NOP

MOV A,IN

CJNE A,#0FDH,K20S ;有键按下,转K20

第 14 页 共 33页

K3: MOV IN,#0FBH ;第三行 NOP

MOV A,IN

CJNE A,#0FBH,K30S ;有键按下,转K30 K4: MOV IN,#0F7H ;第四行 NOP

MOV A,IN

CJNE A,#0F7H,K40S ;有键按下,转K40 LCALL DISPLAY JNB FLAGE1.0,K1 LCALL SP_OUT SJMP K1 ;返回循环扫描按键 K10S: LJMP K10 K20S: LJMP K20 K30S: LJMP K30 K40S: LJMP K40 SJMP ST0 ;---主程序结束---

;--------------------------------------------------------------------- ;第一行

K10: MOV B,A ;数据暂存 LCALL DELAY10MS ;延时去干扰 MOV A,IN ;再次读输入 CJNE A,B,K2 ;判断按键是否真的按下,否则退出,继续扫描下一列

LCALL DELAY10MS ;延时去干扰 K11: MOV A,IN ;再次读输入 CJNE A,B,D11 ;判断按键是否弹起 SJMP K11 ;等待弹起 ;判断一行中是哪个键按下 D11: MOV A,B ;判断一行中是哪个按键按下 CJNE A,#7EH,D12 ;判断输入数据是否大于6个 CJNE R0,#29H,D11S ;占用R0,数据覆盖 MOV R0,#RDS ;赋键值 D11S: MOV @R0,#0C0H ;地址加1 INC R0 ;返回继续扫描下列 LJMP K2

D12: CJNE A,#0BEH,D13 CJNE R0,#29H,D12S MOV R0,#RDS D12S: MOV @R0,#0F9H INC R0 LJMP K2

D13: CJNE A,#0DEH,D14

第 15 页 共 33页