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