天天看點

51單片機學習筆記15 LCD12864(帶字庫)顯示屏使用

作者:程式設計圈子

一、LCD12864簡介

LCD12864是一種128x64像素的液晶顯示屏,常用于電子裝置中作為顯示器。它通常采用ST7920或者類似的控制器,可以通過串行或并行接口與微控制器或其他裝置通信。LCD12864顯示屏可以顯示單色圖像和文本,通常用于嵌入式系統、電子儀器、3D列印機等領域。

51單片機學習筆記15 LCD12864(帶字庫)顯示屏使用
51單片機學習筆記15 LCD12864(帶字庫)顯示屏使用

二、管腳定義

以下是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,以位為機關 。

51單片機學習筆記15 LCD12864(帶字庫)顯示屏使用
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. 硬體連接配接

51單片機學習筆記15 LCD12864(帶字庫)顯示屏使用
51單片機學習筆記15 LCD12864(帶字庫)顯示屏使用

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

繼續閱讀