📄 zi nen.asm
字号:
;R/W=0 RS=P0.4 EN=P0.5 DB0~3=P0.0~3 12MHZ
;
RS EQU P0.4
EN EQU P0.5
RF EQU P2.3 ;无限信号接收位
NEI_MA_1 EQU 80H ;接收EV1527学习码起始地址
NEI_MA_2 EQU 150H ;接收EV1527编码起始地址
;/////////////////
;主程序:MAIN
;/////////////////
ORG 0000H
START:
AJMP MIAN
ORG 0003H ;外部中断
AJMP INT0 ;PHONE INT
;ORG 000BH ;C/T0 RS232通信波特率设定
ORG 0013H
AJMP INT1 ;语音中段
ORG 001BH ;C/T1 INT CLOCK
AJMP PITO_0
ORG 0023H
AJMP RS232 ;串行通信
ORG 0100H
MAIN:
MOV SP, #60H ;确立堆放区
CLR RS0 ;用第一组寄存器
CLR RS1
MOV TMOD, #12H
MOV TH0, #FDH
MOV TL0, #FDH ;波特率为9600
MOV TL1, #0B1H ;定时器初始话 50ms X 20次==1S
MOV TH1, #3CH
SETB TR1
SETB TR0
MOV SCON, #50H ;设置通信方式1, REN=1
SETB EA
SETB ET0
CLR ES ;禁止串行中断
MOV 80H, #14H ;20次为1S
MOV R1, #42H
MOV R2, #12H
MOV @R1, #00H ;显示缓冲单元清零
LCALL MT8880C_INT ;MT8880C初始化
LCALL ISD25120_INT ;ISD25120初始化
LCALL INIT0_LCD ;LCD四位接口指令设置
LCALL INT1_LCD ;LCD初始化
XUN_HUAN:
ACALL KEY_XI_TONG ;调用进入系统检测
ACALL DISP_CLOCK ;调用显示时钟程序
LCALL WU_XIAN_JIAN_CE ;调用无线检测
LCALL ZHEN_LING_JIAN_CE ;调用振铃检测
LCALL DUAN_XIAN_JIAN_CE ;调用断线检测
SJMP XUN_HUAN ;循环进行系统检测
;////////////////////
;F检测程序
;///////////////////
KEY_XI_TONG:
ACALL KEY ;查询按键
CJNE A, #03H, TUI_CHU ;没按下F键 转移退出
ACALL KEY
CJNE A, #00H, TUI_CHU ;*
ACALL KEY
CJNE A, #00H, TUI_CHU ;*
ACALL KEY
CJNE A, #06H, TUI_CHU ;**9 ENTER PASSWORD
ACALL B_1 ;B SOUND
ACALL DISP_LIST ;DISPLAY "ENTER PASSWORD" IN LINE_1
ACALL PASSWORD ;调用密码查询子程序
CJNE A, #01H, TUI_CHU ;PASSWORD IS ERR TUI_CHU
;密码正确
SHE_ZHI:
MOV A, #0AH ;10秒定时
ACALL S_KEY_JIAN_CE ;调用秒定时检测按键,10秒内无正确信息退出
CJNE A, #00H, TUI_CHU ;*键
ACALL S_KEY_JIAN_CE
CJNE A, #00H, TUI_CHU ;*键
ACALL S_KEY_JIAN_CE ;**0~**F
MOV DPTR, #BRTAB ;分支程序
MOVC A, @A+DPTR ;查表转移
JMP @A+DPTR
BRTAB: DB BR0-BRTAB ;**0
DB BR1-BRTAB ;**1
DB BR2-BRTAB ;**2
DB BR3-BRTAB
DB BR4-BRTAB
DB BR5-BRTAB
DB BR6-BRTAB
DB BR7-BRTAB
DB BR8-BRTAB
DB BR9-BRTAB
DB BRA-BRTAB
DB BRB-BRTAB
DB BRC-BRTAB
DB BRD-BRTAB
DB BRE-BRTAB
DB BRF-BRTAB
DB BR10-BRTAB
BR0:
;//////////////////////
;改密码程序
;//////////////////////RAM 36H~3CH
BR1: ACALL B_1 ;B SOUND
MOV R1, #35H ;,密码暂存36H~3BH
MOV R0, #06H
GAI_PASSWORD:
INC R1
ACALL KEY
MOV @R1, A
DJNZ R0, GAI_PASSWORD
ACALL KEY
CJNE A, #00H, TUI_CHU ;第七次不是*号退出
MOV R6, #00H ;再次输入密码并和第一次比较
MOV R1, #3BH ;PASSWORD SAVE IN 3CH~41H
MOV R0, #06H
GAI_PASSWORD_1:
INC R1
ACALL KEY
MOV @R1, A
DJNZ R0, GAI_PASSWORD_1 ;六次
MOV R1, #36H ;取第一次密码
MOV R0, #3CH ;取第二次;;
MOV R7, #06H ;比较6次
MOV R6, #00H ;比教次数清零
ACALL COMPARE_2 ;调用密码比较子程序
CJNE A, #01H, TUI_CHU ;密码错误退出
MOV R0, #29H
MOV R1, #44H
MOV R2, #06H
GAI_PASSWORD_2:
INC R0 ;密码保存在30H~35H
INC R1
MOV A, @R1
MOV @R0, A
DJNZ R2, GAI_PASSWORD_2
ACALL B_2
;///////////////
;接收无线模块 EV1527
;/////////////// 1: 12CLK高,4LCK低, 0:4LCK高,12LCK低
BR2:
LCALL B_1
MOV 52H, #00H ;秒计时清零
MOV R1, NEI_MA ;RAM首地址
LCALL WU_XIAN_1
PPP1:
MOV 52H, #00H ;秒计时清零
WU_XIAN_6:
JB RF, WU_XIAN_7 ;P2.3为高转
MOV A, 52H
SUBB A, #05H ;
JNC WU_XIAN_6 ;小于5秒继续
AJMP TUI_CHU ;退出
MOV R5, #04H ;共五组EV1527遍码
WU_XIAN_7:
MOV R6, #38H ;4+124+16x20=448CLK=43.68ms
WU_XIAN_8:
ACALL DELAY_2 ;延时0.78ms
JB RF, TUI_CHU
DJNZ R6, WU_XIAN_8 ;56x0.78=43.68ms=440CLK
MOV R3, #04H ;4bit
JNB RF, $ ;等待数据位
PPP2:
ACALL DELAY_2 ;延时0.78ms(8CLK) 1: 12CLK高,4LCK低, 0:4LCK高,12LCK低
MOV C, RF
JNC C, WU_XIAN_9 ;C为0转
JB RF, $ ;为1等待
WU_XIAN_9:
MOV ACC.0, C
RL A
DJNZ R3, PPP2
MOV @R1, A ;存入RAM
INC R1
DJNZ R5, WU_XIAN_7 ;不够4组转
LJMP TUI_CHU
DELAY_1:
MOV R4,#20 ;延时子程序1,精确延时380微秒
D1:
MOV R7,#20
DJNZ R7,$
DJNZ R4,D1
RET
DELAY_2:
MOV R4,#10 ;延时子程序2,精确延时780微秒
D2:
MOV R7,#235
DJNZ R7,$
DJNZ R4,D2
RET
BR3:
BR4:
BR5:
BR6:
BR7:
BR8:
BR9:
BRA:
BRB:
BRD:
BRE:
BRF:
BR10:NOP
TUI_CHU:
MOV A, 01H
LCALL W_COM ;清屏
LCALL DISP_CLOCK ;调用显示CLOCK
RET ;返回
;//////////////////
;无线检测子程序
;/////////////////
WU_XIAN_JIAN_CE:
JNB RF, WU_XIAN_TUI
MOV R1, NEI_MA_2
ACALL WU_XIAN_1
WU_XIAN_TUI:
RET
;////////////////
;接收EV1527一帧数据
;///////////////R1存接收起始地址,
WU_XIAN_1:
JB RF, WU_XIAN_2 ;P2.3为高转
MOV A, 52H
SUBB A, #05H ;
JNC WU_XIAN_1 ;小于5秒继续
AJMP TUI_CHU ;退出
WU_XIAN_2:
ACALL DELAY_1 ;延时0.38ms
JB RF, $ ;避开0.39ms的高电平 4LCK
WU_XIAN_3:
MOV R6, #0FH ;15
ACALL DELAY_2 ;延时0.78ms 8LCK
JB RF, TUI_CHU
DJNZ R6, WU_XIAN_3 ;15x0.78=12ms=120LCK
JNB RF, $ ;等到124LCK的同步码结束
MOV R5, #03H ;需3个字节保存
PPP:
MOV R3, #08H ;8bit
WU_XIAN_4:
JNB RF, $ ;等待高电平
ACALL DELAY_2 ;延时0.78ms(8CLK) 1: 12CLK高,4LCK低, 0:4LCK高,12LCK低
MOV C, RF
JNC C, WU_XIAN_5 ;C为0转
JB RF, $ ;为1等待
WU_XIAN_5:
MOV ACC.0, C
RL A
DJNZ R3, WU_XIAN_4
MOV @R1, A ;存入RAM
INC R1
DJNZ R5, PPP
RET
;////////////////////
;密码检测子程序
;////////////////////RAM 30~42H
;R0, R1, R6, R7
PASSWORD: ;ENTER PASSWORD 30~35H 37-42H
CLR P2.4 ;指示灯亮
MOV R6, #03H ;3次输入密码
PASSWORD_1:
MOV R1, #06H ;6 BIT PASSWORD
MOV R0, #37H ;暂存37H~42H
READ:
ACALL KEY
MOV @R0, A
DJNZ R1, COMPARE_1 ;取按键六次,转比较
INC R0
SJMP READ
COMPARE_1: ;比较六位数密码
MOV R1, #30H ;原密码
MOV R0, #36H ;要较正的密码
MOV R7, #06H ;比较六次
COMPARE_2:
MOV A, @R1
CJNE A, @R0, COMPARE_3 ;ERR转移
INC R1
INC R0
DJNZ R7, COMPARE_2
ACALL KEY
CJNE A, #02H, COMPARE_3 ;没按#键错误
MOV A, #01H ;密码已正确把正确标志01H送A
ACALL B_1
ACALL B_1 ;DD两声
SJMP COMPARE_5
COMPARE_3:
MOV A, R6 ;错误后还可输入
CJNE A, #00H, COMPARE_4 ;不是最后一次转
ACALL B_C3 ;三声长响
SETB P2.4 ;指示灯灭
SJMP COMPARE_5 ;密码不正确返回
COMPARE_4:
ACALL B_3 ;DDD三声
DEC R6
SJMP PASSWORD_1 ;重新检测密码
COMPARE_5:
RET
;//////////////////
;秒定时按键检测子程序
S_KEY_JIAN_CE:
CJNE A, 52H, S_KEY_0 ;52H秒计时加1
MOV A, #10H ;让程序查表退出
SJMP S_KEY_1 ;大于设定的秒数则退出系统
S_KEY_0:
ACALL KEY
S_KEY_1:
RET
;//////////////////
;显示时钟子程序
;//////////////////
DISP_CLOCK:
MOV R3, #06H
MOV R0, #77H
MOV R5, #0DH
MOV 79H, #0AH ;显示:
MOV 7CH, #0AH ;显示:
DISP_CLOCK_1:
MOV B, R5 ;显示地址送B
MOV A, @R0 ;显示数据0~9
LCALL LCDP1
DEC R5
INC R0
DJNZ R3, DISP_CLOCK_1
RET
;/////////////////////////----------------------------------INT0
;定时器中断
;定时中断0 , RS0=1 RS1=0
;DISPLAY 2000 12 12 12:00:00 75H,77H,79H为空格
;RAM 70H为秒 71H为: 72H为分 73H为: 74为时 76H为日,78H为月,7A~7BH为年
;////////////////////////
PITO_0:
PUSH PSW
PUSH ACC
CLR RS1 ;用第二组寄存器
SETB RS0
MOV TL1, #0B1H ;重装定时初值
MOV TH1, #3CH
MOV A, 80H
DEC A
MOV 80H, A
JNZ A, RET0 ;不满20次反回
MOV 30H, #14H
MOV R0, #70H
ACALL ADD_1 ;加1
MOV A, @R0
XRL A, #60H ;=60S?
JNZ RET0 ;A不为0转
ACALL CLR0 ;显示缓冲单元清零
MOV R0, #72H ;分缓冲单元
ACALL ADD_1
MOV A, @R0
XRL A, #60H
JNZ RET0
ACALL CLR0
MOV R0, #74H ;时缓冲单元
ACALL ADD_1
MOV A, @R0
XRL A, #24H
JNZ RET0
ACALL CLR0
MOV R0, #76H ;日缓冲单元
LCALL ADD_1
MOV A, @R0
RET0:
POP ACC
POP PSW
RETI ;中断反回
ADD_1:
INC 52H ;秒计时加1
; MOV A, @R0
; DEC R0
; SWAP A ;十位数占高十位,
; ORL A, @R0 ;个位数占低四位 合并
; ADD A, #01H ;合并后加1
; DA A
; MOV R2, A
; ANL A, #0FH ;取出个位数
; MOV @R0, A ;送缓冲单元
; MOV A, R2
; ANL A, #F0H ;取十位数
; SWAP A ;十位数占低四位
; MOV @R0,
; RET
MOV A, @R0
ADD A, #01H
DA A
MOV @R0, A
CLR0: CLR A
MOV @R0, A ;清个位
; DEC A
; MOV @R0, A ;清十位
RET
;/////////////////--------------------------KEY
;循检按键子程序
;RAM 50~51H
;////////////////
KEY:
MOV 52H, #00H ;秒计时,连续15秒内没任何按键则退出
KEY_0:
MOV 50H, #FEH ;1111 1110
MOV 51H, #03H ;列值
MOV R2, #00H ;行值
MOV R3, #04H ;次数
KEY_1:
MOV P1, 50H
MOV R4, P1
MOV A, R4 ;读取键直
CJNE A, 50H, KEY_2 ;有键按下,转移
MOV A, 50H
RL A
MOV 50H, A
INC R2
DJNZ R3, KEY_1 ;没四次继续
ACALL DISP_CLOCK ;没按键调显示程序clock
MOV A, 52H
CJNE A, 0FH, KEY_0 ;不够十五秒可继续扫描
LJMP TUI_CHU ;大于15秒,系统退出
KEY_2:
MOV 52H, #00H ;秒计时清零
PUSH A
MOV A, P1
CJNE A, 50H, KEY_2 ;等待按键放开
SETB C
POP A
KEY_3:
RLC A
JNC KEY_4
DEC 51H
SJMP KEY_3
KEY_4:
MOV B, #04H ;计算键值+==(行X4)+列
MOV A, R2
MUL AB
ADD A, 51H
PUSH A
POP A
RET
;/////////////////////----------------------------FMQ
;蜂鸣器子程序
;/////////////////////
B_1:
CLR P3.4 ;B 短响
ACALL DE ;短延时
SETB P3.4
RET
B_2: CLR P3.4 ;B 长响
BB: MOV R3, #0C8H ;延时0.5S
DJNZ R3, BB
MOV R4, #0FAH
SETB P3.4
RET
B_3: ;BBB
ACALL B_1
ACALL B_1
ACALL B_1
RET
B_4: ACALL B_2 ;B....B....B....
ACALL B_2
ACALL B_2
RET
;//////////////////////---------------------------LCD
;LCD初始化
;/////////////////////
INT1_LCD:
MOV A, #00H
ACALL W_COM
MOV R3, #0FH ;LCD处始话 DELAY15MS
ACALL DELAY
MOV A, #28H
ACALL W_COM
MOV R3, #05H ;DELAY 5MS
ACALL DELAY
MOV A, #28H
ACALL W_COM
MOV R3, #05H ;DELAY 5MS
MOV A, #28H
ACALL W_COM
;/////////////////
;LCD 4 位接口指令设置
;////////////////
INIT0_LCD:
MOV P0,#03H ;RS=0 R/W=0 D4~D0=0011
ACALL EN1
MOV P0,#03H
ACALL EN1
MOV P0,#03H
ACALL EN1
MOV P0,#02H ;启动4位接口指令
ACALL EN1 ;RS=0 R/W=0 D7~D4=0010
ACALL INIT_LCD1 ;LCD指令设置初始化
RET
;/////////////////
;写数据
;/////////////////
LCD_W_DATA:
SWAP A ;写入高字节数据
MOV P0, A
SETB RS
CLR EN
CLR EN
SETB EN
SWAP A ;写入低字节数据
SETB RS
CLR EN
CLR EN
SETB EN
RET
;///////////////
;写命令
;//////////////
LCD_W_COM:
SWAP A ;写入高字节命令
MOV P0, A
CLR RS
CLR EN
CLR EN
SETB EN
SWAP A ;写入高字节命令
CLR RS
CLR EN
CLR EN
SETB EN
RET
;///////////////
;LCD_W_CHAR: 写一个字符
;///////////////字符缓冲R2,R3为XPOS,R4为YPOS
LCD_W_CHAR:
MOV A, R3
ANL A, #0FH ;限定X不能大于15
MOV R3, A
MOV A, R4
ANL A, #01H ;Y不能大于1
MOV R4, A
MOV A, R3
CJNE R4, #01H, W_CHAR_1
ADD A, #40H ;第二行加40H
W_CHAR_1:
ADD A, #80H
ACALL LCD_W_COM ;写地址
MOV A, R2
ACALL LCD_W_DATA ;写数据
RET
;//////////////////
;LCD_W_STR: 写一串固定字符
;/////////////////字符缓冲R2,R3为XPOS,R4为YPOS
LCD_W_STR:
; MOV DPTR, #TABLE_2 ;查表地址
MOV A, #00H
LCD_W_STR_1:
MOVC A, @A+DPTR
MOV R2, A
ACALL LCD_W_CHAR
INC R3 ;X地址加1
CJNE R2, #00H, LCD_W_STR_1
RET
;////////////////
;LCD_CHA_CHAR: 显示一个固定字符0~#
;////////////////字符缓冲R2,R3为XPOS,R4为YPOS
LCD_CHA_CHAR:
MOV DPTR, #TABLE_1 ;查表地址
MOVC A, @A+DPTR ;要显示的字符表送R2
MOV R2, A
ACALL LCD_W_CHAR ;显示
RET
;/////////////////
;EN短脉冲可不要
;///////////////
EN1:
SETB EN
ACALL DE
CLR EN
ACALL DE
RET
;//////////////
;短暂延迟
;/////////////
DE: MOV R7,#5
DJNZ R7,$
RET
;//////////////
;延时 R3 ms
;//////////////
DELAY: MOV 78H, #C8 ;延时
NOP
NOP
DJNZ 78H, DELAY
DJNZ R3, DELAY ;DELAY R3 MS
RET
TABLE_1:DB 30H ;0
DB 31H ;1
DB 32H
DB 33H
DB 34H
DB 35H
DB 36H
DB 37H
DB 38H
DB 39H ;9
DB 3AH ;:
DB 2AH ;*
DB 46H ;F
DB 23H ;#
TABLE_2:DB 45H, 4EH, 54H, 45H, 58H, 50H, 41H, 53H, 53H, 57H, 4FH, 52H, 44H, 00H ;ENTER PASSWORD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -