📄 24c02.asm
字号:
clk bit p2.5
dout bit p2.6
SDA BIT P3.5
SCL BIT P3.4
en bit p2.7
KEYBUF EQU 35H
KEY EQU 39H
DISPBUF EQU 20H
FLAG0 EQU 0
;***************************************************
ORG 000H
AJMP START
;***************************************************
ORG 0100H
START:
MOV R0,#7FH
CLR A
CLRRAM: MOV @R0,A
DJNZ R0,CLRRAM
MOV SP,#7DH
;***************************************************
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
;***************************************************
;初始化参数
;***************************************************
;主程序
;***************************************************
WAIT:
;***************************************************
LCALL KEYINPUT ;是否有键按下?
MOV A,FLAG0
CJNE A,#1,WAIT
MOV A,KEY
;***************************************************
CJNE A,#0BH, PANDUAN1
LJMP DISPMIMA
PANDUAN1: CJNE A,#0CH, PANDUAN2
LJMP CLRDISP
PANDUAN2: CJNE A,#0AH, PANDUAN3
LJMP SETMIMA
PANDUAN3:
LJMP WAIT
;******************************************************************************
;清屏: LED
;******************************************************************************
CLRDISP:
LCALL CLRLED ;LED显示6个0
LJMP WAIT
;**********************************************
;设置密码
;**********************************************
SETMIMA:
LCALL TIANC
MOV R3,#0A0H
MOV R4,#01H
MOV R1,#DISPBUF
INC R1 ;密码在DISPBUF+1处
MOV R7,#6
LCALL WR24C02
LJMP WAIT
;**********************************************
;填充显示缓冲区556688
TIANC:
MOV A,#DISPBUF
MOV R0,A
MOV A,#0H ;小数点位/不显示
MOV @R0,A
inc r0
mov a,#8H
mov @r0,a
inc r0
mov a,#08H
mov @r0,a
inc r0
mov a,#06H
mov @r0,a
inc r0
mov a,#06H
mov @r0,a
inc r0
mov a,#05H
mov @r0,a
inc r0
mov a,#05H
mov @r0,a
inc r0
mov a,#01H ;识别码=01
mov @r0,a
inc r0
mov a,#01H ;蜂鸣器鸣叫,二次分频
mov @r0,a
LCALL DELY10MS
RET
;*********************************************************
;****************************************************************************
;写串行E2PROM子程序WR24C02
; (R3)=10100000(命令1010+器件3位地址+读/写(1/0)。 器件地址:一个芯片是000)
; (R4)=片内字节地址
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
;****************************************************************************
WR24C02:
MOV P3,#0FFH
CLR SDA ; 发开始信号
MOV A,R3 ; 送器件地址
ACALL SUBS
MOV A,R4 ; 送片内字节地址
ACALL SUBS
AGAIN:
MOV A,@R1
ACALL SUBS ;调发送单字节子程序
INC R1
DJNZ R7,AGAIN;连续写n个字节
CLR SDA ;SDA置0, 准备送停止信号
ACALL DELAY2 ;延时以满足传输速率要求
SETB SCL ;发停止信号
ACALL DELAY2
SETB SDA
RET
SUBS:
MOV R0,#08H ;发送单字节子程序
LOOP11:
CLR SCL
RLC A
MOV SDA,C
NOP
SETB SCL
ACALL DELAY2
DJNZ R0,LOOP11 ;循环8次送8个bit
CLR SCL
ACALL DELAY2
SETB SCL
REP: MOV C,SDA
JC REP ;判应答到否,未到则等待
CLR SCL
RET
DELAY2:
NOP
NOP
NOP
NOP
NOP
NOP
RET
;*******************************************************************************************
;键盘处理子程序
;input: KEYBUF,TAB
;OUTPUT: KEY:键值
;出口:FLAG0=1 有按键
; 0 无
;*******************************************************************************************
KEYINPUT:
MOV KEYBUF,#2
;
MOV P0,#0FFH
CLR P0.4
MOV A,P0
ANL A,#0FH
XRL A,#0FH ;有键按下吗?
JZ NOKEY1
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH ;真的有键按下吗?
JZ NOKEY1
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK1 ;键码的值是多少?P0.4xP0.0
MOV KEYBUF,#3
LJMP DK1
NK1: CJNE A,#0DH,NK2 ;键码是P0.4xP0.1 ?
MOV KEYBUF,#2
LJMP DK1
NK2: CJNE A,#0BH,NK3 ;键码是P0.4xP0.2 ?
MOV KEYBUF,#1
LJMP DK1
NK3: CJNE A,#07H,NK4 ;键码是P0.4xP0.3 ?
MOV KEYBUF,#0
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查表,取键值
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK1A: MOV A,P0
ANL A,#0FH
XRL A,#0FH ;按键有没有松开?
JNZ DK1A
NOKEY1:
MOV P0,#0FFH
CLR P0.5
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#7
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#6
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#5
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#4
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK2A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
NOKEY2:
MOV P0,#0FFH
CLR P0.6
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#0bh
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#0ah
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#9
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#8
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK3A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
NOKEY3:
MOV P0,#0FFH
CLR P0.7
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#0fh
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#0eH
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#0dH
LJMP DK4
NK15: CJNE A,#07H,NK16
MOV KEYBUF,#0ch
LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK4A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
NOKEY4:
RET
;**********************************************
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10US:
MOV R6,#10
DJNZ R6,$
RET
DELY3US:
MOV R6,#3
DJNZ R6,$
RET
;/*********************************************************************/
; 清LED 显示6个0
;*********************************************************
CLRLED:
MOV R0,#DISPBUF
MOV A,#0H ;小数点位/不显示
MOV @R0,A
MOV A,#8
ADD A,R0
MOV R0,A ;R0=DISPBUF+8指向蜂鸣器设定位
MOV R1,A
DEC R1
DEC R1
MOV A,#0 ;蜂鸣器不鸣叫
MOV @R0,A
dec r0
mov a,#01H ;识别码=01
mov @r0,a
DEC R0
;
MOV R2,#0
SET0: ;缓冲区全填为0
MOV A,#0
MOV @R1,A
INC R2
DEC R1
CJNE R2,#6,SET0
LCALL TSLED
RET
;*********************************************************
;******************************************************************************
;显示密码
;******************************************************************************
DISPMIMA:
;
MOV R3,#0A0H
MOV R4,#01H
MOV R1,#DISPBUF
INC R1 ;密码在DISPBUF+1处
MOV R7,#6
LCALL RD24C02 ;读密码(从24C02)
LCALL SETXIAO ;设置小数位、识别码、蜂鸣器
LCALL TSLED ;在LED上显示密码
;****************************************************************************
;读串行E2PROM子程序RD24C02
;(R1)=欲读数据存放地址指针
;(R3)=10100001(命令1010+器件3位地址+读/写(1/0)。 器件地址:一个芯片是000)
;(R4)=片内字节地址
;(R7)=连续读字节数
;****************************************************************************
RD24C02:
MOV P3,#0FFH
; SETB SDA
; SETB SCL
; NOP
CLR SDA ;发开始信号
MOV R3,#0A0H
MOV A,R3 ;送器件地址
ACALL SUBS ;调发送单字节子程序
MOV A,R4 ;送片内字节地址
ACALL SUBS
MOV P3,#0FFH
CLR SDA ;再发开始信号
MOV A,R3
SETB ACC.0 ;发读命令
ACALL SUBS
MORE:
ACALL SUBR
MOV @R1,A
INC R1
DJNZ R7,MORE
CLR SDA
ACALL DELAY2
SETB SCL
ACALL DELAY2
SETB SDA ;送停止信号
RET
SUBR:
MOV R0,#08H ;接受单字节子程序
LOOP2:
SETB SCL
ACALL DELAY2
MOV C,SDA
RLC A
CLR SCL
ACALL DELAY2
DJNZ R0,LOOP2
CJNE R7,#01H,LOW1
SETB SDA ;若是最后一个字节置A=1
AJMP SETOK
LOW1:
CLR SDA ;否则置A=0
SETOK:
ACALL DELAY2
SETB SCL
ACALL DELAY2
CLR SCL
ACALL DELAY2
SETB SDA ;应答毕,SDA置1
RET
;*********************************************************
;设置小数位、识别码、蜂鸣器
;*********************************************************
SETXIAO:
MOV A,#DISPBUF
MOV R0,A
MOV R1,A
MOV A,#00H ;小数点位/不显示
MOV @R1,A
MOV A,#7
ADD A,R1
MOV R1,A
MOV A,#01 ;识别码=01
MOV @R1,A
INC R1
MOV A,#01 ;蜂鸣器设定开/二次分频
MOV @R1,A
RET
;**********************************************
tsled:
CLR CLK
CLR EN
NOP
LCALL DELY10us
LCALL DELY10us
LCALL DELY10us
LCALL DELY10us
MOV A,#0
MOV R2,A ;//9个字节
MOV R3,A ;一个字节中的4个位
MOV R0,#DISPBUF
DISP0:
MOV A,@R0
SWAP A
DISP2:
SETB CLK
RLC A
JNC ZHI0
SETB DOUT
SJMP NEI
ZHI0: CLR DOUT
NEI:
NOP
CLR CLK
LCALL DELY3uS
LCALL DELY3uS
LCALL DELY3uS
INC R3
CJNE R3,#4,DISP2
;
MOV R3,#0
INC R2
INC R0
CJNE R2,#9,DISP0
SETB EN
RET
;*****************************************************************
TAB: DB 01H,02H,03H,0aH ;/*键盘码00,01,02,03,*/
DB 04H,05H,06H,0bH ;/*键盘码04,05,06,07,*/
DB 07H,08H,09H,0cH ;/*键盘码08,09,0a,0b,*/
DB 0eH,00H,0fH,0dH ;/*键盘码0c,0d,0e,0f*/
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -