第五章 软件流程框图及调试结果
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页