簡單介紹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,"謝謝大家");
這種格式即可但是一般不停調用比較占程式記憶體空間,希望了解也希望大家提供更好的方法謝謝大家。