我用AVR硬件SPI,給你參考一下‘。我用過幾款串行LCD,雖然控制器不一樣,但指令都是一樣的,只是延時稍有不同,改一下就能移植過來,而且都能正常顯示。
//數據線定義:
// SI==========MOSI // 十四腳
// A0==========PB0 //第四腳
// CS==========PB2//第二腳
// RES=========PB1 //第三腳
// SCL=========SCK //十三腳
/////////////////////////////////////////
///////////////////////////////
//發送一個字節到ST7565P并等待發送完畢
//入口:要發送的字節
//返回值:無
////////////////////////////////
void SPIByte(unsigned char byte)
{
SPDR = byte; //寫數據
while(!(SPSR & (1<<SPIF))); //等待發送完成
}
////////////////////////////////////////////////
//將一個字節發送的ST7565P的函數
//入口參數: select ,data
//select:根據此值確定發送給ST7565P的是數據還是命令
//data: 要發送給ST7565的一個字節
//返回值:無
////////////////////////////////////////////////
void LCD_SPISend(unsigned char select,unsigned char data)
{
PORTB &= ~(1<<2); // CS=0 芯片使能信號
if(select == COMMAND) //傳輸的是命令
{
PORTB &= ~(1<<0); // 根據ST7565P的數據手冊,傳輸命令時A0應該是為低電平
SPIByte(data);
PORTB |= 1<<0; // A0=1
}
else
{
SPIByte(data);
}
PORTB |= 1<<2; //CS= 恢復不使能
}
////////////////////////////////////////////
//寫坐標函數
//入口參數:x y
//y: 頁面地址,此液晶將顯示區域分為9個頁面,y的值域0~8
//x: 列地址,值域:0~127
//返回值:無
////////////////////////////////////////////
void LCD_XYSet(unsigned char x,unsigned char y)
{
LCD_SPISend(COMMAND,0xB0|y); //y的值為0~8
LCD_SPISend(COMMAND,0x10|(x>>4));
LCD_SPISend(COMMAND,0x00|(x&0x0F));
}
void LCD_Init(void)
{
SPCR = 0x5C;
SPSR |= 1<<SPI2X;
//SPI的功能設置解釋:使能SPI;采用主機模式;SPI的傳輸模式為模式3;時鐘頻率為系統時鐘的兩分頻
_delay_us(1);
SPIByte(0xFF); //可發可不發,無意義
PORTB &= ~(1<<1); //將復位腳拉低
_delay_ms(5); //延時5ms,等待電源穩定
PORTB |= 1<<1; //將復位腳拉高
_delay_ms(5);
LCD_SPISend(COMMAND,0xAE); //將液晶屏的顯示關掉
LCD_SPISend(COMMAND,0xA3); //設置偏壓比
LCD_SPISend(COMMAND,0xA0); //設置SEG 輸出方向
LCD_SPISend(COMMAND,0xC8); //設置公共端輸出掃描方向
LCD_SPISend(COMMAND,0x25); //調整 (1 + Rb/Ra) ratio 值,調整此值影響很大
LCD_SPISend(COMMAND,0x81); //開始設置α的命令
LCD_SPISend(COMMAND,0x0c); //設置α的值,值越大對比度越強,調整此值影響不太,是
//微調的
_delay_ms(5);
LCD_SPISend(COMMAND,0x2F); //開啟相關電壓
_delay_ms(5);
LCD_SPISend(COMMAND,0xAF); //顯示開
LCD_SPISend(COMMAND,0xF8);
LCD_SPISend(COMMAND,0x01); //設置升壓比
_delay_ms(10); //延時
}
////////////////////////////////////////
//清屏函數
//入口:無
//返回值:無
///////////////////////////////////////
void Clear_Display(void)
{
unsigned char i;
unsigned char j;
for(i=0;i<8;i++)
{
LCD_XYSet(0,i);
for(j=0;j<128;j++)
{
LCD_SPISend(DATA,0); //傳輸數據
}
}
} |