我在作X24C45存储操作时,单片机有数据送入X24C45,但X24C45没有数据读出,请大家帮着解决一下,谢谢!
$include (c8051f000.inc); Include register definition file.
SK BIT P1.2;
CE BIT P1.3;
DIO BIT P1.1;
WRDS EQU 80H;
ST0 EQU 81H;
ENAS EQU 82H;
WRITE EQU 83H;
WREN EQU 84H;
RCL EQU 85H;
READ EQU 86H;
DATAHI EQU R1 ;数据的高位寄存器
DATALO EQU R2 ;数据的低位寄存器
ADDR EQU R3 ;地址寄存器
COUNT EQU R4 ;计数器
INST EQU R5 ;命令寄存器
;-------------------------------------------------------
ORG 0000H;程序复位地址
LJMP BEGIN;
ORG 0100H;程序起始地址BEGIN
BEGIN: MOV SP,#60H;初始化堆栈指针
MOV OSCICN,#95H;
CLR EA;
MOV WDTCN,#0DEH;
MOV WDTCN,#0ADH;
SETB EA;
MOV XBR2,#40H;
MOV PRT1CF,#00H;
MOV PRT2CF,#0FFH;
MOV P1,#0FFH;
MOV P2,#0FFH;
CLR CE;
CLR SK;
CLR DIO;
MOV A,#RCL;
MOV INST,A;
SETB CE
CLR SK;
LCALL OUTBYT;
NOP
CLR CE;
NOP
NOP
CLR DIO
; MOV A,#09H ;读地址9中的内容,并保在寄存器DATALO与DATAHI中
; MOV ADDR,A;
; LCALL RDWRD;
; MOV P2,DATAHI;
DONE0: MOV A,#WREN;设置“写允许”锁存器
MOV INST,A;
SETB CE;
CLR SK;
LCALL OUTBYT;
NOP
CLR CE;
NOP
NOP
NOP
CLR DIO
MOV DATAHI,#0AAH;
MOV DATALO,#55H;
MOV A,#02H;将数据写入地址2中
MOV ADDR,A;
LCALL WRWRD;
MOV R7,#10H
LOOP1: MOV A,#02H ;读地址2中的内容,并保在寄存器DATALO与DATAHI中
MOV ADDR,A;
LCALL RDWRD;
MOV R7,#20H
LOOP2: DJNZ R7,LOOP2
DONE: LJMP DONE0;循环直到复位
WRWRD: SETB CE ;将寄存器DATALO与DATAHI中的内容写入寄存器ADDR指定的地址中
CLR SK;
MOV A,ADDR;
RL A;将地址加入指令中
RL A;
RL A;
ANL A,#78H;
ORL A,#83H;
MOV INST,A;
LCALL OUTBYT;
MOV A,DATAHI;
MOV INST,A;
LCALL OUTBYT;输出数据的高字节
MOV A,DATALO;
MOV INST,A;
LCALL OUTBYT;输出数据的低字节
NOP
CLR CE;
CLR DIO
RET ;将寄存器INST中的内容传送到X24C45的输入口。
RDWRD: SETB CE;读寄存器ADDR指定的地址中内容
CLR SK;
MOV A,ADDR;
RL A;将地址编入指令中
RL A;
RL A;
ANL A,#78H;
ORL A,#86H;
MOV INST,A;
LCALL SEND7;
SETB DIO;
; MOV R7,#05H
;LOOP3: DJNZ R7,LOOP3
MOV COUNT,#10H;读进16位数据
MOV A,#00H;
SETB SK;
NOP
NOP
NOP
NOP
CLR SK;
BITX: MOV C,DIO;
DIONO1:MOV A,DATALO;将数据移进寄存器DATALO与DATAHI中
RLC A;
MOV DATALO,A;
MOV A,DATAHI;
RLC A;
MOV DATAHI,A;
SETB SK;
NOP
NOP
NOP
NOP
CLR SK;
DJNZ COUNT,BITX;读数据循环
NOP
CLR CE;
CLR DIO
RET ;将寄存器INST中的内容传送到X24C45的输入口。
;----------------------------------------------------
SEND7: MOV COUNT,#07H;移出7位读命令字
LJMP LOOP0;
OUTBYT:MOV COUNT,#08H;移出8位命令字LOOP0:
LOOP0: MOV A,INST;为将数据输出到DI作准备
RLC A;
MOV INST,A;
MOV DIO,C;
NOP
NOP
NOP
SETB SK;
NOP
NOP
NOP
NOP
CLR SK;
DJNZ COUNT,LOOP0;
RET;产生时钟脉冲
;--------------------------------------------------------------
END