51单片机学习笔记15 LCD12864(带字库)显示屏使用

编程难碎了呜呜2024-04-06 16:02:59  139

一、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!=''){ 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://www.414w.com/read/177271.html
0
最新回复(0)