📄 pplctn.asm
字号:
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:SETB P1.7;锁门吹灯
SETB P1.4;打开三态门
LCALL NK;调用钮扣程序
JNC NK;若C为0(无应答或CRC错)则再调用钮扣程序发脉冲
LCALL READROM;从EEPROM读入密码
MATCH:MOV B,#07H;比较密码是否匹配
MOV R0,#40H;外部输入密码存储的地址
MOV R1,#5FH;从EEPROM读入密码存储的位置
LL: MOV A,@R0;
INC R0;
INC R1;
XRL A,@R1;比较
JZ TT;出现不匹配则重新开始
DJNZ B,LL;循环比较所有字节
CLR P1.7;全部匹配则开锁
TT:SJMP MAIN;
NK: PUSH B;
CLR P1.5;主程序先在总线上产生高电平
CLR C;清软件标志位
LCALL RESET;进入复位与应答时隙
JNC WAIT;若C为0则再去发复位脉冲
MOV A,#0F0H;READROM指令
LCALL BYTE;发送READROM指令
MOV B,#08H;读入字节数
MOV R1,#00H;CRC初始化
READ:MOV A,#00H;发送00H在读入数据时释放总线
LCALL BYTE;读入数据
PUSH ACC;保存读入的数据
DJNZ B,READ;循环读入
MOV B,#08H;需存储的字节数
DIZHI:MOV R0,#047H;RAM地址
PO: POP ACC;
MOV @R0,A;将读入的数据存入RAM
DEC R0;
DJNZ B,PO;循环储存读入数据
CRC:MOV R0,#3FH;地址
MOV B,#07H;需校验的字节数
MOV R1,#00H;CRC变量初始化
GG: INC R0;
MOV A,@R0;
LCALL DOCRC;
DJNZ B,GG;循环计算CRC变量
INC R0;CRC校验码地址
MOV A,@R0;装入CRC校验码
XRL A,R1;比较CRC校验码一致否
JZ SUCCESS;
SJMP FAILURE;
SUCCESS: SETB C;一致则置位软件标志位
SJMP WAIT;
FAILURE: CLR C;不一致则复位软件标志位
WAIT:POP B;
RET
RESET: PUSH B;
PUSH ACC;
SETB P1.5;发送复位下降沿
MOV B,#0FAH;设置复位脉冲保持时间
DJNZ B,$;复位脉冲至少保持480uS
CLR P1.5;释放总线产生上升沿
MOV B,#08H;设置DS的等待时间
CLR C;设置软件标志位
WAITLOW:JNB P2.2,WH;有应答脉冲则跳到WH
DJNZ B,WAITLOW;监测是否有应答脉冲
SJMP SHORT;没有应答则再去发复位脉冲
WH: MOV B,#01EH;要求应答脉冲保持一段时间
HL: ORL C,P2.2;若C为0则不响应此下降沿
DJNZ B,HL;要求检验到DS释放总线
SHORT:POP ACC
POP B
RET
BYTE:PUSH B;发送读入子程序
MOV B,#08H;指令和数据的8位
BITLOOP:RRC A;右移指令一位
LCALL TOUCHBIT;发出又读入
DJNZ B,BITLOOP;循环右移
RRC A;再循环一次
POP B;
RET
TOUCHBIT:SETB P1.5;发送接收结合子程序先给下降沿
NOP
MOV P1.5,C;发送一位
SETB P2.2;输入先写1
MOV C,P2.2;读入一位
PUSH B
MOV B,#12H
DJNZ B,$;延时到tSOLT
POP B
CLR P1.5;发送读入结束后释放总线
RET
DOCRC:PUSH ACC;计算CRC变量子程序
PUSH B;
PUSH ACC;
MOV B,#8;
CRC_LOOP:XRL A,R1;
RRC A;
MOV A,R1;
JNC ZERO;
XRL A,#018H;
ZERO:RRC A;
MOV R1,A;
POP ACC;
RR A;
PUSH ACC;
DJNZ B,CRC_LOOP;
POP ACC;
POP B;
POP ACC;
RET
READROM:MOV A,#03H;发送读指令
MOV B,#08H;发送的指令位数
CLR P1.3;X25045的SCK置低
CLR P1.2;CS置低
ACALL TRANSFER;调发送子程序发送READ
MOV A,#01H;发送X25045地址
MOV B,#08H;
ACALL TRANSFER;发送地址
MOV R3,#07H;总共需要读入CPU的字节数
MOV R1,#060H;RAM地址
RECE3:MOV B,#08H;读出X25045中的数据
RECE1:SETB P1.1;CPU输入前写一
MOV C,P1.1;输入CPU
MOV ACC.0,C;赋值
RL A
SETB P1.3;SCK置高
CLR P1.3;SCK变低
NOP
DJNZ B,RECE1;CPU循环读入一字节
RR A
MOV @R1,A;将读出一字节的送CPU的RAM
INC R1
DJNZ R3,RECE3;
RET
TRANSFER:NOP
MOV C,ACC.7 ;a的最高位送Cy
MOV P1.0,C ;将Cy送X25045的SI
SETB P1.3 ;SCK置高
RL A ;a左移一位
CLR P1.3 ;SCK变低
DJNZ B,TRANSFER ;循环8次
CLR P1.7 ;将SI变低
RET
DELA1ms:MOV TMOD,#00H;1mS延时子程序
MOV TL0,#18H
MOV TH0,#0E0H
SETB TR0
LOOP:JBC TF0,NEXT
SJMP LOOP
NEXT:MOV TL0,#018H
MOV TH0,#0E0H
SETB P1.2
RET
DELA3ms:MOV TMOD,#00H;3mS延时子程序
MOV TL0,#0CH
MOV TH0,#0A2H
SETB TR0
LOOP1:JBC TF0,NEXT1
SJMP LOOP
NEXT1:MOV TL0,#0CH
MOV TH0,#0A2H
SETB P1.2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -