LCD12864單片機源程序如下:
- #include "lcd12864.H"
- #include "delay.h"
- /*!
- * @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;
- }
- /* 字符顯示RAM地址 4行8列 */
- u8 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} //第四行
- };
- /*!
- * @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);
- SendByte(WRITE_DAT); //11111,RW(0),RS(1),0
- SendByte(0xf0&Dat); //高四位
- SendByte(Dat<<4); //低四位(先執行<<)
- }
- /*!
- * @brief LCD初始化
- * @since v1.0
- * @param None
- * @author Z小旋
- */
- void Lcd_Init(void)
- {
- delay_ms(50); //等待液晶自檢(延時>40ms)
- Lcd_WriteCmd(0x30); //功能設定:選擇基本指令集
- delay_ms(1);//延時>100us
- Lcd_WriteCmd(0x30); //功能設定:選擇8bit數據流
- delay_ms(1); //延時>37us
- Lcd_WriteCmd(0x0c); //開顯示
- delay_ms(1); //延時>100us
- Lcd_WriteCmd(0x01); //清除顯示,并且設定地址指針為00H
- delay_ms(30); //延時>10ms
- Lcd_WriteCmd(0x06); //進入設定點,初始化完成
- }
- /*!
- * @brief 顯示字符或漢字
- * @since v1.0
- * @param x: row(0~3)
- * @param y: line(0~7)
- * @param str: 要顯示的字符或漢字
- * @author Z小旋
- */
- void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str)
- {
- Lcd_WriteCmd(LCD_addr[x][y]); //寫初始光標位置
- while(*str>0)
- {
- Lcd_WriteData(*str); //寫數據
- str++;
- }
- }
- /*!
- * @brief 顯示圖片
- * @since v1.0
- * @param *pic 圖片地址
- * @author
- */
- void LCD_Display_Picture(uint8_t *img)
- {
- uint8_t x,y,i;
- Lcd_WriteCmd(0x34); //切換到擴充指令
- Lcd_WriteCmd(0x34); //關閉圖形顯示
- for(i = 0; i < 1; i++) //上下屏寫入
- {
- for(y=0;y<32;y++) //垂直Y寫32次
- {
- for(x=0;x<8;x++) //橫向X寫8次
- {
- Lcd_WriteCmd(0x80 + y); //行地址
- Lcd_WriteCmd(0x80 + x+i); //列地址
- Lcd_WriteData(*img ++); //寫高位字節數據 D15-D8
- Lcd_WriteData(*img ++); //寫低位字節數據 D7-D0
- }
- }
- }
- Lcd_WriteCmd(0x36);//打開圖形顯示
- Lcd_WriteCmd(0x30); //切換回基本指令
- }
- /*!
- * @brief 清屏函數
- * @since v1.0
- * @param None
- * @author Z小旋
- */
- void LCD_Clear(void)
- {
- Lcd_WriteCmd(0x01); //清屏指令
- delay_ms(2); //延時以待液晶穩定【至少1.6ms】
- }
-
復制代碼
所有資料51hei提供下載:
STM32 LCD12864 -Z小旋.7z
(308.63 KB, 下載次數: 93)
2019-9-21 17:58 上傳
點擊文件名下載附件
|