📄 e2prom.asm
字号:
SCL EQU P1.3
SDA EQU P1.4
RS EQU P1.5
RW EQU P1.6
E EQU P1.7
;--------------------
MODE EQU 30H
SUB_MODE EQU 31H
KEY_BUF EQU 32H
KEY_STATE EQU 33H
DATA_BUF0 EQU 34H
DATA_BUF1 EQU 35H
DATA_BUF2 EQU 36H
DATA_BUF3 EQU 37H
DATA_BUF4 EQU 38H
DATA_BUF5 EQU 39H
DATA_BUF6 EQU 3AH
DATA_BUF7 EQU 3BH
DATA_BUF8 EQU 3CH
COUNT EQU 3DH
DISP_FLAG BIT 00
START_MODE EQU 0
READ_MODE EQU 1
WRITE_MODE EQU 2
EXIT_MODE EQU 3
RNONE_SUBMODE EQU 0 ; READ MODE
RADD_SUBMODE EQU 1
RDATA_SUBMODE EQU 2
;--------------------
WNONE_SUBMODE EQU 0 ; WRITE MODE
WADD_SUBMODE EQU 1
WDATA_SUBMODE EQU 2
;--------------------
ORG 0000H
LJMP INIT
ORG 0030H
INIT:
MOV MODE,#START_MODE
MOV SUB_MODE,#0
MOV COUNT,#0
MOV KEY_STATE,#0FFH
SETB DISP_FLAG
MOV P2,#00000001B ;清屏
LCALL DISP_WRCWD
MOV P2,#00111000B ;8位2行5x7点阵
LCALL DISP_WRCWD
MOV P2,#00001100B ;显示器开
LCALL DISP_WRCWD
;-----------------------------
MAIN_LOOP:
LCALL KEY
LCALL DISPLAY
LCALL DELAY_1MS
LJMP MAIN_LOOP
;==========================================================
KEY:
MOV P3,#0FH
NOP
MOV A,P3
CPL A
ANL A,#0FH
JNZ KEY_CON10
SETB P1.1
SETB P1.2
JNB P1.1,KEY_CON10
JNB P1.2,KEY_CON10
;-------------------------
SETB C
MOV A,KEY_STATE
RLC A
MOV KEY_STATE,A
KEY_RET:
RET
;-------------------------
KEY_CON10:
CLR C
MOV A,KEY_STATE
RLC A
MOV KEY_STATE,A
JNZ KEY_RET
JNB P1.1,KEY_OKJMP
JNB P1.2,KEY_DOWNJMP
;---------------------------------
SETB DISP_FLAG
;---------------------
MOV P3,#11101111B
NOP
MOV A,P3
JNB ACC.0,KEY_11
JNB ACC.1,KEY_12
JNB ACC.2,KEY_13
JNB ACC.3,KEY_14
;---------------------
MOV P3,#11011111B
NOP
MOV A,P3
JNB ACC.0,KEY_21
JNB ACC.1,KEY_22
JNB ACC.2,KEY_23
JNB ACC.3,KEY_24
;---------------------
MOV P3,#10111111B
NOP
MOV A,P3
JNB ACC.0,KEY_31
JNB ACC.1,KEY_32
JNB ACC.2,KEY_33
JNB ACC.3,KEY_34
;---------------------
MOV P3,#01111111B
NOP
MOV A,P3
JNB ACC.0,KEY_41
JNB ACC.1,KEY_42
JNB ACC.2,KEY_43
JNB ACC.3,KEY_44
RET
KEY_OKJMP:
SETB DISP_FLAG
LJMP KEY_OK
KEY_DOWNJMP:
SETB DISP_FLAG
LJMP KEY_DOWN
;==================================
KEY_11: ;"0"
MOV KEY_BUF,#0
LJMP KEY_0_F
KEY_12: ;"1"
MOV KEY_BUF,#1
LJMP KEY_0_F
KEY_13: ;"2"
MOV KEY_BUF,#2
LJMP KEY_0_F
KEY_14: ;"3"
MOV KEY_BUF,#3
LJMP KEY_0_F
KEY_21: ;"4"
MOV KEY_BUF,#4
LJMP KEY_0_F
KEY_22: ;"5"
MOV KEY_BUF,#5
LJMP KEY_0_F
KEY_23: ;"6"
MOV KEY_BUF,#6
LJMP KEY_0_F
KEY_24: ;"7"
MOV KEY_BUF,#7
LJMP KEY_0_F
KEY_31: ;"8"
MOV KEY_BUF,#8
LJMP KEY_0_F
KEY_32: ;"9"
MOV KEY_BUF,#9
LJMP KEY_0_F
KEY_33: ;"A"
MOV KEY_BUF,#0AH
LJMP KEY_0_F
KEY_34: ;"B"
MOV KEY_BUF,#0BH
LJMP KEY_0_F
KEY_41: ;"C"
MOV KEY_BUF,#0CH
LJMP KEY_0_F
KEY_42: ;"D"
MOV KEY_BUF,#0DH
LJMP KEY_0_F
KEY_43: ;"E"
MOV KEY_BUF,#0EH
LJMP KEY_0_F
KEY_44: ;"F"
MOV KEY_BUF,#0FH
LJMP KEY_0_F
RET
;------------------------------------------------
KEY_0_F:
KEY_WAIT1:
MOV P3,#0F0H
MOV A,P3
CJNE A,#0F0H,KEY_WAIT1 ;等待按键释放
MOV A,MODE
CJNE A,#START_MODE,KEY_0_F_READ
RET
KEY_0_F_READ:
CJNE A,#READ_MODE,KEY_0_F_WRITE
MOV A,SUB_MODE
CJNE A,#RNONE_SUBMODE,KEY_0_F_READ_ADD
RET
KEY_0_F_READ_ADD:
CJNE A,#RADD_SUBMODE,KEY_0_F_RET
MOV A,COUNT
CJNE A,#0,KEY_0_F_READ_ADD1
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF0,A
INC COUNT
RET
KEY_0_F_READ_ADD1:
CJNE A,#1,KEY_0_F_RET
MOV A,KEY_BUF
ADD A,DATA_BUF0
MOV DATA_BUF0,A
INC COUNT
RET
KEY_0_F_RET:
INC COUNT
CLR DISP_FLAG
RET
;------------------
KEY_0_F_WRITE:
CJNE A,#WRITE_MODE,KEY_0_F_RET
MOV A,SUB_MODE
CJNE A,#WNONE_SUBMODE,KEY_0_F_WRITE_ADD
RET
KEY_0_F_WRITE_ADD:
CJNE A,#WADD_SUBMODE,KEY_0_F_WDATA
MOV A,COUNT
CJNE A,#0,KEY_0_F_WRITE_ADD1
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF0,A
INC COUNT
RET
KEY_0_F_WRITE_ADD1:
CJNE A,#1,KEY_0_F_RET
MOV A,KEY_BUF
ADD A,DATA_BUF0
MOV DATA_BUF0,A
INC COUNT
RET
;-----------
KEY_0_F_WDATA:
MOV A,COUNT
CJNE A,#0,KEY_0_F_WDATA1
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF1,A
INC COUNT
RET
KEY_0_F_WDATA1:
CJNE A,#1,KEY_0_F_WDATA2
MOV A,KEY_BUF
ADD A,DATA_BUF1
MOV DATA_BUF1,A
INC COUNT
RET
KEY_0_F_WDATA2:
CJNE A,#2,KEY_0_F_WDATA3
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF2,A
INC COUNT
RET
KEY_0_F_WDATA3:
CJNE A,#3,KEY_0_F_WDATA4
MOV A,KEY_BUF
ADD A,DATA_BUF2
MOV DATA_BUF2,A
INC COUNT
RET
KEY_0_F_WDATA4:
CJNE A,#4,KEY_0_F_WDATA5
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF3,A
INC COUNT
RET
KEY_0_F_WDATA5:
CJNE A,#5,KEY_0_F_WDATA6
MOV A,KEY_BUF
ADD A,DATA_BUF3
MOV DATA_BUF3,A
INC COUNT
RET
KEY_0_F_WDATA6:
CJNE A,#6,KEY_0_F_WDATA7
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF4,A
INC COUNT
RET
KEY_0_F_WDATA7:
CJNE A,#7,KEY_0_F_WDATA8
MOV A,KEY_BUF
ADD A,DATA_BUF4
MOV DATA_BUF4,A
INC COUNT
RET
KEY_0_F_WDATA8:
MOV A,COUNT
CJNE A,#8,KEY_0_F_WDATA9
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF5,A
INC COUNT
RET
KEY_0_F_WDATA9:
CJNE A,#9,KEY_0_F_WDATA10
MOV A,KEY_BUF
ADD A,DATA_BUF5
MOV DATA_BUF5,A
INC COUNT
RET
KEY_0_F_WDATA10:
CJNE A,#10,KEY_0_F_WDATA11
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF6,A
INC COUNT
RET
KEY_0_F_WDATA11:
CJNE A,#11,KEY_0_F_WDATA12
MOV A,KEY_BUF
ADD A,DATA_BUF6
MOV DATA_BUF6,A
INC COUNT
RET
KEY_0_F_WDATA12:
CJNE A,#12,KEY_0_F_WDATA13
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF7,A
INC COUNT
RET
KEY_0_F_WDATA13:
CJNE A,#13,KEY_0_F_WDATA14
MOV A,KEY_BUF
ADD A,DATA_BUF7
MOV DATA_BUF7,A
INC COUNT
RET
KEY_0_F_WDATA14:
CJNE A,#14,KEY_0_F_WDATA15
MOV A,KEY_BUF
RL A
RL A
RL A
RL A
MOV DATA_BUF8,A
INC COUNT
RET
KEY_0_F_WDATA15:
CJNE A,#15,KEY_0_F_RET1
MOV A,KEY_BUF
ADD A,DATA_BUF8
MOV DATA_BUF8,A
INC COUNT
KEY_0_F_RET1:
INC COUNT
RET
;------------------------------------------------
KEY_OK:
KEY_WAIT2:
SETB P1.1
JNB P1.1,KEY_WAIT2 ;等待按键释放
MOV A,MODE
CJNE A,#START_MODE,KEY_0K_READ
MOV MODE,#READ_MODE
MOV SUB_MODE,#RNONE_SUBMODE
RET
KEY_0K_READ:
CJNE A,#READ_MODE,KEY_OK_WRITE
MOV A,SUB_MODE
CJNE A,#RNONE_SUBMODE,KEY_0K_READ_ADD
MOV SUB_MODE,#RADD_SUBMODE
RET
KEY_0K_READ_ADD:
CJNE A,#RADD_SUBMODE,KEY_0K_READ_DATA
MOV A,COUNT
CLR C
SUBB A,#02H
JC KEY_OK_RET
LCALL I2C_START ;写数据到EEPROM
MOV A,#0A0H ;发送器件地址
LCALL I2C_WRBYT
MOV A,DATA_BUF0 ;发送字节地址
LCALL I2C_WRBYT
LCALL I2C_START
MOV A,#0A1H ;发送器件地址
LCALL I2C_WRBYT
MOV R0,#DATA_BUF0
READ_I2C_DAT:
LCALL I2C_RDBYT ;读数据
MOV @R0,A
INC R0
LCALL I2C_MACK
CJNE R0,#3CH,READ_I2C_DAT
LCALL I2C_MNACK
LCALL I2C_STOP
MOV SUB_MODE,#RDATA_SUBMODE
MOV COUNT,#0
RET
KEY_0K_READ_DATA:
MOV SUB_MODE,#RNONE_SUBMODE
RET
KEY_OK_RET:
CLR DISP_FLAG
RET
;------------------
KEY_OK_WRITE:
CJNE A,#WRITE_MODE,KEY_OK_EXIT
MOV A,SUB_MODE
CJNE A,#WNONE_SUBMODE,KEY_0K_WRITE_ADD
MOV SUB_MODE,#WADD_SUBMODE
RET
KEY_0K_WRITE_ADD:
CJNE A,#WADD_SUBMODE,KEY_0K_WRITE_DATA
MOV A,COUNT
CLR C
SUBB A,#02H
JC KEY_OK_RET
MOV SUB_MODE,#WDATA_SUBMODE
MOV COUNT,#0
RET
KEY_0K_WRITE_DATA:
CJNE A,#WDATA_SUBMODE,KEY_OK_EXIT
MOV A,COUNT
CLR C
SUBB A,#0FH
JC KEY_OK_RET
LCALL I2C_START
MOV A,#0A0H ;发送器件地址
LCALL I2C_WRBYT
MOV A,DATA_BUF0 ;发送字节地址
LCALL I2C_WRBYT
MOV R0,#DATA_BUF1
WRITE_I2C_DAT:
MOV A,@R0 ;发送数据
LCALL I2C_WRBYT
INC R0
CJNE R0,#3DH,WRITE_I2C_DAT
LCALL I2C_STOP
MOV COUNT,#0
MOV SUB_MODE,#WNONE_SUBMODE
RET
;------------------
KEY_OK_EXIT:
MOV MODE,#START_MODE
RET
;------------------------------------------------
KEY_DOWN:
KEY_WAIT3:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -