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

📄 iic按键读写与显示.txt

📁 用按键读写IIC并显示读写的内容
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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 + -