天天看点

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

继续阅读