?? 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
;***************************************************
;初始化參數(shù)
;***************************************************
;主程序
;***************************************************
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
;**********************************************
;設(shè)置密碼
;**********************************************
SETMIMA:
LCALL TIANC
MOV R3,#0A0H
MOV R4,#01H
MOV R1,#DISPBUF
INC R1 ;密碼在DISPBUF+1處
MOV R7,#6
LCALL WR24C02
LJMP WAIT
;**********************************************
;填充顯示緩沖區(qū)556688
TIANC:
MOV A,#DISPBUF
MOV R0,A
MOV A,#0H ;小數(shù)點(diǎn)位/不顯示
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)=片內(nèi)字節(jié)地址
; (R1)=欲寫數(shù)據(jù)存放地址指針
; (R7)=連續(xù)寫字節(jié)數(shù)n
;****************************************************************************
WR24C02:
MOV P3,#0FFH
CLR SDA ; 發(fā)開始信號
MOV A,R3 ; 送器件地址
ACALL SUBS
MOV A,R4 ; 送片內(nèi)字節(jié)地址
ACALL SUBS
AGAIN:
MOV A,@R1
ACALL SUBS ;調(diào)發(fā)送單字節(jié)子程序
INC R1
DJNZ R7,AGAIN;連續(xù)寫n個字節(jié)
CLR SDA ;SDA置0, 準(zhǔn)備送停止信號
ACALL DELAY2 ;延時以滿足傳輸速率要求
SETB SCL ;發(fā)停止信號
ACALL DELAY2
SETB SDA
RET
SUBS:
MOV R0,#08H ;發(fā)送單字節(jié)子程序
LOOP11:
CLR SCL
RLC A
MOV SDA,C
NOP
SETB SCL
ACALL DELAY2
DJNZ R0,LOOP11 ;循環(huán)8次送8個bit
CLR SCL
ACALL DELAY2
SETB SCL
REP: MOV C,SDA
JC REP ;判應(yīng)答到否,未到則等待
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 ;小數(shù)點(diǎn)位/不顯示
MOV @R0,A
MOV A,#8
ADD A,R0
MOV R0,A ;R0=DISPBUF+8指向蜂鳴器設(shè)定位
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: ;緩沖區(qū)全填為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 ;設(shè)置小數(shù)位、識別碼、蜂鳴器
LCALL TSLED ;在LED上顯示密碼
;****************************************************************************
;讀串行E2PROM子程序RD24C02
;(R1)=欲讀數(shù)據(jù)存放地址指針
;(R3)=10100001(命令1010+器件3位地址+讀/寫(1/0)。 器件地址:一個芯片是000)
;(R4)=片內(nèi)字節(jié)地址
;(R7)=連續(xù)讀字節(jié)數(shù)
;****************************************************************************
RD24C02:
MOV P3,#0FFH
; SETB SDA
; SETB SCL
; NOP
CLR SDA ;發(fā)開始信號
MOV R3,#0A0H
MOV A,R3 ;送器件地址
ACALL SUBS ;調(diào)發(fā)送單字節(jié)子程序
MOV A,R4 ;送片內(nèi)字節(jié)地址
ACALL SUBS
MOV P3,#0FFH
CLR SDA ;再發(fā)開始信號
MOV A,R3
SETB ACC.0 ;發(fā)讀命令
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 ;接受單字節(jié)子程序
LOOP2:
SETB SCL
ACALL DELAY2
MOV C,SDA
RLC A
CLR SCL
ACALL DELAY2
DJNZ R0,LOOP2
CJNE R7,#01H,LOW1
SETB SDA ;若是最后一個字節(jié)置A=1
AJMP SETOK
LOW1:
CLR SDA ;否則置A=0
SETOK:
ACALL DELAY2
SETB SCL
ACALL DELAY2
CLR SCL
ACALL DELAY2
SETB SDA ;應(yīng)答畢,SDA置1
RET
;*********************************************************
;設(shè)置小數(shù)位、識別碼、蜂鳴器
;*********************************************************
SETXIAO:
MOV A,#DISPBUF
MOV R0,A
MOV R1,A
MOV A,#00H ;小數(shù)點(diǎn)位/不顯示
MOV @R1,A
MOV A,#7
ADD A,R1
MOV R1,A
MOV A,#01 ;識別碼=01
MOV @R1,A
INC R1
MOV A,#01 ;蜂鳴器設(shè)定開/二次分頻
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個字節(jié)
MOV R3,A ;一個字節(jié)中的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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -