一、LCD12864簡介
LCD12864是一種128x64像素的液晶顯示屏,常用于電子裝置中作為顯示器。它通常采用ST7920或者類似的控制器,可以通過串行或并行接口與微控制器或其他裝置通信。LCD12864顯示屏可以顯示單色圖像和文本,通常用于嵌入式系統、電子儀器、3D列印機等領域。
二、管腳定義
以下是LCD12864的管腳定義:
管腳編号 | 功能 |
1 | VSS(地) |
2 | VDD(電源,5V) |
3 | V0(液晶對比度調節) |
4 | RS(寄存器選擇,1:資料;2:指令寄存器) |
5 | R/W(讀/寫選擇,1:讀;2:寫) |
6 | E(使能信号) |
7-14 | DB0-DB7(資料位) |
15 | CS1,片選信号,低有效,對應左半屏64x64點 |
16 | CS2,片選信号,低有效,對應右半屏64x64點 |
17 | RST(複位,低有效) |
18 | VOUT(液晶偏壓輸出) |
19 | LED-A(LED背光陽極) |
20 | LED-K(LED背光陰極) |
請注意,這隻是一種基本的表示方法,具體的管腳定義可能會因制造商或型号而有所不同。
三、指令
1. 功能能設定
位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | DL | X | 0/RE | x | x |
初始值: 001 DL X 100
DL 位說明 : 8/4位 接口控制位,值=1:8位接口;值=0:4位接口;
RE:指令集選擇控制位,值1:擴充指令集;值0:基本指令集;
需要注意的是,同一指令的動作不能同時改變DL和RE,需要先改變DL再改變RE才能確定設定正确。
2. 清屏指令(0x01)
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 |
冰鎮 DDRAM填充 ASCII 碼的0x20(空格),并且設定DRAM的位址計數器(AC)為00H,更新設定進入設定點将I/D設為1,遊标右移AC加1 。
3. 位址歸位
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | X |
設定DDRAM的位址計數器(AC)到00H,并且将遊标移到開頭原點位置。
4. 進入設定點
初始值: 06H
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | I/D | S |
I/D:值=1: 右移(DDRAM位址計數器AC加1);值=0;左移;
S:值=1:整體左移;值=0:整體右移;
5. 顯示狀态開關
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | D | C | B |
初始值: 08H
D:值=1:整體顯示開;值=0:整體顯示關;
C:值=1:遊标顯示開;值=0:遊标顯示關;
B:值=1:遊标位置顯示反白打開;值=0:遊标位置顯示正常。
6. 設定CGRAM位址
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | AC 5 | AC 4 | AC 3 | AC 2 | AC 1 | AC 0 |
設定CGRAM位址到位址計數器AC。
7. 設定DDRAM位址
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | AC 6 | AC 5 | AC 4 | AC 3 | AC 2 | AC 1 | AC 0 |
設定DRAM位址到位址計數器AC。
8. 寫資料到RAM
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
寫入資料到内部的RAM。 |
9. 讀出RAM
RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
1 | 1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
從内部RAM讀取資料。 |
四、DDRAM位址
圖形顯示坐标, 水準方向 X,以位元組為機關;
垂直方向 Y,以位為機關 。
行 | X坐标1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Line1 | 80H | 81H | 82H | 83H | 84H | 85H | 86H | 87H |
Line2 | 90H | 91H | 92H | 93H | 94H | 95H | 96H | 97H |
Line3 | 88H | 89H | 8AH | 8BH | 8CH | 8DH | 8EH | 8FH |
Line4 | 98H | 99H | 9AH | 9BH | 9CH | 9DH | 9EH | 9FH |
五、點亮實驗
1. 硬體連接配接
2. 代碼實作
(1)寫指令
/**
* @brief 寫指令
*/
void lcd12864_write_cmd(u8 cmd){
LCD12864_RS = 0;
LCD12864_RW = 0;
LCD12864_EN = 0;
LCD12864_DATAPORT = cmd;
delay_ms(1);
LCD12864_EN = 1;
delay_ms(1);
LCD12864_EN = 0;
}
(2)寫資料
/**
* @brief 寫資料
*/
void lcd12864_write_data(u8 dat){
LCD12864_RS = 1;
LCD12864_RW = 0;
LCD12864_EN = 0;
LCD12864_DATAPORT = dat;
delay_ms(1);
LCD12864_EN = 1;
delay_ms(1);
LCD12864_EN = 0;
}
(3)初始化
/**
* @brief 初始化
*/
void lcd12864_init(void){
LCD12864_PSB = 1;
// 功能設定,基本指令集,8位
lcd12864_write_cmd(0x30);
// 不使用光标, 不閃爍
lcd12864_write_cmd(0x0c);
// 不移動光标,不滾動
lcd12864_write_cmd(0x06);
// 清屏
lcd12864_write_cmd(0x01);
}
(4)清屏
/**
* @brief 清屏
*/
void lcd12864_clear(void){
lcd12864_write_cmd(0x01);
}
(5)顯示字元串
/**
* @brief 顯示字元串
*/
void lcd12864_write_string(u8 x, u8 y, u8 *str){
if(y<0)y=0;
if(x<0)x=0;
if(y>3)y=3;
x &= 0x0f;
switch(y){
case 0:
x |= 0x80;
break;
case 1:
x |= 0x90;
break;
case 2:
x |= 0x88;
break;
case 3:
x |= 0x98;
break;
}
lcd12864_write_cmd(x);
while(*str!='\0'){
lcd12864_write_data(*str);
str++;
}
}
(6)主程式
#include "led_utils.h"
#include "ired_utils.h"
#include "segment_display_utils.h"
#include "uart_utils.h"
#include "lcd12864_utils.h"
/**
* @brief 主函數
*/
void main()
{
// 關閉所有led
led_all_off();
// 速率 9600
uart_init(0xfa);
lcd12864_init();
lcd12864_clear();
lcd12864_write_string(0, 0, "你好,中國");
while(1)
{
}
}
本文代碼開源位址:
https://gitee.com/xundh/learn51