📄 24c02的读写asm.txt
字号:
;*********************************************************
;程序功能: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 + -