⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e2prom.asm

📁 24c08读写,通过按键写入数据,LCD0802显示
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        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 + -