内容包括液晶屏常识,12864液晶显示原理,点阵型LCD文字与图形软硬件设计实例。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!
目录:
一、12864液晶显示原理
1、点阵LCD的显示原理
2、12864点阵型LCD简介
3、12864LCD的指令系统及时序
4、12864点阵型LCD软硬件设计实例
1)硬件原理图 2)程序流程图 3)字模代码
5、12864点阵型LCD应用举例
1)硬件部分
2)软件部分(常用数据类型内存存储形式)
(1)程序架构 (2)主程序 (3)驱动程序 (4)字库文件
6、实物显示效果
二、12864液晶显示任何图像
1、所需软件
1)Any to Icon软件 2)Windows画图软件 3)字模提取软件
2、DIY一副图画
3、C语言代码
附录
1、机内码和区位码的区别
2、液晶屏常识
1)什么是COG型LCD
2)LCD显示模块的外部接口
(1)8080模式,并行 (2)6800模式,并行 (3)串行模式
------------------------------------------------------------------------------------------------------------------------
一、12864液晶显示原理
1、点阵LCD的显示原理
在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码(汉字ASCII码)。而剩下的低128位则留给英文字符使用,即英文的内码。机内码和区位码的区别见附录。
那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:
图1 “A”字模图
而中文的“你”在字模中的记载却如图2所示:
图2 “你”字模图
如果需要反白只要取反“位代码”即可。
------------------------------------------------------------
2、12864点阵型LCD简介
12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128*64全点阵液晶显示器组成。可完成图形显示,也可以显示8*4个(16*16点阵)汉字。
管脚号 | 管脚名称 | LEVER | 管脚功能描述 |
1 | VSS | 0 | 电源地 |
2 | VDD | +5.0V | 电源电压 |
3 | V0 | - | 液晶显示器驱动电压 |
4 | D/I(RS) | H/L | D/I=“H”,表示DB7~DB0为显示数据 |
D/I=“L”,表示DB7~DB0为显示指令数据 | |||
5 | R/W | H/L | R/W=“H”,E=“H”数据被读到DB7DB0 |
R/W=“L”,E=“H→L”数据被写到IR或DR | |||
6 | E | H/L | R/W=“L”,E信号下降沿锁存DB7~DB0 |
R/W=“H”,E=“H”DDRAM数据读到DB7~DB0 | |||
7 | DB0 | H/L | 数据线 |
8 | DB1 | H/L | 数据线 |
9 | DB2 | H/L | 数据线 |
10 | DB3 | H/L | 数据线 |
11 | DB4 | H/L | 数据线 |
12 | DB5 | H/L | 数据线 |
13 | DB6 | H/L | 数据线 |
14 | DB7 | H/L | 数据线 |
15 | CS1 | H/L | H:选择芯片(右半屏)信号 |
16 | CS2 | H/L | H:选择芯片(左半屏)信号 |
17 | RET | H/L | 复位信号,低电平复位 |
18 | VOUT | -10V | LCD驱动负电压 |
19 | LED+ | - | LED背光板电源 |
20 | LED- | - | LED背光板电源 |
表1:12864LCD的引脚说明
在使用12864LCD前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下:
①指令寄存器(IR)
IR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR。
②数据寄存器(DR)
DR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7~DB0数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。
③忙标志:BF
BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。
利用STATUS READ指令,可以将BF读到DB7总线,从检验模块之工作状态。
④显示控制触发器DFF
此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。
DDF的状态是指令DISPLAY ON/OFF和RST信号控制的。
⑤XY地址计数器
XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。
X地址计数器是没有记数功能的,只能用指令设置。
Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。
⑥显示数据RAM(DDRAM)
DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。
⑦Z地址计数器
Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。
Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
------------------------------------------------------------
3、12864LCD的指令系统及时序
该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指令表如表2所示:
指令名称 | 控制信号 | 控制代码 | ||||||||
R/W | RS | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | |
显示开关 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1/0 |
显示起始行设置 | 0 | 0 | 1 | 1 | X | X | X | X | X | X |
页设置 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | X | X | X |
列地址设置 | 0 | 0 | 0 | 1 | X | X | X | X | X | X |
读状态 | 1 | 0 | BUSY | 0 | ON/OFF | RST | 0 | 0 | 0 | 0 |
写数据 | 0 | 1 | 写数据 | |||||||
读数据 | 1 | 1 | 读数据 |
表2:12864LCD指令表
各功能指令分别介绍如下。
①显示开/关指令
R/WRS | DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 |
00 | 00111111/0 |
当DB0=1时,LCD显示RAM中的内容;DB0=0时,关闭显示。
②显示起始行(ROW)设置指令
R/WRS | DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 |
00 | 11显示起始行(0~63) |
该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。
③页(PAGE)设置指令
R/WRS | DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 |
00 | 10111页号(0~7) |
显示RAM共64行,分8页,每页8行。
④列地址(Y Address)设置指令
R/WRS | DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 |
00 | 01显示列地址(0~63) |
设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
⑤读状态指令
R/WRS | DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 |
10 | BUSY0ON/OFFREST0000 |
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
BUSY: 1-内部在工作,0-正常状态
ON/OFF:1-显示关,0-显示打开
RESET: 1-复位状态,0-正常状态
在BUSY和RESET状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。
在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。
⑥写数据指令
R/WRS | DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 |
01 | 写数据 |
⑦读数据指令
R/WRS | DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 |
11 | 读显示数据 |
读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。
------------------------------------------------------------
4、12864点阵型LCD软硬件设计实例
通过以上学习,现在就来实际应用12864LCD的软硬件设计。本实例将在LCD上显示如图3所示内容:
图3 模拟显示效果图
在调试前先将显示切换开关切换到LCD显示状态。
图4 128*64LCD实验演示图
---------------------------------
1)硬件原理图
图5 硬件原理图
---------------------------------
2)程序流程图
图6 软件流程图
---------------------------------
3)字模代码
(1)选择小四号字体(12号):宽*高=16*16(横向16点,竖向16点)。
在编写软件代码之前必须要先掌握汉字取模的方法。要得到上表中的文字,可以借助取模软件来完成。目前点阵LCD的取模软件有很多,本处使用的软件移步:https://download.csdn.net/download/liht_1634/85095577。
打开取模软件出现如下显示界面:
在文字输入区中输入文字,我们以输入一个欢迎的“欢”字为例,了解其取模过程。在文字输入区中输入“欢”后按CTRL+ENTER组合键后就看到“欢”字已经在模拟显示区显示出来了。
在“取模方式”中选择“C51格式”就可以在“点阵生成区”得到你要的汉字“欢”的显示代码。
经过以上步骤后一个汉字就取模成功了,在程序中只要调用这段代码就可显示出汉字“欢”了,其它汉字也用同样的方法。取完要显示的全部汉字代码后我们就可以编程了。
------------------
(2)选择五号字体(11号):横向取模16*14,纵向取模14*16。
横向取模:
0001 0010,0000 0000 0x12,0x00
0001 0010,0000 0000 0x12,0x00
0001 0111,1111 1000 0x17,0xF8
0010 0100,0000 1000 0x24,0x08
横向取模,字节倒序,所得点阵数据如下:
即对上面“横向取模,字节正序”的每一字节倒过来,即:
0100 1000,0000 0000 0x48,0x00
0100 1000,0000 0000 0x48,0x00
1110 1000,0001 1111 0xE8,0x1F
0010 0100,0001 0000 0x24,0x10
纵向取模:
0000 0010,0000 0100 0x02,0x04
0001 1111,0111 0000 0x1F,0xE0
1110 0001,0010 0000 0x08,0x30
0010 0111,0010 0111 0xE1,0x20
纵向取模,字节倒序,所得点阵数据如下:
即对上面“纵向取模,字节正序”的每一字节倒过来,即:
0100 0000,0010 0000
1111 1000,0000 0111
0010 0000,0000 1100
1000 0111,0000 0100
------------------------------------------------------------
5、12864点阵型LCD应用举例
1)硬件部分
(1)整体电路
一块驱动器控制64*64个点,左右显示,这就是为什么引脚有CS1和CS2的原因。
------------------
(2)原件列表
---------------------------------
2)软件部分(常用数据类型内存存储形式)
汉字在内存中的存储形式见“7、使用C-Free查看数据在内存中的存储”。
(1)程序架构
-----------------
(2)主程序
#include "includes.h"
void main()
{
lcd_init(); //初始化
lcd_clear(0); //清屏
lcd_set_line(0); //设置起始行为0
display(1,2,2*16,jiao); //交
display(1,2,3*16,liu); //流
display(2,2,4*16,shi); //使
display(2,2,5*16,yong); //用
while(1);
}
-----------------
(3)驱动程序
#include "lcd.h>"
#include "intrins.h"
#define lcd_databus P2 //LCD的8位数据总线
void lcd_r_busy()
{
P2=0x00;
RS=0;
RW=1;
EN=1;
while(P2&0x80);
EN=0;
}
void lcd_w_cmd(uchar value)
{
lcd_r_busy(); //每次读写操作前都要忙判断
RS=0;
RW=0;
lcd_databus=value;
EN=1; //下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN=0;
}
void lcd_w_data(uchar value)
{
lcd_r_busy();
RS=1;
RW=0;
lcd_databus=value;
EN=1; //下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN=0;
}
void lcd_set_page(uchar page)
{
page=0xb8 | page; //页的首地址为0xb8:page或上0xb8=选择page页
lcd_w_cmd(page);
}
void lcd_set_line(uchar sline)
{
sline=0xc0 | sline; //起始行地址为0xc0:sline或上0xc0=选择行
lcd_w_cmd(sline);
}
void lcd_set_column(uchar column)
{
column=0x3f & column; //与上列的最大值63:0x3f 可得所选列值<63
column=0x40 | column; //得列的首地址
lcd_w_cmd(column);
}
void lcd_on_off(uchar set)
{
set=0x3e | set; //=0011 111x----0x3e为关闭显示;0x3f为开启显示
lcd_w_cmd(set);
}
void lcd_cs(uchar sel)
{
switch(sel)
{
case 0:CS1=0; CS2=0; break; //全屏显示
case 1:CS1=0; CS2=1; break; //左显示
case 2:CS1=1; CS2=0; break; //右显示
default:break;
}
}
void lcd_clear(uchar sel)
{
uchar i,j;
lcd_cs(sel);
for(i=0;i<8;i++)
{
lcd_set_page(i);
lcd_set_column(0);
for(j=0;j<64;j++)
{
lcd_w_data(0x00); //每列全部写0,列地址指针自动+1
}
}
}
void lcd_init()
{
lcd_r_busy();
lcd_cs(0);
lcd_on_off(0); //关显示
lcd_cs(0);
lcd_on_off(1); //开显示
lcd_cs(0);
lcd_clear(0); //清全屏
lcd_set_line(0); //起始行设为0
}
void display(uchar cs, uchar page, uchar column, uchar *p)
{
uchar i;
lcd_cs(cs);
lcd_set_page(page); //要在本页写上半个汉字8*16
lcd_set_column(column); //选择起始列
for(i=0;i<16;i++)
{
lcd_w_data(p[i]); //按列输入上半个汉字的编码8*16
}
lcd_set_page(page+1); //要在下一页写下半个汉字8*16
lcd_set_column(column); //选择起始列
for(i=0;i<16;i++)
{
lcd_w_data(p[i+16]);
}
}
-----------------
(4)字库文件
#ifndef _ZIKU_H_
#define _ZIKU_H_
// 交
const uchar code jiao[]={
0x08,0x08,0x88,0x68,0x08,0x08,0x09,0x0E,0x08,0x08,0x88,0x28,0x48,0x88,0x08,0x00,
0x80,0x81,0x40,0x40,0x21,0x22,0x14,0x08,0x14,0x22,0x41,0x40,0x80,0x81,0x80,0x00,
};
// 流
const uchar code liu[]={
0x10,0x60,0x02,0x8C,0x00,0x44,0x64,0x54,0x4D,0x46,0x44,0x54,0x64,0xC4,0x04,0x00,
0x04,0x04,0x7E,0x01,0x80,0x40,0x3E,0x00,0x00,0xFE,0x00,0x00,0x7E,0x80,0xE0,0x00,
};
// 使
const uchar code shi[]={
0x80,0x60,0xF8,0x07,0x04,0xE4,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0xE4,0x04,0x00,
0x00,0x00,0xFF,0x00,0x80,0x81,0x45,0x29,0x11,0x2F,0x41,0x41,0x81,0x81,0x80,0x00,
};
// 用
const uchar code yong[]={
0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,
};
#endif
------------------------------------------------------------
6、实物显示效果
支持中文与英文显示,英文显示效果如下图所示。
------------------------------------------------------------------------------------------------------------------------
二、12864液晶显示任何图像
1、所需软件
1)Any to Icon软件
作用:用来把随意彩图,转化成黑白2色图。
---------------------------------
2)Windows画图软件
作用:用来编辑DIY2色图片,并可改属性改成128X64像素。
---------------------------------
3)字模提取软件
作用:把128X64像素的图片,生成编程所需要的十六进制代码。
------------------------------------------------------------
2、DIY一副图画
Win7系统画图软件,128 x 64像素,放大到最大。就像在一张白纸上画自己想画的,或修改一副2色的BMP图,然后在让它在液晶上显示。步骤如下:
1)双击打开Windows画图软件
2)点击 图像->属性,设置如下,确定
3)点击 查看-> 缩放-> 自定义
选择缩放到600%,确定。
4)点击 查看-> 缩放-> 显示网格
5)通过画图工具可在网格内自己写字和画图
6)如果已有一幅2色的BMP图,但不是128X64,用同样方法把图像用画图软件打开,放大,加上网格,再进行编辑。
编辑成自己需要的,如下:
7)保存,退出画图。
8)双击打开取字模软件软件,点击“打开图像图标”按钮。
9)点击‘参数设置’->其他选项,设置如下:
10)取模方式用C51格式,把点阵生成区的代码复制到程序中即可。若是彩图,先用Any to Icon软件转化成2色黑白图,重复以上步骤即可。
------------------------------------------------------------
3、C语言代码
#include "AT89X52.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define lcddata P0 //宏定义lcddata为P0口数据
sbit rs=P2^0; //定义数据,命令端
sbit rw=P2^1; //定义读写端
sbit e=P2^2; //定义使能端
sbit busy=P0^7;
uchar code tab[]=
{
0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x40,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x40,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0xC2,0x40,
0x00,0x00,0x00,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x01,0xC6,0x40,
0x00,0x00,0x00,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x04,0x40,
0x00,0x00,0x00,0x0F,0xFB,0x63,0x07,0x34,0x00,0x14,0x00,0x01,0x04,0x00,0x08,0xF8,
0x00,0x00,0x00,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x1F,0x40,
0x00,0x04,0x00,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x30,0x40,
0x00,0x06,0x00,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x40,
0x00,0x02,0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x40,
0x00,0x02,0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x40,
0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x42,
0x00,0x02,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x03,0xFF,0xFE,
0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x40,
0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x40,
0x00,0x02,0x20,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x40,
0x00,0x82,0x20,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x40,
0x00,0x82,0x30,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x40,
0x01,0x82,0x10,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x40,
0x01,0x02,0x10,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x40,
0x01,0x02,0x08,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x40,
0x02,0x02,0x08,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x40,
0x06,0x02,0x08,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,
0x0C,0x06,0x0C,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,
0x00,0x44,0x04,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,
0x00,0x6C,0x06,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,
0x00,0x38,0x03,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,
0x00,0x18,0x00,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x78,0x00,
0x00,0x00,0x00,0x00,0x3F,0x81,0xFF,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x48,0x00,
0x00,0x00,0x00,0x00,0xFE,0xF0,0x00,0x00,0x01,0x00,0x00,0xC0,0x1C,0x00,0x44,0x00,
0x00,0x03,0x00,0x03,0xC0,0x07,0x80,0x00,0x03,0xE2,0x07,0x00,0x1C,0x00,0x46,0x00,
0x00,0x06,0x00,0x03,0x80,0x03,0x40,0x00,0x03,0xE0,0x0C,0x00,0x0E,0x00,0x42,0x00,
0x00,0x1C,0x00,0x07,0x00,0x00,0xC0,0x00,0x00,0x20,0x18,0x00,0x07,0x00,0x42,0x00,
0x00,0xF0,0x00,0x09,0x01,0x80,0x60,0x00,0x00,0x20,0x73,0x9F,0x03,0x80,0x42,0x00,
0x00,0x10,0x00,0x1E,0x0F,0xF2,0x20,0x00,0x00,0x20,0x67,0xFF,0xC1,0xC0,0x46,0x00,
0x00,0x10,0x00,0x1E,0x1F,0xF9,0x30,0x00,0x00,0x20,0xEF,0xFF,0xE0,0xE0,0x7C,0x00,
0x03,0xFC,0x00,0x38,0x3F,0xFC,0x90,0x00,0x00,0x20,0xCB,0xFF,0xF9,0xF0,0xFF,0x00,
0x00,0x10,0x00,0x7F,0x7F,0xFE,0x10,0x00,0x00,0x20,0xDB,0xFF,0xFF,0xF0,0x41,0xC0,
0x00,0x10,0x00,0x6E,0xF9,0xBF,0x10,0x00,0x00,0x20,0xF7,0xED,0xFF,0xF0,0x40,0x60,
0x00,0x11,0x00,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0x40,0x30,
0x03,0xFF,0x00,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0xC0,0x10,
0x00,0x10,0x00,0x38,0xFC,0x3F,0x18,0x00,0x00,0x20,0x87,0xE0,0xFD,0xC0,0x80,0x08,
0x00,0x20,0x00,0x38,0xF1,0x8F,0x18,0x00,0x1F,0xE7,0x87,0x9C,0x7D,0xC0,0x80,0x08,
0x00,0x60,0x00,0x1C,0xFE,0x1F,0x81,0xFF,0xFF,0xC0,0x0F,0xE0,0xFF,0x80,0x80,0x04,
0x00,0x40,0x00,0x0C,0xFC,0x3F,0x80,0x00,0x00,0x00,0x0F,0xE1,0xF8,0x00,0x80,0x04,
0x01,0x80,0x00,0x00,0xF9,0xBF,0xE0,0x00,0x00,0x00,0x03,0xEC,0xF6,0x01,0x80,0x0C,
0x01,0xC3,0x00,0x00,0xF9,0xBF,0x00,0x00,0x00,0x00,0x00,0xFF,0xCC,0x01,0x80,0x18,
0x00,0x3F,0x80,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x81,0xF0,
0x00,0x00,0xC0,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,
0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++) //1ms基准延时程序
{
;
}
}
}
void busy_lcd(void)
{
busy=1; //把忙标志位置1
e=0; //把使能端置0
rs=0; //把rs端置0,为指令操作
rw=1; //为读操作
e=1; //拉高使能端
_nop_(); //等待
while(busy==1); //检测忙标志位
e=0; //忙标志位为0,则把使能拉低
}
void wr_i_lcd(comm)
{
busy_lcd(); //忙标志检测
rs=0; //指令操作
rw=0; //写入操作
e=1; //拉高使能端
lcddata=comm; //放上数据
_nop_(); //等待
e=0; //拉低使能端,数据写入液晶
}
void wr_d_lcd(dat)
{
busy_lcd(); //忙标志检测
rs=1; //数据操作
rw=0; //写入操作
e=1; //拉高使能端
lcddata=dat; //放上数据
_nop_(); //等待
e=0; //拉低使能端,数据写入液晶
}
void init_lcd(void)
{
wr_i_lcd(0x30); //基本指令集
delaynms(1); //等待
wr_i_lcd(0x30); //再设置一次为基本指令集,因为ST7920中有2个寄存器用来设置使用哪个指令集
delaynms(1); //等待
wr_i_lcd(0x0c); //开显示,关游标,关游标位置
delaynms(1); //等待
wr_i_lcd(0x01); //清屏,地址指针指向00H
delaynms(20); //等待>10ms
wr_i_lcd(0x06); //光标右移,整体不移
}
void img_disp(uchar code *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_i_lcd(0x34); //扩充指令集,关绘图
wr_i_lcd(0x80+j); //先将垂直坐标(Y)写入绘图RAM地址
wr_i_lcd(0x80+i); //再将水平坐标(X)写入绘图RAM地址
wr_i_lcd(0x30); //打开基本指令集
wr_d_lcd(img[j*16+i*2]); //将D15--D8写入到RAM
wr_d_lcd(img[j*16+i*2+1]); //将D7--D0写入到RAM
}
}
for(j=32;j<64;j++) //下半屏
{
for(i=0;i<8;i++)
{
wr_i_lcd(0x34); //扩充指令集,关绘图
wr_i_lcd(0x80+j-32); //先将垂直坐标(Y)写入绘图RAM地址
wr_i_lcd(0x88+i); //再将水平坐标(X)写入绘图RAM地址
wr_i_lcd(0x30); //打开基本指令集
wr_d_lcd(img[j*16+i*2]); //将D15--D8写入到RAM
wr_d_lcd(img[j*16+i*2+1]); //将D7 --D0写入到RAM
}
}
wr_i_lcd(0x36); //打开绘图显示
}
void main(void)
{
while(1)
{
init_lcd(); //初始化
img_disp(tab); //显示图像
delaynms(1000);
}
}
觉得不错,记得点个赞哦!
------------------------------------------------------------------------------------------------------------------------
附录
1、机内码和区位码的区别
已知“计算机”三个汉字的机内码分别是:(BCC6)H 、(CBE3)H 、(BBFA)H ,写出这三个汉字对应的区位码。
机内码和区位码的对应关系:机内码在高位是1(这是为了表示和ASCII的区别),区位码的最高位是0。
比如第一个 ( BCC6)H,把B转换为2进制就是1011,把最高位的1变成0,就成了0011,所以( BCC6)H的区位码是(3CC6)H。
------------------------------------------------------------
2、液晶屏常识
1)什么是COG型LCD
LCD(液晶显示屏)会有线驱动电路来进行控制,水平方向叫门驱动(Gate Driver),垂直方向叫源驱动(Source Driver),这些集成电路(Chip)要放在哪里,就成了LCD的技术。
COG是Chip On Glass的缩写,就是驱动芯片直接绑定在玻璃上,透明的。这种LCD特点为
(1)工艺简化。直接将IC邦贴到LCD屏的导电极上,减少了焊接工艺;
(2)体积比COB(Chip On Board)大大缩小,更易于小型化、简易化和高度集成化。将PCB线路直接制作在LCD屏上,因此广泛用于需减少体积的便携式整机产品,如手机、PDA、MP3、手表、信息电话、手持式仪器仪表等,并可延伸至TFT后工序;
(3)直接将IC倒装邦贴到LCD屏上,不存在IC变形等问题。
---------------------------------
2)LCD显示模块的外部接口
LCD显示模块的外部接口一般采用并行方式,并行接口接口线的读写时序常见以下两种模式:
(1)8080模式,并行
这类模式通常有下列接口信号:Vcc(工作主电源)、Vss(公共端)、Vee(偏置负电源,常用于调整显示对比度)/RES、复位线。
DB0~DB7双向数据线。D/I数据/指令选择线(1:数据读写,0:命令读写)。/CS片选信号线(若有多片组合,可有多条片选信号线)。
/WR, MPU向LCD写入数据控制线。/RD MPU从LCD读入数据控制线。具体释义:
Vcc 工作主电源
Vss 公共端
Vee 偏置负电源,常用于调整显示对比度
/RES 复位线
DB0~DB7 双向数据线
D/I 数据/指令选择线(1:数据读写,0:命令读写)
/CS 片选信号线(如果有多片组合,可有多条片选信号线)
/WR MPU向LCD写入数据控制线
/RD MPU从LCD读入数据控制线
-----------------
(2)6800模式,并行
在这种模式下,Vcc、Vss、Vee、/RES、DB0~DB7、D/I的功能同模式1),其他信号线为:R/W,读写控制(1:MPU读, 0:MPU写)。具体释义:
E 允许信号(多片组合时,可有多条允许信号线)
R/W 读写控制(1:MPU读, 0:MPU写)
用户可以根据自己的实际情况选择合适的时序
一般选择6800时序,但是写代码的时候要注意时序;如果选择8080时序,要注意PCB的连接方式。
-----------------
(3)串行模式
------------------------------------------------------------------------------------------------------------------------