下面是我从网络上搜索整理出来的,但实现不了。
这也许在别人眼里很简单,但我实在是菜,小城市,可供查找的资料 实在有限,网络中搜到的内容也就那么多,只盼在这碰到热心人!把这些语句修改一下看能不能用。
AT45DB161B内的内容我是用编程器写进去的。
;AT89C51对AT45DB161B进行读操作,12M晶振
ORG 0000H ;程序执行开始地址 LJMP MAIN ;跳至START执行
MAIN:
SPI_SI bit P1.0 ;定义1脚为数据输入脚 SPI_CK bit p1.1 ;定义2脚为时钟脚 SPI_SO bit P1.2 ;定义3脚为数据输出脚 SPI_CS bit P1.3
GREEN bit P3.4 ;控制绿灯 red bit P3.3 ;控制红灯
;以下语句希望能把AT45DB161B的102030地址中的数值读出来, ;如果该值等于55H则点亮绿灯,否则点亮红灯
MOV R0,#52H LCALL SPIOUT ;写入52H这一命令字 MOV R0,#10H LCALL SPIOUT ;写入高位地址10H MOV R0,#20H LCALL SPIOUT ;写入中位地址20H MOV R0,#30H LCALL SPIOUT ;写入低位地址30H MOV R0,#0FFH LCALL SPIOUT ;加载8位任意字节0FFH MOV R0,#0FFH LCALL SPIOUT ;加载8位任意字节0FFH MOV R0,#0FFH LCALL SPIOUT ;加载8位任意字节0FFH MOV R0,#0FFH LCALL SPIOUT ;加载8位任意字节0FFH LCALL SPIIN ;调读一字节子程序 SETB SPI_CS
CJNE A,#55,ERR CLR GREEN AJMP $ ERR: CLR RED AJMP $
;将MCS51寄存器R0中的数据传送至SPI_SI线上 SPIOUT: CLR SPI_CS SETB SPI_CK ;使P1.1(时钟)输出为1
MOV R1, #08H ;置循环次数 MOV A, R0 ;8位数据送入累加器ACC SPIOUT1: CLR SPI_CK ;使P1.1(时钟)输出为0 NOP ;延时 NOP ;延时 RLC A ;左移累加器ACC最高位至C MOV SPI_SI, C ;进位C送SPI_SI线上 SETB SPI_CK ;使P1.1(时钟)输出为1 NOP ;留点写入所需的时间 NOP DJNZ R1, SPIOUT1 ;是8次吗? RET
;从SPI_SO线上接收8位数据并放入寄存器R0中 SPIIN: SETB SPI_CK ;使P1.1(时钟)输出为1 MOV R1, #08H ;置循环次数 SPIIN1: CLR SPI_CK ;使P1.1(时钟)输出为0 NOP ;延时 NOP ;延时 MOV C, SPI_SO ;AT45BD161B输出SPI_SO送进位C RLC A ;左移至累加器ACC SETB SPI_CK ;使P1.0输出为1
DJNZ R1, SPIIN1 ;是8次吗?
MOV R0, A ;8位送入R0 RET
END
|