/*==================================================================================== 文件描述:由于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