📄 iic按键读写与显示.txt
字号:
KEY_PROCESS_WRITE_42:
MOV COUNT,#2
MOV R0,#W_DATA_BUFF
MOV A,KEY_BUFF
SWAP A
MOV WRITE_DATA_BUFF,A
MOV A,@R0
ANL A,#0FH
ORL A,WRITE_DATA_BUFF
MOV @R0,A
DEC R6
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
;--------------------------------------------------------
;FUNCTION:读模式下按键处理子程序
;----------------------------------------
KEY_PROCESS_READ:
MOV A,SUB_MODE
CJNE A,#READ_NONE,KEY_PROCESS_READ_2
RET
KEY_PROCESS_READ_2:
CJNE A,#READ_ADD,KEY_PROCESS_READ_3
INC COUNT
MOV A,COUNT
CJNE A,#2,KEY_PROCESS_READ_21
MOV A,KEY_BUFF
SWAP A
MOV READ_DATA_BUFF,A
MOV A,READ_ADD_BUFF
ANL A,#0FH
ORL A,READ_DATA_BUFF
MOV READ_ADD_BUFF,A
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_READ_21:
CJNE A,#3,KEY_PROCESS_READ_22
MOV A,READ_ADD_BUFF
ANL A,#0F0H
ORL A,KEY_BUFF
MOV READ_ADD_BUFF,A
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_READ_22:
MOV COUNT,#2
MOV A,READ_ADD_BUFF
ANL A,#0FH
MOV READ_ADD_BUFF,A
MOV A,KEY_BUFF
SWAP A
ORL A,READ_ADD_BUFF
MOV READ_ADD_BUFF,A
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_READ_3:
CJNE A,#READ_LENGTH,KEY_PROCESS_READ_4
INC COUNT
MOV A,COUNT
CJNE A,#2,KEY_PROCESS_READ_31
MOV READ_LENGTH_BUFF,KEY_BUFF
MOV READ_LENGTH_BUFF1,KEY_BUFF
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_READ_31:
MOV COUNT,#2
MOV READ_LENGTH_BUFF,KEY_BUFF
MOV READ_LENGTH_BUFF1,KEY_BUFF
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_READ_4:
KEY_RET:
RET
;-----------------------
;FUNCTION:改变主模式
;-----------------------
MODE_CHANGE:
LCALL CLEAR_DISP
MOV COUNT,#0 ;用于显示
MOV A,MODE
CJNE A,#WRITE,MODE_CHANGE_READ
MOV MODE,#READ
MOV SUB_MODE,#READ_NONE
RET
MODE_CHANGE_READ:
MOV MODE,#WRITE
MOV SUB_MODE,#WRITE_NONE
RET
;-----------------------
;FUNCTION:改变写子模式
;-----------------------
SUB_MODE_CHANGE:
MOV COUNT,#1 ;用于显示
MOV A,MODE
CJNE A,#WRITE,SUB_MODE_READ
MOV A,SUB_MODE
CJNE A,#WRITE_NONE,SUB_MODE_WRITE_1
INC R1
CJNE R1,#2,SUB_RET
MOV R1,#0
MOV SUB_MODE,#WRITE_ADD
RET
SUB_MODE_WRITE_1:
CJNE A,#WRITE_ADD,SUB_MODE_WRITE_2
MOV SUB_MODE,#WRITE_LENGTH
RET
SUB_MODE_WRITE_2:
CJNE A,#WRITE_LENGTH,SUB_MODE_WRITE_3
MOV WRITE_LENGTH_BUFF1,WRITE_LENGTH_BUFF
MOV A,WRITE_LENGTH_BUFF1 ; 第二次循环时,些处还需修改
MOV B,#2
MUL AB
INC A
MOV WRITE_LENGTH_BUFF1,A
MOV SUB_MODE,#WRITE_DATA
MOV R0,#W_DATA_BUFF
RET
SUB_MODE_WRITE_3:
MOV R1,#0
MOV COUNT,#0
LCALL CLEAR_DISP
MOV SUB_MODE,#WRITE_NONE
CHECK: MOV R3,43H ;用于检查数据是否正确,可去掉
CHECK1: MOV R4,44H
CHECK3: MOV R5,45H
LCALL WRITE_BYTE
RET
;-----------------------
;FUNCTION:改变读子模式
;-----------------------
SUB_MODE_READ:
MOV A,SUB_MODE
CJNE A,#READ_NONE,SUB_MODE_READ_1
INC R1
CJNE R1,#2,SUB_RET
MOV R1,#0
MOV SUB_MODE,#READ_ADD
RET
SUB_MODE_READ_1:
CJNE A,#READ_ADD,SUB_MODE_READ_2
MOV SUB_MODE,#READ_LENGTH
RET
SUB_MODE_READ_2:
CJNE A,#READ_LENGTH,SUB_MODE_READ_3
MOV SUB_MODE,#READ_DATA
LCALL READ_BYTE
RET
SUB_MODE_READ_3:
MOV R1,#0
LCALL CLEAR_DISP
MOV COUNT,#0
MOV SUB_MODE,#READ_NONE
SUB_RET:
RET
;----------------------------------------------------------------
;FUNCTION:液晶写指令子程序
;-------------------------------------------
W_COMMOND: ;写指令
; LCALL DU_MANG ;不能显示时可去掉此句
CLR RS
CLR RW
SETB EN
MOV P2,COMMOND
LCALL DELAY5MS
CLR EN
RET
;------------------------
;FUNCTION:液晶写数据子程序
;------------------------
W_DATA: ;写数据
; LCALL DU_MANG ;不能显示时可去掉此句
SETB RS
CLR RW
SETB EN
MOV P2,DATA1
LCALL DELAY5MS
CLR EN
RET
;----------------------------
;FUNCTION:液晶读忙标志
;-----------------------------
DU_MANG: ;读忙标志
MOV P2,#0FFH
CLR RS
SETB RW
SETB EN
JB P2.7,DU_MANG
RET
;---------------------------------
;FUNCTION:显示清屏
;--------------------------------
CLEAR_DISP:
MOV COMMOND,#01H ;该指令将空格码(0x20)写入显存中;达到清屏显示的功能。
LCALL W_COMMOND
MOV COMMOND,#0FH ;显示开,光标显示,光标所在位闪烁启动
LCALL W_COMMOND
RET
;----------------
;FUNCTION:把数据转成ASCII码用于显示
;-----------------------
DISP_CHANGE:
MOV A,DISP_BUFF
CJNE A,#0AH,DISP_CHANGE1
ADD A,#37H
MOV DISP_BUFF,A
RET
DISP_CHANGE1:
JC DISP_CHANGE2
ADD A,#37H
MOV DISP_BUFF,A
RET
DISP_CHANGE2:
ADD A,#30H
MOV DISP_BUFF,A
RET
;-------------------------------
;FUNCTION:20MS延时子程序
;--------------------------------
DELAY5MS: ;延时不够,会出问题
MOV DELAY1,#3
DELAY_1:
MOV DELAY2,#55
DELAY_2:
MOV DELAY3,#180
DJNZ DELAY3,$
DJNZ DELAY2,DELAY_2
DJNZ DELAY1,DELAY_1
RET
;--------------------------------
;FUNCTION:液晶显示子程序
;--------------------------------
DISP1:
LCALL W_COMMOND
MOV DATA1,DISP_BUFF
LCALL W_DATA
RET
;-----------------------------------------------------------------
;FUNCTION:IIC的开始传输条件
;--------------------------------
START:
SETB SDA
SETB SCL ;开始条件
LCALL DELAY0
CLR SDA
LCALL DELAY0
CLR SCL
RET
;----------------------------
;FUNCTION:IIC的传输结束条件
;--------------------------------
END1:
;结束条件
SETB SCL
CLR SDA
LCALL DELAY0
SETB SDA
LCALL DELAY0
CLR SCL
RET
;----------------------------------
;FUNCTION:往IIC里写一定长度的字节
;--------------------------------
WRITE_BYTE:
MOV CONTROL,#0A0H
MOV A,CONTROL
LCALL START
LCALL DELAY0 ;发送写一个字节的控制字
WRITE_1:
LCALL DELAY0
RLC A
MOV SDA,C
SETB SCL
LCALL DELAY0
CLR SCL
LCALL DELAY0
DJNZ R2,WRITE_1
MOV R2,#8
LCALL ACK
JC WRITE_1
LCALL DELAY0
MOV A,WRITE_ADD_BUFF
WRITE_3: ;发送写一个字节的地址
CLR SCL
LCALL DELAY0
RLC A
MOV SDA,C
SETB SCL
LCALL DELAY0
DJNZ R2,WRITE_3
MOV R2,#8
LCALL ACK
LCALL DELAY0
MOV R0,#W_DATA_BUFF
WRITE_4:
MOV A,@R0
WRITE_5: ;写一个字节
CLR SCL
LCALL DELAY0
RLC A
MOV SDA,C
SETB SCL
LCALL DELAY0
DJNZ R2,WRITE_5
MOV R2,#8
LCALL ACK
INC R0
DJNZ WRITE_LENGTH_BUFF,WRITE_4
WRITE_6:
LCALL END1
LCALL DELAY0
RET
;----------------------------------
;FUNCTION:从IIC里读一定长度的字节
;----------------------------------
READ_BYTE:
MOV CONTROL,#0A0H
LCALL START
MOV A,CONTROL
READ_1: ;发送控制字
LCALL DELAY0
RLC A
MOV SDA,C
SETB SCL
LCALL DELAY0
CLR SCL
LCALL DELAY0
DJNZ R2,READ_1
MOV R2,#8
LCALL ACK
JC READ_1
LCALL DELAY0
MOV A,READ_ADD_BUFF
READ_3: ;发送地址
CLR SCL
LCALL DELAY0
RLC A
MOV SDA,C
SETB SCL
LCALL DELAY0
DJNZ R2,READ_3
MOV R2,#8
LCALL ACK
LCALL START ; 开始信号
MOV CONTROL,#0A1H ;发控制字读一个字节
MOV A,CONTROL
READ_5:
CLR SCL
LCALL DELAY0
RLC A
MOV SDA,C
SETB SCL
LCALL DELAY0
CLR SCL
LCALL DELAY0
DJNZ R2,READ_5
MOV R2,#8
LCALL ACK
LCALL DELAY0
CLR A
MOV R0,#R_DATA_BUFF
READ_7: ;读一个字节
SETB SDA
LCALL DELAY0
SETB SCL
MOV C,SDA
RLC A
LCALL DELAY0
CLR SCL
LCALL DELAY0
DJNZ R2,READ_7
MOV R2,#8
MOV @R0,A
INC R0
LCALL ACK
DJNZ READ_LENGTH_BUFF,READ_7
LCALL END1
RET
;------------------------------------
;FUNCTION:延时4us(含调用LCALL产生的延时)
;-----------------------------------
DELAY0:
NOP
NOP
NOP
NOP
RET
;------------------------------------
;FUNCTION:IIC的应答信号
;-----------------------------
ACK:
CLR SCL
CLR SDA
LCALL DELAY0
SETB SCL
LCALL DELAY0
MOV C,SDA
CLR SCL
RET
;-------------------------------
;FUNCTION:IIC的反应答信号
;----------------------------
NACK:
CLR SCL
CLR SDA
LCALL DELAY0
SETB SCL
LCALL DELAY0
CLR SCL
RET
;------------------------------
END
;页写翻页问题还有待解决
;若地址为16的整数倍则不存在此问题
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -