這里我們只講解接線和代碼實現,具體的原理在上一篇博客中已經講解,如果想了解具體原理可以查看上一篇博客
《STM32 LCD12864 串行通信模式 (從原理讓你理解)》https://blog.csdn.net/as480133937/article/details/97650805
下方代碼的實現也是基于上一篇的講解順序來的
設備: STM32F407ZGT6
引腳接線:
VSS——GND
VDD——VCC(5V or 3.3V)
CS ——接VCC,持續高電平,一直選通。
SID ——接PE0
SCLK ——接PE1
PSB——接GND 串行模式 或者飛線與1腳相連
BLA——VCC(5V or 3.3V) 或者飛線與2腳相連
BLK——接GND 或者飛線與1腳相連
剩余引腳不接,留空
這樣我們最少只會用到4根線 VCC電源 GND地線 SID串行輸入 SCLK 時鐘 便可以實現串行通信LCD寫入一個字節:
#define WRITE_CMD 0xF8//寫命令
#define WRITE_DAT 0xFA//寫數據
/*!
* @brief LCD串行發送一個字節
* @since v1.0
* @param byte 寫入字節
* @author Z小旋
*/
void SendByte(u8 byte)
{
u8 i;
for(i = 0;i < 8;i++)
{
if((byte << i) & 0x80) //0x80(1000 0000) 只會保留最高位
{
SID = 1; // 引腳輸出高電平,代表發送1
}
else
{
SID = 0; // 引腳輸出低電平,代表發送0
}
/*或
SID = (Dbyte << i) & 0x80;
上面那樣為了方便理解
*/
SCLK = 0; //時鐘線置低 允許SID變化
delay_us(5); //延時使數據寫入
SCLK = 1; //拉高時鐘,讓從機讀SID
}
}
/*!
* @brief LCD寫指令
* @since v1.0
* @param Cmd 要寫入的指令
* @author Z小旋
*/
void Lcd_WriteCmd(u8 Cmd )
{
delay_ms(1); //由于我們沒有寫LCD正忙的檢測,所以直接延時1ms,使每次寫入數據或指令間隔大于1ms 便可不用寫忙狀態檢測
SendByte(WRITE_CMD); //11111,RW(0),RS(0),0
SendByte(0xf0&Cmd); //高四位
SendByte(Cmd<<4); //低四位(先執行<<)
}
/*!
* @brief LCD寫數據
* @since v1.0
* @param Dat 要寫入的數據
* @author Z小旋
*/
void Lcd_WriteData(u8 Dat )
{
delay_ms(1); //由于我們沒有寫LCD正忙的檢測,所以直接延時1ms,使每次寫入數據或指令間隔大于1ms 便可不用寫忙狀態檢測
SendByte(WRITE_DAT); //11111,RW(0),RS(1),0
SendByte(0xf0&Dat); //高四位
SendByte(Dat<<4); //低四位(先執行<<)
}
向LCD發送一個字節,也就是SID引腳相對于高低電平 高電平=1 低電平=0 同時時鐘線變化,使得數據可以讀取和發送
結合第一篇原理介紹即可理解。
關于&運算與<< 參看 《C語言運算符與操作符的用法全面匯總(非常有用)》
LCD初始化:
這里為了方便移植,將GPIO的初始化與LCD初始化分為兩個,使用時根據自己的引腳只修改GPIO初始化即可
宏定義和GPIO初始化:
#define WRITE_CMD 0xF8//寫命令
#define WRITE_DAT 0xFA//寫數據
//接口(SID: PE1 SCLK: PE0)
#define SID PEout(1)
#define SCLK PEout(0)/*!
* @brief GPIO_init
* @since v1.0
* @param None
* @author Z小旋
* 使用時自行修改這里的初始化即可
*/
void lcd_GPIO_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE時鐘
//GPIOE0,E1初始化設置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//無上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
SID=1;
SCLK=1;
}
根據不同的型號和管腳修改對應初始化即可
LCD初始化:
/*!
* @brief LCD初始化
* @since v1.0
* @param None
* @author Z小旋
*/
void Lcd_Init(void)
{
delay_ms(50); //等待液晶自檢(延時>40ms)
Lcd_WriteCmd(0x30); //功能設定:選擇基本指令集 ,選擇8bit數據流
delay_ms(1);//延時>137us
Lcd_WriteCmd(0x0c); //開顯示
delay_ms(1); //延時>100us
Lcd_WriteCmd(0x01); //清除顯示,并且設定地址指針為00H
delay_ms(30); //延時>10ms
Lcd_WriteCmd(0x06); //每次地址自動+1,初始化完成
}
有點太多了,還要重新排版,有需要的話直接看下下面的把
| 歡迎光臨 (http://m.raoushi.com/bbs/) | Powered by Discuz! X3.1 |