打印
[其它应用]

LCD12864(带字库)显示屏使用

[复制链接]
74|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Puchou|  楼主 | 2025-3-5 20:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、LCD12864简介
LCD12864是一种128x64像素的液晶显示屏,常用于电子设备中作为显示器。它通常采用ST7920或者类似的控制器,可以通过串行或并行接口与微控制器或其他设备通信。LCD12864显示屏可以显示单色图像和文本,通常用于嵌入式系统、电子仪器、3D打印机等领域。





二、管脚定义
以下是LCD12864的管脚定义:



三、命令
1. 功能能设定



初始值: 001 DL X 100
DL 位说明 : 8/4位 接口控制位,值=1:8位接口;值=0:4位接口;
RE:指令集选择控制位,值1:扩充指令集;值0:基本指令集;

需要注意的是,同一指令的动作不能同时改变DL和RE,需要先改变DL再改变RE才能确保设置正确。

2. 清屏指令(0x01)



冰镇 DDRAM填充 ASCII 码的0x20(空格),并且设定DRAM的地址计数器(AC)为00H,更新设置进入设定点将I/D设为1,游标右移AC加1 。

3. 地址归位



设定DDRAM的地址计数器(AC)到00H,并且将游标移到开头原点位置。

4. 进入设定点
初始值: 06H



I/D:值=1: 右移(DDRAM地址计数器AC加1);值=0;左移;
S:值=1:整体左移;值=0:整体右移;

5. 显示状态开关



初始值: 08H

D:值=1:整体显示开;值=0:整体显示关;
C:值=1:游标显示开;值=0:游标显示关;
B:值=1:游标位置显示反白打开;值=0:游标位置显示正常。

6. 设定CGRAM地址



设定CGRAM地址到地址计数器AC。

7. 设定DDRAM地址



设定DRAM地址到地址计数器AC。

8. 写资料到RAM


                                                                       
9. 读出RAM



                                                                       
四、DDRAM地址
图形显示坐标, 水平方向 X,以字节为单位;
垂直方向 Y,以位为单位 。





五、点亮实验
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)
        {

        }
}


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xundh/article/details/137427737

使用特权

评论回复
沙发
zhengshuai888| | 2025-3-6 08:10 | 只看该作者
这种单色屏现在很少使用了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

60

帖子

0

粉丝