📄 e2prom.asm
字号:
SETB P1.2
JNB P1.2,KEY_WAIT3 ;等待按键释放
MOV A,MODE
CJNE A,#START_MODE,KEY_DOWN_READ
MOV MODE,#READ_MODE
MOV SUB_MODE,#RNONE_SUBMODE
RET
KEY_DOWN_READ:
CJNE A,#READ_MODE,KEY_DOWN_WRITE
MOV A,SUB_MODE
CJNE A,#RNONE_SUBMODE,KEY_DOWN_READ_ADD
MOV MODE,#WRITE_MODE
MOV SUB_MODE,#WNONE_SUBMODE
RET
KEY_DOWN_READ_ADD:
CJNE A,#RADD_SUBMODE,KEY_DOWN_READ_DATA
MOV A,COUNT
JZ KEY_DOWN_READ_RESELECT
DEC COUNT
RET
KEY_DOWN_READ_DATA:
RET
KEY_DOWN_READ_RESELECT:
MOV SUB_MODE,#RNONE_SUBMODE
RET
KEY_DOWN_WRITE:
CJNE A,#WRITE_MODE,KEY_DOWN_EXIT
MOV A,SUB_MODE
CJNE A,#RNONE_SUBMODE,KEY_DOWN_WRITE_ADD
MOV MODE,#EXIT_MODE
RET
KEY_DOWN_WRITE_ADD:
CJNE A,#RNONE_SUBMODE,KEY_DOWN_WRITE_DATA
MOV A,COUNT
JZ KEY_DOWN_WRITE_ADD_RESELECT
DEC COUNT
RET
KEY_DOWN_WRITE_ADD_RESELECT:
MOV SUB_MODE,#WNONE_SUBMODE
RET
KEY_DOWN_WRITE_DATA:
MOV A,COUNT
JZ KEY_DOWN_WRITE_DATA_RESELECT
DEC COUNT
RET
KEY_DOWN_WRITE_DATA_RESELECT:
MOV SUB_MODE,#WADD_SUBMODE
MOV COUNT,#2
RET
KEY_DOWN_EXIT:
MOV MODE,#READ_MODE
MOV SUB_MODE,#RNONE_SUBMODE
RET
;========================================================
DISPLAY:
JNB DISP_FLAG,DISP_RET
CLR DISP_FLAG
MOV A,MODE
CJNE A,#START_MODE,DISP_READ
DISP_START: ;显示24C08 WR&RD
MOV P2,#00000001B ;清屏
LCALL DISP_WRCWD
MOV P2,#00H ;写入显示起始地址(第一行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE1
LCALL DISP_WRNBYT
MOV P2,#0C0H ;写入显示起始地址(第二行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE2
LCALL DISP_WRNBYT
RET
TABLE1: DB " 24C08 "
TABLE2: DB " WR&RD "
DISP_RET:
RET
;-------------------------------------
DISP_READ:
CJNE A,#READ_MODE,DISP_WRITEJMP
MOV A,SUB_MODE
CJNE A,#RNONE_SUBMODE,DISP_READ_ADD
MOV P2,#00000001B ;清屏
LCALL DISP_WRCWD
MOV P2,#00H ;写入显示起始地址(第一行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE3
LCALL DISP_WRNBYT
MOV P2,#0C0H ;写入显示起始地址(第二行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE4
LCALL DISP_WRNBYT ;显示READ< WRITE
RET
TABLE3: DB "READ <--"
TABLE4: DB "WRITE "
DISP_WRITEJMP:
LJMP DISP_WRITE
DISP_READ_DATAJMP:
LJMP DISP_READ_DATA
DISP_READ_ADD:
CJNE A,#RADD_SUBMODE,DISP_READ_DATAJMP
MOV P2,#00000001B ;清屏 显示"ADD:_
LCALL DISP_WRCWD
MOV P2,#00001111B ;显示器开、光标开、闪烁开
LCALL DISP_WRCWD
MOV P2,#00000110B ;文字不动,光标自动右移
LCALL DISP_WRCWD
MOV P2,#00H ;写入显示起始地址(第一行第一个位置)
LCALL DISP_WRCWD
MOV A,#46H
LCALL DISP_WRBYT
MOV A,#5FH
LCALL DISP_WRBYT
MOV A,#41H
LCALL DISP_WRBYT
MOV A,#44H
LCALL DISP_WRBYT
MOV A,#3AH
LCALL DISP_WRBYT
MOV A,COUNT
CJNE A,#0,DISP_READ_ADD1
RET
DISP_READ_ADD1:
MOV A,DATA_BUF0 ;显示"ADD:X_"
LCALL DISP_H
MOV A,COUNT
CJNE A,#1,DISP_READ_ADD2
RET
DISP_READ_ADD2:
MOV A,DATA_BUF0 ;显示"ADD:XX"
LCALL DISP_L
MOV P2,#00001100B ;显示器开、光标关、闪烁关
LCALL DISP_WRCWD
RET
;-------------------
DISP_READ_DATA:
MOV P2,#00000001B ;清屏 显示"XXXXXXXX
LCALL DISP_WRCWD ; XXXXXXXX
MOV A,DATA_BUF0 ;"1"
LCALL DISP_H
MOV A,DATA_BUF0
LCALL DISP_L
MOV A,DATA_BUF1 ;"2"
LCALL DISP_H
MOV A,DATA_BUF1
LCALL DISP_L
MOV A,DATA_BUF2 ;"3"
LCALL DISP_H
MOV A,DATA_BUF2
LCALL DISP_L
MOV A,DATA_BUF3 ;"4"
LCALL DISP_H
MOV A,DATA_BUF3
LCALL DISP_L
MOV P2,#0C0H ;写入显示起始地址(第二行第二个位置)
LCALL DISP_WRCWD
MOV A,DATA_BUF4 ;"5"
LCALL DISP_H
MOV A,DATA_BUF4
LCALL DISP_L
MOV A,DATA_BUF5 ;"6"
LCALL DISP_H
MOV A,DATA_BUF5
LCALL DISP_L
MOV A,DATA_BUF6 ;"7"
LCALL DISP_H
MOV A,DATA_BUF6
LCALL DISP_L
MOV A,DATA_BUF7 ;"8"
LCALL DISP_H
MOV A,DATA_BUF7
LCALL DISP_L
RET
;-------------------------------------
DISP_WRITE:
CJNE A,#WRITE_MODE,DISP_EXITJMP
MOV A,SUB_MODE
CJNE A,#WNONE_SUBMODE,DISP_WRITE_ADD
MOV P2,#00000001B ;清屏
LCALL DISP_WRCWD
MOV P2,#00H ;写入显示起始地址(第一行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE5
LCALL DISP_WRNBYT
MOV P2,#0C0H ;写入显示起始地址(第二行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE6
LCALL DISP_WRNBYT ;显示READ WRITE<
RET
TABLE5: DB "READ "
TABLE6: DB "WRITE<--"
DISP_EXITJMP:
LJMP DISP_EXIT
DISP_WRITE_ADD:
CJNE A,#WADD_SUBMODE,DISP_WRITE_DATA
MOV P2,#00000001B ;清屏 显示"ADD:_
LCALL DISP_WRCWD
MOV P2,#00001111B ;显示器开、光标开、闪烁开
LCALL DISP_WRCWD
MOV P2,#00000110B ;文字不动,光标自动右移
LCALL DISP_WRCWD
MOV P2,#00H ;写入显示起始地址(第一行第一个位置)
LCALL DISP_WRCWD
MOV A,#46H
LCALL DISP_WRBYT
MOV A,#5FH
LCALL DISP_WRBYT
MOV A,#41H
LCALL DISP_WRBYT
MOV A,#44H
LCALL DISP_WRBYT
MOV A,#3AH
LCALL DISP_WRBYT
MOV A,COUNT
CJNE A,#0,DISP_WRITE_ADD1
RET
DISP_WRITE_ADD1:
MOV A,DATA_BUF0 ;显示"ADD:X_"
LCALL DISP_H
MOV A,COUNT
CJNE A,#1,DISP_WRITE_ADD2
RET
DISP_WRITE_ADD2:
MOV A,DATA_BUF0 ;显示"ADD:XX"
LCALL DISP_L
MOV P2,#00001100B ;显示器开、光标关、闪烁关
LCALL DISP_WRCWD
RET
;-------------------
DISP_WRITE_DATA:
MOV P2,#00000001B ;清屏
LCALL DISP_WRCWD
MOV P2,#00001111B ;显示器开、光标开、闪烁开
LCALL DISP_WRCWD
MOV A,COUNT
CJNE A,#0,DISP_WRITE_DATA1
RET
DISP_WRITE_DATA1:
MOV A,DATA_BUF1 ;显示:X_
LCALL DISP_H
MOV A,COUNT
CJNE A,#1,DISP_WRITE_DATA2
RET
DISP_WRITE_DATA2:
MOV A,DATA_BUF1 ;显示:XX
LCALL DISP_L
MOV A,COUNT
CJNE A,#2,DISP_WRITE_DATA3
RET
DISP_WRITE_DATA3:
MOV A,DATA_BUF2 ;显示:XXX_
LCALL DISP_H
MOV A,COUNT
CJNE A,#3,DISP_WRITE_DATA4
RET
DISP_WRITE_DATA4:
MOV A,DATA_BUF2 ;显示:XXXX_
LCALL DISP_L
MOV A,COUNT
CJNE A,#4,DISP_WRITE_DATA5
RET
DISP_WRITE_DATA5:
MOV A,DATA_BUF3 ;显示:XXX_
LCALL DISP_H
MOV A,COUNT
CJNE A,#5,DISP_WRITE_DATA6
RET
DISP_WRITE_DATA6:
MOV A,DATA_BUF3 ;显示:XXXXXX_
LCALL DISP_L
MOV A,COUNT
CJNE A,#6,DISP_WRITE_DATA7
RET
DISP_WRITE_DATA7:
MOV A,DATA_BUF4 ;显示:XXXXXXX_
LCALL DISP_H
MOV A,COUNT
CJNE A,#7,DISP_WRITE_DATA8
RET
DISP_WRITE_DATA8:
MOV A,DATA_BUF4 ;显示"XXXXXXXX"
LCALL DISP_L ; _
MOV P2,#0C0H ;写入显示起始地址(第二行第二个位置)
LCALL DISP_WRCWD
MOV A,COUNT
CJNE A,#8,DISP_WRITE_DATA9
RET
DISP_WRITE_DATA9:
MOV A,DATA_BUF5 ;显示"XXXXXXXX"
LCALL DISP_H ; X_
MOV A,COUNT
CJNE A,#9,DISP_WRITE_DATA10
RET
DISP_WRITE_DATA10:
MOV A,DATA_BUF5 ;显示"XXXXXXXX"
LCALL DISP_L ; XX_
MOV A,COUNT
CJNE A,#10,DISP_WRITE_DATA11
RET
DISP_WRITE_DATA11:
MOV A,DATA_BUF6 ;显示"XXXXXXXX"
LCALL DISP_H ; XXX_
MOV A,COUNT
CJNE A,#11,DISP_WRITE_DATA12
RET
DISP_WRITE_DATA12:
MOV A,DATA_BUF6 ;显示"XXXXXXXX"
LCALL DISP_L ; XXXX_
MOV A,COUNT
CJNE A,#12,DISP_WRITE_DATA13
RET
DISP_WRITE_DATA13:
MOV A,DATA_BUF7 ;显示"XXXXXXXX"
LCALL DISP_H ; XXXXX_
MOV A,COUNT
CJNE A,#13,DISP_WRITE_DATA14
RET
DISP_WRITE_DATA14:
MOV A,DATA_BUF7 ;显示"XXXXXXXX"
LCALL DISP_L ; XXXXXX_
MOV A,COUNT
CJNE A,#14,DISP_WRITE_DATA15
RET
DISP_WRITE_DATA15:
MOV A,DATA_BUF8 ;显示"XXXXXXXX"
LCALL DISP_H ; XXXXXX_
MOV A,COUNT
CJNE A,#15,DISP_WRITE_DATA16
RET
DISP_WRITE_DATA16:
MOV A,DATA_BUF8 ;显示"XXXXXXXX"
LCALL DISP_L ; XXXXXXXX
RET
;-------------------------------------
DISP_EXIT:
MOV P2,#00000001B ;清屏
LCALL DISP_WRCWD
MOV P2,#00H ;写入显示起始地址(第一行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE7
LCALL DISP_WRNBYT
MOV P2,#0C0H ;写入显示起始地址(第二行第二个位置)
LCALL DISP_WRCWD
MOV DPTR,#TABLE8
LCALL DISP_WRNBYT ;显示"WRITE EXIT<
RET
TABLE7: DB "WRITE "
TABLE8: DB "EXIT <--"
;-------------------------------------
;fun:将一个字节的高四位在LCD中显示
;in:A
;-------------------------------------
DISP_H:
ANL A,#0F0H
RR A
RR A
RR A
RR A
LCALL DISP_TRAN
LCALL DISP_WRBYT
RET
;-------------------------------------
;fun:将一个字节的低四位在LCD中显示
;in:A
;-------------------------------------
DISP_L:
ANL A,#0FH
LCALL DISP_TRAN
LCALL DISP_WRBYT
RET
;-------------------------------------
;fun:LCD命令写入
;-------------------------------------
DISP_WRCWD:
CLR RS
CLR RW
CLR E
LCALL DISP_CBUSY
SETB E
RET
;---------------------------------------------------------
;fun:判断LCD显示器是否忙,如果P2.7为高电平表示忙就循环等待
;---------------------------------------------------------
DISP_CBUSY:
MOV P2,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P2.7,DISP_CBUSY
RET
;----------------------------------------------------
;fun:向LCD写入字符串(长度不能超过每行能显示的8个字符数)
;in :DPTR
;var:R0,A
;----------------------------------------------------
DISP_WRNBYT:
MOV R0,#00H
A1:
MOV A,R0
MOVC A,@A+DPTR
LCALL DISP_WRBYT
INC R0
CJNE R0,#08H,A1
RET
;------------------------------------
;fun:向LCD写入一个字符
;in :A
;------------------------------------
DISP_WRBYT:
MOV P2,A
SETB RS
CLR RW
CLR E
LCALL DISP_CBUSY
SETB E
RET
;------------------------------------
;fun:16进制转化ASCII码显示
;var:C,A
;in :A
;out:A
;------------------------------------
DISP_TRAN:
CLR C
SUBB A,#0AH
JC DISP_TRAN_NUM
ADD A,#07H
DISP_TRAN_NUM:
ADD A,#3AH
RET
;--------------------------------------------
;fun:I2C开始信号
;--------------------------------------------
I2C_START:
SETB SDA
SETB SCL
LCALL NOP6
CLR SDA
LCALL NOP6
CLR SCL
RET
;--------------------------------------------
;fun:I2C停止信号
;--------------------------------------------
I2C_STOP:
CLR SDA
SETB SCL
LCALL NOP6
SETB SDA
LCALL NOP6
CLR SCL
RET
;--------------------------------------------
;fun:I2C发送应答信号
;--------------------------------------------
I2C_MACK:
CLR SDA
SETB SCL
LCALL NOP6
CLR SCL
SETB SDA
RET
;--------------------------------------------
;fun:I2C发送非应答信号
;--------------------------------------------
I2C_MNACK:
SETB SDA
SETB SCL
LCALL NOP6
CLR SCL
CLR SDA
RET
;--------------------------------------------
;fun:I2C写一个字节数据
;var:R7,A,C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -