/*====================================================================================
文件描述:由于51单片机内部没有SPI总线通信资源,所以使用51单片机模拟SPI通信时序来实现 SPI通信功能在该文
件中定义了时钟线、数据输入、输出,及片选线。
修改日期:2012-4-2
作 者:田进军
联系方式:QQ:980306051,欢迎有这方面的爱好者联系交流
共同学习,一起进步。
版权申明:该代码可能由你任意修改,不涉及侵权。
===================================================================================*/
#ifndef _SPI_H_
#define _SPI_H_
#define uchar unsigned char
#define uint unsigned int
sbit SPI_SCK = P3^2;
sbit SPI_SI = P3^3;
sbit SPI_SO = P3^4;
sbit SPI_CS = P3^5;
void Data_Send(uint Sdata); //数据传送函数,方便调用
uint Data_Rece(void); //数据接收函数,方便调用
void Write_Enable(void); //写使能函数
void Write_Disable(void); //写禁止函数
void Byte_Write(uchar Addr,uint Wdata); //字节写函数
void Page_Write(uchar Addr,uint *s); //页写函数
uint Byte_Read(uchar Addr); //读数据函数
uint read_data;
extern void main(void)
{
lcd_init(); //LCD初始化
SPI_CS = 0;
_nop_();
Write_Enable();//写使能函数
_nop_();
Byte_Write(0x00,0x80);//字节写函数
_nop_() ;
P0 = Byte_Read(0x00);//读数据函数
lcd_display(read_data, 0);
while(1);
}
extern void Data_Send(uint Sdata)//数据传送函数,方便调用
{
uint i;
for(i=8; i>0; i--)
{
SPI_SCK = 0; //上升沿发送数据
_nop_();
if(Sdata&0x80)//判断高位是否为1
SPI_SO = 1;
else
SPI_SO = 0;
_nop_();
SPI_SCK = 1;
Sdata <<= 1;
}
}
extern uint Data_Rece(void)//数据接收函数,方便调用
{
uint i;
uint Temp_data;
for(i=8; i>0; i--)
{
SPI_SCK = 1;//下降沿接收数据
_nop_();
if(SPI_SI)
Temp_data |= 0x01;
_nop_();
SPI_SCK = 0;
Temp_data <<= 1;
}
return Temp_data;
}
extern void Write_Enable(void)//写使能函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x06);//发送写使能指令//0000 01100
_nop_();
SPI_CS = 1;
}
extern void Write_Disable(void)//写禁止函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x04);//发送写禁指令
_nop_();
SPI_CS = 1;
}
extern void Byte_Write(uchar Addr,uint Wdata)//字节写函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x02);//发送写数据止指令
Data_Send(Addr);
Data_Send(Wdata);
_nop_();
SPI_CS = 1;
// lcd_display(Wdata, 1);
}
extern void Page_Write(uchar Addr,uchar *s)//页写函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x02);//发送写数据指令
Data_Send(Addr);
Data_Send(*s++);
_nop_();
SPI_CS = 1;
}
extern uint Byte_Read(uchar Addr)//读数据函数
{
uint Rdata;
SPI_CS = 0;
_nop_();
Data_Send(0x03);//发送读数据指令
Data_Send(Addr);
Rdata = Data_Rece();
_nop_();
SPI_CS = 1;
return Rdata;
}
#endif