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

📄 24c02的读写asm.txt

📁 串行IIc总线型EEPROM24c02的读写汇编源程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;*********************************************************
;程序功能:EEPROW存储器24C02的读写,当键盘上0-9任意一数字
;键按下时,即显示其数值,当按下"存入"键时,将当前数字存入
;24C02中,当按下"调出"键时,将存入24C02的数字取出,并送显
;当按下"清0"键时,将存入24C02中的内容清0.
;编写日期:2005.07.22
;修改日期:07.23已调试成功通过板测
;*********************************************************
	SCL	BIT	P3.6
	SDA	BIT	P3.7
	KEY	EQU	30H
	WSUBB	EQU	31H
	RSUBB	EQU	32H
	ADDRESW	EQU	33H
	ADDRESR	EQU	34H
	W24C02	EQU	35H
	R24C02	EQU	36H
	NUMBYTE	EQU	37H	
	SENDBUFF	EQU	40H
	RECEBUFF	EQU	70H
	ORG	0000H
	AJMP	INITIAL
	ORG	0100H
INITIAL:
	MOV	SP,#60H
	MOV	A,#00H
	MOV	P0,A
	MOV	P1,A
	MOV	P2,#0FH
	MOV	KEY,A
	MOV	WSUBB,#00H
	MOV	RSUBB,#00H
	MOV	W24C02,#0A0H
	MOV	R24C02,#0A1H
	MOV	SENDBUFF,A
	MOV	RECEBUFF,A
;***********************************
;主程序
MAIN:	
	LCALL	KEYSCAN
	LCALL	KEYDONE	
	AJMP	MAIN
;************************************
;键盘扫描检测,返回键值KEY
KEYSCAN:
	MOV	P2,#0FFH
	CLR	P2.4
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK1  ;A=0则跳
	LCALL	DELAY10MS
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK1
	MOV	A,P2
	ANL	A,#0FH
	CJNE	A,#0EH,L1
	MOV	KEY,#00H
	AJMP	L4
L1:
	CJNE	A,#0DH,L2
	MOV	KEY,#04H
	AJMP	L4
L2:
	CJNE	A,#0BH,L3
	MOV	KEY,#08H
	AJMP	L4
L3:
	CJNE	A,#07H,L4
	MOV	KEY,#0CH
L4:
	LCALL	WAITKEY	
	MOV	P0,KEY
DK1:
	MOV	P2,#0FFH
	CLR	P2.5
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK2
	LCALL	DELAY10MS
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK2
	MOV	A,P2
	ANL	A,#0FH
	CJNE	A,#0EH,L5
	MOV	KEY,#01H
	AJMP	L8
L5:
	CJNE	A,#0DH,L6
	MOV	KEY,#05H
	AJMP	L8
L6:
	CJNE	A,#0BH,L7
	MOV	KEY,#09H
	AJMP	L8
L7:
	CJNE	A,#07H,L8
	MOV	KEY,#0DH
L8:
	LCALL	WAITKEY	
	MOV	P0,KEY
DK2:
	MOV	P2,#0FFH
	CLR	P2.6
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK3
	LCALL	DELAY10MS
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK3
	MOV	A,P2
	ANL	A,#0FH
	CJNE	A,#0EH,L9
	MOV	KEY,#02H
	AJMP	L12
L9:
	CJNE	A,#0DH,L10
	MOV	KEY,#06H
	AJMP	L12
L10:
	CJNE	A,#0BH,L11
	MOV	KEY,#0AH
	AJMP	L12
L11:
	CJNE	A,#07H,L12
	MOV	KEY,#0EH
L12:
	LCALL	WAITKEY
	MOV	P0,KEY
DK3:
	MOV	P2,#0FFH
	CLR	P2.7
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK4
	LCALL	DELAY10MS
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH
	JZ	DK4
	MOV	A,P2
	ANL	A,#0FH
	CJNE	A,#0EH,L13
	MOV	KEY,#03H
	AJMP	L16
L13:
	CJNE	A,#0DH,L14
	MOV	KEY,#07H
	AJMP	L16
L14:
	CJNE	A,#0BH,L15
	MOV	KEY,#0BH
	AJMP	L16
L15:
	CJNE	A,#07H,L16
	MOV	KEY,#0FH
L16:
	LCALL	WAITKEY
	MOV	P0,KEY
DK4:	RET	
WAITKEY:			;检测按键是否释放
	MOV	A,P2
	ANL	A,#0FH
	XRL	A,#0FH	
	JNZ	WAITKEY
	RET
;************************************
;键盘散转,根据键值转向相应的功能操作
KEYDONE:
	MOV	DPTR,#KJMP;散转入口地址表的首地址给DPTR
	MOV	A,KEY
	MOV	B,#03H;给每个入口地址展宽3个字节,以便存放3字节LJMP指令
	MUL	AB
	JMP	@A+DPTR 	
KJMP:			;散转入口地址表依次存放16个键操作程序的转移指令
	LJMP	KEY0
	LJMP	KEY1
	LJMP	KEY2
	LJMP	KEY3
	LJMP	KEY4
	LJMP	KEY5
	LJMP	KEY6
	LJMP	KEY7
	LJMP	KEY8
	LJMP	KEY9
	LJMP	KEY10
	LJMP	KEY11
	LJMP	KEY12
	LJMP	KEY13
	LJMP	KEY14
	LJMP	KEY15
KEY0:
	MOV	SENDBUFF,KEY
	RET
KEY1:
	MOV	SENDBUFF,KEY
	RET
KEY2:
	MOV	SENDBUFF,KEY
	RET
KEY3:
	MOV	SENDBUFF,KEY
	RET
KEY4:
	MOV	SENDBUFF,KEY
	RET
KEY5:
	MOV	SENDBUFF,KEY
	RET
KEY6:
	MOV	SENDBUFF,KEY
	RET
KEY7:
	MOV	SENDBUFF,KEY
	RET
KEY8:
	MOV	SENDBUFF,KEY
	RET
KEY9:
	MOV	SENDBUFF,KEY
	RET
KEY10:				;"存入"键功能操作:向24C02写入一个字节数据
	MOV	ADDRESW,W24C02	;指定24C02地址
	MOV	WSUBB,#00H	;指定子地下为00H
	MOV	NUMBYTE,#1
	LCALL	WNBYTE
	RET
KEY11:				;"调出"键功能操作:从24C02中读出一个字节数据
	MOV	ADDRESR,R24C02
	MOV	ADDRESW,W24C02
	MOV	RSUBB,#00H
	MOV	NUMBYTE,#1
	LCALL	RNBYTE
	MOV	A,RECEBUFF	
	MOV	P0,A
	RET
KEY12:				;"清0"键功能操作:向24C02中写入一个字节"0",将前面写入的数据覆盖掉
	MOV	ADDRESW,W24C02
	MOV	WSUBB,#00H
	MOV	NUMBYTE,#1
	MOV	SENDBUFF,#00H
	LCALL	WNBYTE
	RET
KEY13:
	NOP
KEY14:	
	NOP
KEY15:
	RET	
;************************************
;延时10MS	
DELAY10MS:
	MOV	R7,#50
DELAY1:
	MOV	R6,#100
DELAY2:
	DJNZ	R6,DELAY2
	DJNZ	R7,DELAY1
	RET
;*********************************************
;启动IIC总线SCL=1,SDA 1->0 START
START:
	CLR	SCL
	SETB	SDA
	NOP
	SETB	SCL
	LCALL	DELAY
	CLR	SDA
	LCALL	DELAY
	CLR	SCL;清SCL以准备对SDA进行改变
	RET
;********************************************
;停止IIC总线SCL=1,SDA 0->1 STOP
STOP:
	CLR	SCL
	CLR	SDA
	NOP	
	SETB	SCL
	LCALL	DELAY
	SETB	SDA
	LCALL	DELAY
	RET
;********************************************
;应答信号,在发送数据后的第9个脉冲期间,从器
;件(接收器件)将SDA拉低,该信号对应于应答信号
ACK:
	CLR	SDA
	NOP
	SETB	SCL
	LCALL	DELAY
	CLR	SCL
	LCALL	DELAY
	RET
;********************************************
;非应答信号,在发送数据后的第9个脉冲期间,从器
;件(接收器件)将SDA释放(置高),该信号对应于非应
;答信号
NACK:
	SETB	SDA
	NOP
	SETB	SCL
	LCALL	DELAY
	CLR	SCL
	LCALL	DELAY
	RET	
;**********************************************
;检测应答信号
CHECKACK:
	SETB	SDA;置SDA为输入方式
	SETB	SCL;使SDA线上的数据有效
	CLR	F0
	MOV	C,SDA
	JNC	YES
	SETB	F0
YES:	
	CLR	SCL
	RET
;***********************************************
;向IIC总线上写入一个字节数据
WONEBYTE:
	MOV	R0,#08H
WONE:
	RLC	A
	JC	W1
	AJMP	W0
W1:
	SETB	SDA
	SETB	SCL
	LCALL	DELAY
	CLR	SCL
	LCALL	DELAY
	CLR	SDA
	AJMP	WONE1
W0:
	CLR	SDA
	SETB	SCL	
	LCALL	DELAY
	CLR	SCL
WONE1:
	DJNZ	R0,WONE

	RET
;************************************************
;从IIC总线上读一个字节数据
RONEBYTE:
	MOV	R0,#08H
RONE:
	SETB	SDA
	SETB	SCL
	MOV	C,SDA
	MOV	A,R2
	CLR	SCL
	RLC	A
	MOV	R2,A
	LCALL	DELAY
	DJNZ	R0,RONE
	RET
;************************************************
;向IIC总线写入N个字节数据,器件地址入ADDRESW待发送
;数据个数入NUMBYTE,写入器件的子地址入WSUBB,数据缓
;冲区首址入R1
WNBYTE:
	MOV	R3,NUMBYTE
	LCALL	START
	MOV	A,ADDRESW
	LCALL	WONEBYTE
	LCALL	CHECKACK
	JB	F0,WNBYTE
WNB:
	MOV	A,WSUBB
	LCALL	WONEBYTE
	LCALL	CHECKACK
	JB	F0,WNB
	MOV	R1,#SENDBUFF
WNB1:
	MOV	A,@R1
	LCALL	WONEBYTE
	LCALL	CHECKACK
	JB	F0,WNB1
	MOV	P1,#55H;设定写操作成功标志
	INC	R1
	DJNZ	R3,WNB1
	LCALL	STOP
	RET
;************************************************
;从IIC总线读N个字节数据,器件地址入ADDRESR,字节个
;数入NUMBYTE,器件内存子地址入RSUBB,接收数据缓冲区
;首址入RECEBUFF
RNBYTE:
	MOV	R3,NUMBYTE
	LCALL	START
	MOV	A,ADDRESW
	LCALL	WONEBYTE
	LCALL	CHECKACK
	JB	F0,RNBYTE
RNB:
	MOV	A,RSUBB
	LCALL	WONEBYTE
	LCALL	CHECKACK
	JB	F0,RNB
RNB0:
	LCALL	START
	MOV	A,ADDRESR
	LCALL	WONEBYTE
	LCALL	CHECKACK
	JB	F0,RNB0
	MOV	R1,#RECEBUFF
RNB1:
	LCALL	RONEBYTE
	MOV	@R1,A
	DJNZ	R3,SENDACK
	MOV	P1,#0AAH;设定读操作成功标志
	LCALL	NACK
	LCALL	STOP
	RET
SENDACK:
	LCALL	ACK
	INC	R1
	AJMP	RNB1
	
;**********************************************			
DELAY:
	NOP
	NOP
	NOP
	RET
	END	
//*********************************************************
//程序功能:EEPROW存储器24C02的读写,当键盘上0-9任意一数字
//键按下时,即显示其数值,当按下"存入"键时,将当前数字存入
//24C02中,当按下"调出"键时,将存入24C02的数字取出,并送显
//当按下"清0"键时,将存入24C02中的内容清0.
//编写日期:2005.07.23-24
//修改日期:
//*********************************************************
#include"regx51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define FLASE 0
#define TRUE 1
sbit sda=P3^7;
sbit	scl=P3^6;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit	P24=P2^4;
sbit	P25=P2^5;
sbit	P26=P2^6;
sbit	P27=P2^7;
uchar temp,keyvalue;
uchar sendbuff[30],receivebuff[30],disbuff[8];

//*********************************************************
//延时0.5*ims
void delaynms(uint i)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -