{
RF_NSEL = 0 // 片选拉低启动SPI通讯
SPI0DAT = (reg|0x80) // 写入1个字节的寄存器地址
while( SPIF == 0) // 等待SPI传输完成
SPIF = 0
SPI0DAT = value // 继续写入第二个字节(寄存器值)
while( SPIF == 0) // 等待SPI传输完成
SPIF = 0
RF_NSEL = 1 // 片选拉高结束SPI通讯
}
//-----------------------------------------------------------------------------
//函数描述: SPI读取函数
//相关参数:
//返回信息:
//
//-----------------------------------------------------------------------------
uchar SpiReadRegister (uchar reg)
{
RF_NSEL = 0// 片选拉低启动SPI通讯
SPI0DAT = reg // 写入1个字节的寄存器地址
while( SPIF == 0) // 等待SPI传输完成
SPIF = 0
SPI0DAT = 0xFF // 写一个Dummy字节(因为要读取的话必须用写入来启动一个交换数据的传输),当写入完成后从机的数据也完成了读入。
while( SPIF == 0) // 等待SPI传输配段完成
SPIF = 0
RF_NSEL = 1 // 片选拉高结束SPI通讯
return SPI0DAT// 返回读取的值(在SPI0DAT=0xFF中完成读取)
}
需要注意的是读写 *** 作实际上完成的都是数据的交换,即主机传送1个字节给从机,从机同时传送1个字节给主机。所以读 *** 作看起来像是写数据,但实际上培没誉写入完成后就可以从SPI0DAT中获得从机的察销应答数据了。
可以。51试过以前使用12864液晶时使用单片机IO口模拟SPI总线,导致显示程序耗时多,频繁刷新屏幕有闪烁。STC新的单片机(比如STC12C5A60S2)自带有SPI总线接口,用SPI硬件驱动LCD无疑是一个很好的选择。做过LCD功能扩展的朋友们知道,LCD驱动程序游差的核心氏磨汪就是SPI通讯部分,我们只用改写这一部分程序就可以,其他程序不变。这里我参考了STC的数据手册和网友的一个程序,还有一个小问题就是丛歼仔机的片选端在STC的头文件中是P1.4,但给的演示程序中改为了P1.3,这点要注意。可以发现使用SPI总线驱动时执行效率很高,使用单片机口线最少,十分便于程序编写。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)