51单片机学习笔记15 LCD12864(带字库)显示屏使用
- 一、LCD12864简介
 - 二、管脚定义
 - 三、命令
 - 1. 功能能设定
 - 2. 清屏指令(0x01)
 - 3. 地址归位
 - 4. 进入设定点
 - 5. 显示状态开关
 - 6. 设定CGRAM地址
 - 7. 设定DDRAM地址
 - 8. 写资料到RAM
 - 9. 读出RAM
 
- 四、DDRAM地址
 - 五、点亮实验
 - 1. 硬件连接
 - 2. 代码实现
 - (1)写命令
 - (2)写数据
 - (3)初始化
 - (4)清屏
 - (5)显示字符串
 - (6)主程序
 
一、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 | 
|---|---|---|---|---|---|---|---|
| 0 | 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 | 
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 
冰镇 DDRAM填充 ASCII 码的0x20(空格),并且设定DRAM的地址计数器(AC)为00H,更新设置进入设定点将I/D设为1,游标右移AC加1 。
3. 地址归位
| RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 | 
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 
设定DDRAM的地址计数器(AC)到00H,并且将游标移到开头原点位置。
4. 进入设定点
初始值: 06H
| RS | RW | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 | 
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 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 | 
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 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 | 
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 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 | 
|---|---|---|---|---|---|---|---|---|---|
| 0 | 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 | 0 | 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



















