简单介绍SPI协议:
MISO也被称作是
SIMO
,
DOUT
,
DO
,
SDO
或
SO(主机输入)
;
MOSI也被称作是
SOMI
,
DIN
,
DI
,
SDI
或
SI
(主机输出);
NSS也被称作是
CE
,
CS
或
SSEL。
SCLK也被称作是
SCK,串行时钟信号。
SPI具有很多优点:全双工串行通信;高速数据传输速率。软件配置方便;数据传输灵活,不限于8位,它可以是任意大小的字;简单的硬件结构。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同),频率理论上可以无限快。
言归正传,附上我们的代码;
驱动程序
//lcd发送一个字节
void SendByte(char Dbyte)
{
char i;
for(i=0;i<8;i++)
{
SCK=0;
delay_us(10);
if((Dbyte&0x80)==0x80) SID=1;
else SID=0;
Dbyte =Dbyte<<1;
SCK=1;
delay_us(10);
SCK=0;
delay_us(10);
}
}
//lcd读取一个字节
unsigned char ReceiveByte(void)
{
char i,temp1,temp2;
temp1=0;
temp2=0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
SCK=0;
delay_us(10);
SCK=1;
delay_us(10);
SCK=0;
delay_us(10);
if(SID) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
SCK=0;
delay_us(10);
SCK=1;
delay_us(10);
SCK=0;
delay_us(10);
if(SID) temp2++;
}
return ((0xf0&temp1)+(0xf&temp2));
}
//写指令
void Write_Com(char Cbyte)
{
CS = 1;
Chk_Busy();
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte);
SendByte(0xf0&Cbyte<<4);
CS = 0;
}
//写数据
void Write_Data(char Dbyte)
{
CS=1;
Chk_Busy ();
SendByte (0xfa);
SendByte (0xf0&Dbyte);
SendByte (0xF0&Dbyte<<4);
CS=0;
}
//查忙
void Chk_Busy(void)
{
do
SendByte(0xfc);
while(0x80&ReceiveByte());
}
//清屏
void LCD_Clear(void)
{
Write_Com(0x01);
delay_ms(2);
}
//初始化
void LCD_Init(void)
{
delay_ms(50);
RES=0;
delay_ms(50);
RES=1;
delay_ms(50);
Write_Com(0x30);
delay_ms(50);
Write_Com(0x30);
delay_ms(50);
Write_Com(0x30);
delay_ms(50);
Write_Com(0x03);
delay_ms(50);
Write_Com(0x01);
delay_ms(50);
Write_Com(0x06);
delay_ms(50);
Write_Com(0x0c);
delay_ms(50);
}
显示程序
uchar LCD_addr[4][8]={
{0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87},
{0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97},
{0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F},
{0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F}
};
void LCD_Display_Words(uchar x,uchar y,uchar *str)
{
Write_Com(LCD_addr[x][y]);
while(*str>0)
{
Write_Data(*str);
str++;
}
}
//只需要在主函数调用,显示自己想显示的 ,12864自带字库直接输入汉字就行
如:
LCD_Display_Words(1,2,"谢谢大家");
这种格式即可但是一般不停调用比较占程序内存空间,希望理解也希望大家提供更好的方法谢谢大家。