6. 51单片机使用LCD12864液晶屏(8位并行)

模块介绍

液晶显示模块是 128×64 点阵的汉字图形型液晶显示模块,可显示汉字及图形, 内置 8192 个中文汉字(16X16 点阵)、128 个字符(8X16 点阵)及 64X256 点阵显示 RAM(GDRAM)。 可与 CPU 直接接口,提供两种界面来连接微处理机:8位并行及串行两种连接方式。 具有多种功能:光标显示、画面移位、睡眠模式等。

此实例采用8位并行方式

文档链接

引脚定义

图片

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// file: main.c
#include <8052.h>
#include "delay.h"

#define RS P1_0
#define RW P1_1
#define EN P2_5
#define PSB P1_3
#define DATA_PORT P0

void lcd12864_write_command(unsigned char command)
{
RS = 0;
RW = 0;
DATA_PORT = command;
EN = 1;
delay_50us(10);
EN = 0;
}

void lcd12864_write_data(unsigned char data)
{
RS = 1;
RW = 0;
DATA_PORT = data;
EN = 1;
delay_50us(10);
EN = 0;
}

void lcd12864_initialization()
{
delay(100);
lcd12864_write_command(0x30);
delay_50us(4);
lcd12864_write_command(0x30);
delay_50us(4);
lcd12864_write_command(0x0f);
delay_50us(4);
lcd12864_write_command(0x01);
delay(15);
lcd12864_write_command(0x06);
}

void display_chinese_characters()
{
// 您好!
// 从字符表查到的编码
unsigned char table[] = { 0xC4, 0xFA, 0xBA, 0xC3, 0xA3, 0xA1 };
unsigned char i;
// 第二行地址从0x90开始
lcd12864_write_command(0x90);
for(i=0; i<sizeof(table); i++)
{
lcd12864_write_data(table[i]);
}
}

void display_ascii()
{
unsigned char i;
unsigned char table[] = "hello world!";
// 第一行地址从0x80开始
lcd12864_write_command(0x80);
for(i=0; i<sizeof(table); i++)
{
lcd12864_write_data(table[i]);
}
// 接着是第三行,第三行地址从0x88开始
lcd12864_write_command(0x88);
for(i=0; i<sizeof(table); i++)
{
lcd12864_write_data(table[i]);
}
}

void setup()
{
lcd12864_initialization();
display_ascii();
display_chinese_characters();
}

void loop()
{

}

void main()
{
setup();
while(1) loop();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// file: delay.h
#ifndef __DELAY__
#define __DELAY__

/**
* 毫秒延时
* 晶震 11.0592MHz
*/
void delay(unsigned int millisecond)
{
unsigned char a,b;
while(millisecond--)
{
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
}

/**
* 50微秒延时
* 晶震 11.0592MHz
*/
void delay_50us(unsigned int times)
{
unsigned char a,b;
while(times--)
{
for(b=1;b>0;b--)
for(a=20;a>0;a--);
}
}

#endif // __DELAY__

演示效果