一、模塊介紹
LCD12864 顯示模塊是一種常見的液晶顯示模塊,尺寸為128x64像素。它采用液晶顯示技術(shù),可以顯示文本、圖形和圖像。
LCD12864 顯示模塊通常由液晶屏、驅(qū)動電路和背光源組成。液晶屏由大量的液晶像素組成,每個像素可以是開啟或關(guān)閉狀態(tài),從而形成文本、圖形和圖像。驅(qū)動電路負(fù)責(zé)控制每個像素的開關(guān)狀態(tài),通過輸入觸發(fā)信號來控制屏幕顯示的內(nèi)容。背光源提供背光照明,使得顯示內(nèi)容在暗環(huán)境下也能清晰可見。
LCD12864 顯示模塊具有以下特點(diǎn):
- 高分辨率: 128x64像素的顯示區(qū)域,可以顯示更多的內(nèi)容。
- 多功能性: 可以顯示文本、圖形和圖像,適用于不同的應(yīng)用場景。
- 易于控制: 通常使用并行或串行接口與微控制器或其他設(shè)備進(jìn)行通信,控制顯示內(nèi)容。
- 低功耗: 液晶顯示技術(shù)相對較低的功耗,適用于電池供電的設(shè)備。
- 可靠性高: 液晶顯示模塊具有較長的使用壽命和穩(wěn)定性,適用于長時間運(yùn)行的應(yīng)用。
- 顯示效果好: 具有高對比度和清晰度,顯示內(nèi)容清晰可見。
LCD12864 顯示模塊廣泛應(yīng)用于工業(yè)控制、儀器儀表、電子設(shè)備等領(lǐng)域,常用于顯示實(shí)時數(shù)據(jù)、系統(tǒng)狀態(tài)、菜單等信息。
關(guān)注微信公眾號--星之援工作室 發(fā)送關(guān)鍵字(LCD12864)
????
二、連線以及驅(qū)動代碼?-- 串行
LCD12864是一款基于串行接口的液晶顯示屏,它具有128x64像素的分辨率。以下是其連線以及驅(qū)動代碼的簡要說明。
一、連線
1. VCC(電源正)連接到+5V
2. GND(電源負(fù))連接到地
3. RS(數(shù)據(jù)位鎖存器)連接到Arduino的數(shù)字口(如D2)
4. RW(讀寫控制)連接到Arduino的數(shù)字口(如D3)
5. EN(使能控制)連接到Arduino的數(shù)字口(如D4)
6. D0-D7(數(shù)據(jù)線)連接到Arduino的數(shù)字口(如D5-D12)
7. 時鐘信號(CLK)連接到Arduino的
下圖是STM32f103F103C8T6
LCD.c
LCD的驅(qū)動代碼如下
#include "lcd.H"
#include "delay.h"
/*!
* @brief GPIO_init
* @since v1.0
* @param None
*/
void lcd_GPIO_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能PB,PE端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 根據(jù)設(shè)定參數(shù)初始化GPIOB.5
// GPIO_SetBits(GPIOB, GPIO_Pin_5); // PB.5 輸出高
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串行發(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; // 拉高時鐘,讓從機(jī)讀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);
SendByte(WRITE_DAT); // 11111,RW(0),RS(1),0
SendByte(0xf0 & Dat); // 高四位
SendByte(Dat << 4); // 低四位(先執(zhí)行<<)
}
/*!
* @brief LCD初始化
* @since v1.0
* @param None
* @author Z小旋
*/
void Lcd_Init(void)
{
delay_ms(50); // 等待液晶自檢(延時>40ms)
Lcd_WriteCmd(0x30); // 功能設(shè)定:選擇基本指令集
delay_ms(1); // 延時>100us
Lcd_WriteCmd(0x30); // 功能設(shè)定:選擇8bit數(shù)據(jù)流
delay_ms(1); // 延時>37us
Lcd_WriteCmd(0x0c); // 開顯示
delay_ms(1); // 延時>100us
Lcd_WriteCmd(0x01); // 清除顯示,并且設(shè)定地址指針為00H
delay_ms(30); // 延時>10ms
Lcd_WriteCmd(0x06); // 進(jìn)入設(shè)定點(diǎn),初始化完成
}
/*!
* @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]); // 寫初始光標(biāo)位置
while (*str > 0)
{
Lcd_WriteData(*str); // 寫數(shù)據(jù)
str++;
}
}
/*!
* @brief 顯示圖片
* @since v1.0
* @param *pic 圖片地址
* @author
*/
void LCD_Display_Picture(uint8_t *img)
{
uint8_t x, y, i;
Lcd_WriteCmd(0x34); // 切換到擴(kuò)充指令
Lcd_WriteCmd(0x34); // 關(guān)閉圖形顯示
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++); // 寫高位字節(jié)數(shù)據(jù) D15-D8
Lcd_WriteData(*img++); // 寫低位字節(jié)數(shù)據(jù) D7-D0
}
}
}
Lcd_WriteCmd(0x36); // 打開圖形顯示
Lcd_WriteCmd(0x30); // 切換回基本指令
}
/*!
* @brief 清屏函數(shù)
* @since v1.0
* @param None
* @author Z小旋
*/
void LCD_Clear(void)
{
Lcd_WriteCmd(0x01); // 清屏指令
delay_ms(2); // 延時以待液晶穩(wěn)定【至少1.6ms】
}
?LCD.h
#ifndef __lcd12864_H_
#define __lcd12864_H_
#include "sys.h"
#define WRITE_CMD 0xF8 // 寫命令
#define WRITE_DAT 0xFA // 寫數(shù)據(jù)
// 接口(SID: PB1 SCLK: PB0)
#define SID PBout(1)
#define SCLK PBout(0)
void lcd_GPIO_init(void);
void Lcd_Init(void);
void SendByte(u8 Dbyte);
void LCD_Clear(void);
void LCD_Display_Words(uint8_t x, uint8_t y, uint8_t *str);
void LCD_Display_Picture(uint8_t *img);
void Lcd_WriteData(u8 Dat);
void Lcd_WriteCmd(u8 Cmd);
#endif
main.c
LCD自帶字庫,可以直接使用
#include "stm32f10x.h"
#include "sys.h"
#include "lcd.h"
#include "delay.h"
#include "usart.h"
#include "adc.h"
int main(void)
{
uart_init(115200);
delay_init();
lcd_GPIO_init();
Lcd_Init();
while (1) {
/*漢字顯示*/
LCD_Display_Words(0, 0, "清時明月漢時關(guān)");
LCD_Display_Words(1, 0, "萬里長征人未還");
LCD_Display_Words(2, 0, "但使龍城飛將在");
LCD_Display_Words(3, 0, "不教胡馬度陰山");
}
}
三、參考
STM32 LCD12864 串行通信模式 (從原理讓你理解)https://blog.csdn.net/as480133937/article/details/97650805?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%98%BE%E7%A4%BA%E6%A8%A1%E5%9D%97%EF%BC%88LCD12864%20--%20%E4%B8%B2%E8%A1%8C%EF%BC%89&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-97650805.142^v96^pc_search_result_base7&spm=1018.2226.3001.4187
完整代碼請關(guān)注衛(wèi)星公眾號進(jìn)行獲取和咨詢
聯(lián)系方式 微信號:13648103287