首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

求spi的汇编程序,该如何处理

2012-02-20 
求spi的汇编程序求spi的汇编程序。我自己也写了一个但是不知道不能写进去,还是读出来时有错误。用lcd显示结

求spi的汇编程序
求spi的汇编程序。
我自己也写了一个   但是不知道不能写进去,还是读出来时有错误。用lcd显示结果总是错误的数据。
能看看这几个spi程序先??

;//FUNCTION:   R5   READ_SPI(   R4   )
;//***********************************************
;//DESCRIBE:读指令。
;//INPUT:   地址   R4
;//OUTPUT:   数据   R5
;//USING   OTHER   REG:   R7
;//***********************************************
READ_SPI:
;MOV   A,R4
CLR   CS_SPI
CLR   DI_SPI
CLR   CLK_SPI
SETB   DO_SPI
SETB   CS_SPI

SETB   DI_SPI    
CALL   PULSE_SPI   ;//送开始位1

CALL   PULSE_SPI;//送操作位10
CLR   DI_SPI
CALL   PULSE_SPI;//

CALL   ADDRESS_SPI     ;//定位地址R4
CALL   GETDATA_SPI     ;//得到数据R5

RET

;//FUNCTION:   PULSE_SPI()
;//****************************************
;//DESCRIBE:在CLK_SPI引脚产生一个脉冲。前提是CLK_SPI为低电平
;//****************************************
PULSE_SPI:
SETB   CLK_SPI
CLR   CLK_SPI
RET


;//FUNCTION:   ADDRESS_SPI(R4)
;//***************************************
;//DESCRIBE:   根据地址R4(其中有7位才有效的)   在SPI定位
;//INPUT:   R4
;//USING   OTHER   REG:   R7
;//***************************************
ADDRESS_SPI:
MOV   A,R4
MOV   R7,#07H
RLC   A     ;//丢掉A7   即是第8位
SEND_ADDRESS_SPI:;//地址一位位发送出去
RLC   A
MOV   DI_SPI,C
CALL   PULSE_SPI
DJNZ   R7,SEND_ADDRESS_SPI

RET

;//FUNCTION:     R5   GETDATA_SPI()
;//***************************************
;//DESCRIBE:   在DO_SPI引脚接收串行数据   保存到R5  
;//OUTPUT:   R5
;//USING   OTHER   REG:   R7
;//***************************************
GETDATA_SPI:
MOV   R7,#08H
CLR   A
BIT_GETDATA_SPI:       ;//数据8bit一位位接收  
CALL   PULSE_SPI
MOV   C,DO_SPI
RLC   A
DJNZ   R7,BIT_GETDATA_SPI

CLR   CS_SPI
MOV   R5,A

RET

;//FUNCTION:     PUTDATA_SPI(R5)
;//***************************************
;//DESCRIBE:   在DO_SPI引脚发送串行数据R5  
;//INPUT:   R5
;//USING   OTHER   REG:   R7
;//***************************************
PUTDATA_SPI:
MOV   R7,#08H
MOV   A,R5
BIT_PUTDATA_SPI:               ;//数据8bit一位位发送
RLC   A
MOV   DI_SPI,C
CALL   PULSE_SPI
DJNZ   R7,BIT_PUTDATA_SPI

CLRDI_SPI
CLR   CS_SPI
SETB   CS_SPI
JNB   DO_SPI,$     ;//查询DO_SPI是否为   1   ,若是,送数据操作结束

RET

;//FUNCTION:     EWEN_SPI()
;//***************************************
;//DESCRIBE:   写允许.
;//***************************************
EWEN_SPI:
CLR   CS_SPI
CLR   DI_SPI
CLR   CLK_SPI
SETB   CS_SPI

SETB   DI_SPI;//送开始位1
CALL   PULSE_SPI

CLR   DI_SPI     ;//送操作码00
CALL   PULSE_SPI
CALL   PULSE_SPI

MOV   R4,#0FFH       ;//送地址11XXXXX
CALL   ADDRESS_SPI

CLR   CS_SPI

RET
;//FUNCTION:   WRITE_SPI(RI,R5)
;//****************************************
;//DESCRIBE:   把数据R5写到地址R4   An-A0的存储器上
;//INPUT:   ADDRESS   R4,DATA   R5


;//****************************************
WRITE_SPI:
CLR   CS_SPI
CLR   DI_SPI
CLR   CLK_SPI
SETB   DO_SPI
SETB   CS_SPI

SETB   DI_SPI
CALL   PULSE_SPI   ;//开始位   1

CLR   DI_SPI   ;//操作码   01
CALL   PULSE_SPI
SETB   DI_SPI
CALL   PULSE_SPI

CALL   ADDRESS_SPI     ;//定位R4   地址

CALL   PUTDATA_SPI     ;//送数据R5   进去

CLR   CS_SPI

RET

[解决办法]
我有调试好的spi程序,需要的话可以联系我.tl_mail@126.com

热点排行