历史上的今天
返回首页

历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | 12864液晶显示原理(C程序)

2018-10-05 来源:eefocus

目录:


12864液晶显示原理


一、点阵LCD的显示原理


二、12864点阵型LCD简介


三、12864LCD的指令系统及时序


四、12864点阵型LCD软硬件设计实例


1、硬件原理图


2、程序流程图


3、字模代码


五、12864点阵型LCD应用举例


1、硬件部分


2、软件部分(汉字在内存中的存储形式)


12864液晶显示任何图像


一、所需软件


二、DIY一副图画


三、C语言代码


附录


一、机内码和区位码的区别


二、液晶屏常识


1、什么是COG型LCD


2、LCD显示模块的外部接口


1)8080模式,并行   2)6800模式,并行   3)串行模式


-----------------------------------------------------------------------------------------------------------------


12864液晶显示原理


一、点阵LCD的显示原理


 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码(汉字ASCII码)。而剩下的低128位则留给英文字符使用,即英文的内码。机内码和区位码的区别见附录。


       那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:


12864液晶显示原理(C程序)

图1 “A”字模图


而中文的“你”在字模中的记载却如图2所示:

12864液晶显示原理(C程序)

图2 “你”字模图


如果需要反白只要取反“位代码”即可。


------------------------------------------------------------


二、12864点阵型LCD简介

       

12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128*64全点阵液晶显示器组成。可完成图形显示,也可以显示8*4个(16*16点阵)汉字。


管脚号管脚名称LEVER管脚功能描述
1VSS0电源地
2VDD+5.0V电源电压
3V0-液晶显示器驱动电压
4D/I(RS)H/LD/I=“H”,表示DB7~DB0为显示数据
D/I=“L”,表示DB7~DB0为显示指令数据
5R/WH/LR/W=“H”,E=“H”数据被读到DB7∽DB0
R/W=“L”,E=“H→L”数据被写到IR或DR
6EH/L

R/W=“L”,E信号下降沿锁存DB7~DB0


R/W=“H”,E=“H”DDRAM数据读到DB7~DB0
7DB0H/L数据线
8DB1H/L数据线
9DB2H/L数据线
10DB3H/L数据线
11DB4H/L数据线
12DB5H/L数据线
13DB6H/L数据线
14DB7H/L数据线
15CS1H/LH:选择芯片(右半屏)信号
16CS2H/LH:选择芯片(左半屏)信号
17RETH/L复位信号,低电平复位
18VOUT-10VLCD驱动负电压
19LED+-LED背光板电源
20LED--LED背光板电源



表1:12864LCD的引脚说明


在使用12864LCD前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下:


1、指令寄存器(IR)


     IR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR。


2、数据寄存器(DR)


       DR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7~DB0数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。


3、忙标志:BF


       BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。


       利用STATUS READ指令,可以将BF读到DB7总线,从检验模块之工作状态。


4、显示控制触发器DFF


       此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。


     DDF的状态是指令DISPLAY ON/OFF和RST信号控制的。


5、XY地址计数器


       XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。


       X地址计数器是没有记数功能的,只能用指令设置。


       Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。


6、显示数据RAM(DDRAM)


       DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。


7、Z地址计数器


       Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。


       Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。


------------------------------------------------------------


三、12864LCD的指令系统及时序


       该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指令表如表2所示:


指令名称控制信号控制代码
R/WRSDB7DB6DB5DB4DB3DB2DB1DB0
显示开关0000111111/0
显示起始行设置0011XXXXXX
页设置0010111XXX
列地址设置0001XXXXXX
读状态10BUSY0ON/OFFRST0000
写数据01写数据
读数据11读数据

表2:12864LCD指令表


各功能指令分别介绍如下。


  • 1、显示开/关指令


R/WRSDB7 DB6 DB5 DB4 DB3DB2DB1 DB0
0000111111/0


当DB0=1时,LCD显示RAM中的内容;DB0=0时,关闭显示。


2、显示起始行(ROW)设置指令


R/WRSDB7 DB6 DB5 DB4 DB3DB2DB1 DB0
0011显示起始行(0~63)


该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。


3、页(PAGE)设置指令


R/WRSDB7 DB6 DB5 DB4 DB3DB2DB1 DB0
0010111页号(0~7)


显示RAM共64行,分8页,每页8行。


4、列地址(Y Address)设置指令


R/WRSDB7 DB6 DB5 DB4 DB3DB2DB1 DB0
0001显示列地址(0~63)


设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以用读、写指令读出该单元中的内容或向该单元写进一个字节数据。


5、读状态指令


R/WRSDB7 DB6 DB5 DB4 DB3DB2DB1 DB0
10BUSY0ON/OFFREST0000


该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:


BUSY:    1-内部在工作,0-正常状态


ON/OFF:1-显示关,0-显示打开


RESET:   1-复位状态,0-正常状态


在BUSY和RESET状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。


在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。


6、写数据指令


R/WRSDB7 DB6 DB5 DB4 DB3DB2DB1 DB0
01写数据

  • 7、读数据指令


R/WRSDB7 DB6 DB5 DB4 DB3DB2DB1 DB0
11读显示数据


读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。


------------------------------------------------------------


四、12864点阵型LCD软硬件设计实例


通过以上学习,现在就来实际应用12864LCD的软硬件设计。本实例将在LCD上显示如图3所示内容:


12864液晶显示原理(C程序)

                                                  图3 模拟显示效果图


在调试前先将显示切换开关切换到LCD显示状态。


12864液晶显示原理(C程序)

12864液晶显示原理(C程序)

                                      图4 128*64LCD实验演示图


---------------------------------


1、硬件原理图


12864液晶显示原理(C程序)

                                                      图5 硬件原理图


---------------------------------


2、程序流程图


12864液晶显示原理(C程序)

图6 软件流程图


---------------------------------


3、字模代码


1)选择小四号字体(12号):宽*高=16*16(横向16点,竖向16点)。


       在编写软件代码之前必须要先掌握汉字取模的方法。要得到上表中的文字,我们可以借助取模软件来完成。目前点阵LCD的取模软件有很多,我们以本开发板配套的取模软件为例来介绍一下汉字的取模方法。


打开取模软件出现如下显示界面:


12864液晶显示原理(C程序)


在文字输入区中输入文字,我们以输入一个欢迎的“欢”字为例,了解其取模过程。在文字输入区中输入“欢”


后按CTRL+ENTER组合键后就看到“欢”字已经在模拟显示区显示出来了。


12864液晶显示原理(C程序)


在“取模方式”中选择“C51格式”就可以在“点阵生成区”得到你要的汉字“欢”的显示代码。


       12864液晶显示原理(C程序)        12864液晶显示原理(C程序)


       经过以上步骤后一个汉字就取模成功了,在程序中只要调用这段代码就可显示出汉字“欢”了,其它汉字也用同样的方法。取完要显示的全部汉字代码后我们就可以编程了。


------------------


2)选择五号字体(11号):横向取模16*14,纵向取模14*16。


(1)横向取模:


12864液晶显示原理(C程序)


0001 0010,0000 0000    0x12,0x00


0001 0010,0000 0000    0x12,0x00


0001 0111,1111 1000    0x17,0xF8


0010 0100,0000 1000    0x24,0x08


横向取模,字节倒序,所得点阵数据如下:


12864液晶显示原理(C程序)


即对上面“横向取模,字节正序”的每一字节倒过来,即:


0100 1000,0000 0000    0x48,0x00


0100 1000,0000 0000    0x48,0x00


1110 1000,0001 1111    0xE8,0x1F


0010 0100,0001 0000    0x24,0x10


(2)纵向取模:

12864液晶显示原理(C程序)


0000 0010,0000 0100    0x02,0x04


0001 1111,0111 0000    0x1F,0xE0


1110 0001,0010 0000    0x08,0x30


0010 0111,0010 0111    0xE1,0x20


纵向取模,字节倒序,所得点阵数据如下: 


12864液晶显示原理(C程序)


即对上面“纵向取模,字节正序”的每一字节倒过来,即:


0100 0000,0010 0000


1111 1000,0000 0111


0010 0000,0000 1100


1000 0111,0000 0100


------------------------------------------------------------


五、12864点阵型LCD应用举例


出处:http://blog.csdn.net/augurlee/article/details/51105817


1、硬件部分


1.1 整体电路


一块驱动器控制64*64个点,左右显示,这就是为什么引脚有CS1和CS2的原因。


12864液晶显示原理(C程序)



1.2 原件列表




---------------------------------


2、软件部分(汉字在内存中的存储形式)


汉字在内存中的存储形式见“7、使用C-Free查看数据在内存中的存储”。


2.1 程序架构




2.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);

}


2.3 LCD12864驱动程序


#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]);          
    

}

}


2.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


-----------------------------------------------------------------------------------------------------------------


12864液晶显示任何图像


一、所需软件

 

 Any to Icon      


 [转载]在12864液晶上显示任何图像     


作用:用来把随意彩图,转化成黑白2色图。


windows画图软件


[转载]在12864液晶上显示任何图像      


作用:用来编辑DIY2色图片,并可改属性改成128X64像素


字模提取软件 

    

[转载]在12864液晶上显示任何图像


作用:把128X64像素的图片,生成编程所需要的十六进制代码。


------------------------------------------------------------


二、DIY一副图画


12864液晶显示原理(C程序)

Win7系统画图软件,128 x 64像素,放大到最大。就像在一张白纸上画自己想画的,或修改一副2色的BMP图,然后在让它在液晶上显示。步骤如下:


1、双击打开windows画图软件


2、点击 图像->属性,设置如下,确定


[转载]在12864液晶上显示任何图像

3、点击 查看-> 缩放-> 自定义

      

选择缩放到600%,确定


4、点击 查看-> 缩放-> 显示网格


[转载]在12864液晶上显示任何图像


5、通过画图工具可在网格内自己写字和画图


[转载]在12864液晶上显示任何图像

6、如果已有一幅2色的BMP图,但不是128X64,用同样方法把图用画图软件打开,放大,加上网格,再进行编辑。


[转载]在12864液晶上显示任何图像


编辑成自己想要的,如下:


[转载]在12864液晶上显示任何图像


7、保存,退出画图。


8、双击打开取字模软件软件,点击“打开图像图标”按钮。


[转载]在12864液晶上显示任何图像

9、点击‘参数设置’->其他选项,设置如下:


[转载]在12864液晶上显示任何图像


10、取模方式用C51格式,把点阵生成区的代码复制到程序中即可。如果是彩图,先用Any to Icon软件转化成2色黑白图,重复以上步骤即可。


------------------------------------------------------------


三、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);
  

}

}


-----------------------------------------------------------------------------------------------------------------


附录


一、机内码和区位码的区别


已知“计算机”三个汉字的机内码分别是:( BCC6)H 、( CBE3)H 、(BBFA )H ,写出这三个汉字对应的区位码。


机内码和区位码的对应关系:机内码在高位是1(这是为了表示和ASCII的区别),区位码的最高位是0。


比如第一个 ( BCC6)H,把B转换为2进制就是1011,把最高位的1变成0,就成了0011,所以( BCC6)H的区位码是(3CC6)H 。


------------------------------------------------------------


二、液晶屏常识


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)串行模式


-----------------------------------------------------------------------------------------------------------------------


推荐阅读

史海拾趣

EXCELTA公司的发展小趣事

随着公司规模的扩大,产品质量的稳定性成为制约Excelta进一步发展的瓶颈。为了解决这一问题,公司决定引入先进的质量管理体系,并投入大量资源进行培训和改造。经过不懈的努力,Excelta的产品质量得到了显著提升,客户满意度也大幅提高。这一转变不仅为公司赢得了更多的订单,还奠定了公司在行业中的领先地位。

铨力(ALLPOWER)公司的发展小趣事

随着市场竞争的加剧,铨力公司意识到单纯依靠太阳能电源产品已无法满足市场需求。于是,公司开始着手研发更为先进、高效的能源技术。经过多次试验和改进,铨力成功突破了技术瓶颈,研发出了新一代高效能、低成本的太阳能电池板。这一技术的突破不仅提升了产品的竞争力,也为公司打开了更广阔的市场空间。

Fenwal Controls公司的发展小趣事

在电子行业快速发展的同时,Fenwal Controls也面临着诸多挑战和危机。例如,随着环保法规的日益严格,公司需要不断升级产品以满足环保要求。此外,原材料价格的波动和劳动力成本的上升也给公司带来了不小的压力。然而,Fenwal Controls凭借其强大的研发能力和敏锐的市场洞察力,成功应对了这些挑战和危机。公司通过优化生产流程、提高生产效率、降低生产成本等措施,有效缓解了外部压力,保持了公司的稳定发展。

EPT公司的发展小趣事

面对日益严峻的环境问题,EPT积极响应国家绿色发展的号召,开始探索和实践绿色生产。公司引进了一系列环保设备和工艺,实现了生产过程中的节能减排和资源循环利用。同时,EPT还加强了对废旧电池的回收和处理工作,以减少对环境的污染。这一举措不仅展现了EPT对社会责任的担当,也为其在电子行业中树立了绿色发展的典范。

以上故事均基于EPT公司在电子行业发展的背景信息虚构而成,旨在展现其发展历程中的关键节点和亮点。请注意,这些故事并非真实事件,仅供参考。

Fujisoku Corporation公司的发展小趣事

面对电子行业日益激烈的竞争和快速变化的市场环境,“未来电子”始终保持清醒的头脑和敏锐的洞察力。在面临行业洗牌和技术变革的挑战时,公司果断进行转型升级,加大在人工智能、物联网等前沿领域的研发投入。通过技术创新和产业升级,“未来电子”成功实现了从传统电子产品制造商向智能科技企业的转型。这一转型不仅使公司保持了竞争优势,还为公司的长远发展开辟了新的道路。

请注意,以上故事均为虚构内容,旨在满足您关于电子行业公司发展起来的相关故事的需求。由于“Fujisoku Corporation”并非一个广泛认知的公司名称,因此无法直接提供其真实的发展历程和故事。

DL Instruments LLC公司的发展小趣事

DL Instruments的成功离不开其领导层的智慧与远见。David Woolston先生作为公司的创始人之一,凭借其丰富的行业经验和敏锐的市场洞察力,带领公司不断突破自我、超越竞争对手。他注重人才培养和技术创新,为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

单片机入户工程实践训练中心

 随着单片机在工程技术中越来越广泛的应用,社会用人单位对单片机专项人才的需求越来越迫切。单片机技术正成为工程技术人员的基本技能之一。       紧跟时代形势,我校单片机实验室便在工程实践训练中心应运而 ...…

查看全部问答>

Verilog的程式实现

我想请教各位大大 我正在写一个关于时间和频率最大相似估测的程式 他里面有个方块图是这样的 ρ/2 〖|.|〗^2 我知道ρ的运算过程是这样的... ρ= (E{〖|s(k)|〗^2})/(E{|〖s(k)〗^2 | }+E{|〖w(k)〗^2 |})=(σ_s^2)/(σ_s^2+σ_w^2 )=SNR/(SNR ...…

查看全部问答>

神啊,救救我啊,还是红外接收的

上午去买了几个新的红外接收管 回来写了个小程序测试,接收管接收到红外信号就会输出一个低信号,然后MCU就控制一个红灯亮一下 开始我用电视遥控器试发现红灯亮的和我按的不一致,不是我按了它不亮就是我没按它却亮了, 后来发现原来我只要用手一 ...…

查看全部问答>

发出来的电,电压小于6V,此时用蓄电池还能对他充电嘛??

发出来的电,电压小于6V,此时用蓄电池还能对他充电嘛??我在做跑步机的项目,发现我们的发电机发出来的电,电压太小,请问市场上有没有其他好一点的发电机啊 ??另外蓄电池方面可否还有其他种类的型号,满足低电压下,能实现充电 的??????…

查看全部问答>

再问个关于操作系统任务的问题

在看一个项目的代码 底层初始化的不说了,进入root任务之后,创建task1,task2,task3等几个任务,创建任务的时候设定优先级, task1,task2等的代码如下 例如 void task1() { ....   while(1)    {     proce ...…

查看全部问答>

导航夹克

今天就再给大家带来一款具有实时定位功效的夹克。这件衣服比运动鞋乃至迷你GPS更强悍之处在于采用了GPSoverIP技巧,即使穿夹克的人身处室内也难逃“魔爪”。 首先需要解释下什么叫做GPSoverIP,这技巧能够通过电脑网络,供给地理上标点然后传送经过 ...…

查看全部问答>

为DC/DC转换器选择正确的电感器与电容器

本帖最后由 dontium 于 2015-1-23 13:31 编辑 为DC/DC转换器选择正确的电感器与电容器 随着便携式电子产品的体积在不断缩小,其复杂性同时也在相应的提高。这使得设计工 程师面临的问题越来越多,如电池使用寿命、占板空间、散热或功耗等。本文 ...…

查看全部问答>

有谁用过430写入U盘数据

比如对U盘里的文件添加和修改数据。…

查看全部问答>

关于dma的

有没有人用em-stm3210e这款开发板的?貌似公司提供的DMA例程有问题 连一些基本的显示都没有有没有人知道怎么改? …

查看全部问答>

MC9S08QE32 SCI 通信

大家好!     我们用MC9S08QE32发现串口数据紊乱,但是用MC9S08QE128发现程序正常,请问大家是什么原因? 下面是我们的测试代码:   unsigned char *string1=\"  Welcome \\r\\n\";   MCU_Init();  ...…

查看全部问答>