LCD12864原理与应用(源程序+原理图+proteus仿真)

合集下载

基于Proteus仿真的12864液晶的显示

基于Proteus仿真的12864液晶的显示
H/L
H:选择芯片(右半屏)信号
2CS2
H/L
H:选择芯片(左半屏)信号
17RET
H/L
复位信号,低电平复位
18V0UT
-10V
LCD驱动负电压
19LED+
-
LED背光板电源
20LED-
-
LED背光板电源
3、LCD原理简图
4、LCD主要功能介绍
1)显示数据RAM(DDRAM)
DDRAM64X8X8 bits)是存储图形显示数据的。此RA啲每一位 数据对应显示面板上一个点的显示(数据为H与不显示(数据为L)。DDRA的地址与显示位置关系对照图(见附录一)
8)丫地址计数器
丫地址计数器是一个6位循环加一计数器。它管理某一页面上的64个单元。丫地址计数器可以由MP以指令形式设置,它和页地址指针结 合唯一选通显示存储器的一个单元,丫地址计数器具有自动加一功能。
在显示存储器读/写操作后丫地址计数将自动加一。当计数器加至3FH后 循环归零再继续加一。
9)Z地址计数器
2、LCD引脚说明
管脚名称
LEVER
管脚功能描述
3VSS
0
电源地
4VDD
+5.0V
电源电压
5V0
-
液晶显示器驱动电压
6D/I(RS)
H/L
D/I=“H'表示DB7sDB0为显示数据
D/I=“,表示DB7sDB0为显示指令数据
7R/W
H/L
R/W=“H,E=“H数据被读至U DB7sDB0 R/W= “L”,E=“HRL'数据被写到IR或DR
12)复位端/RES
复位端/RES用于在LCM(液晶显示模块)上电时或需要时实现硬件 电路对LCM(液晶显示模块)的复位。该复位功能将实现:

LCD12864_proteus仿真(移动显示中文)

LCD12864_proteus仿真(移动显示中文)

D_PORT EQU P1 ;P1连接LCD的数据口EN EQU P2.0 ;P2.0为LCD的使能脚RW EQU P2.1 ;P2.1为读写选择,低为写,高为读RS EQU P2.2 ;P2.2为指令或数据选择,低为指令,高为数据CS1 EQU P2.3 ;P2.3为左半LCD选择CS2 EQU P2.4 ;P2.4为右半LCD选择ORG 0000H;*******************************************MAIN:MOV DPTR,#TAB ;送表的首地址CLR CS1 ;开左边;CLR CS2 ;开右边MOV A,#3FH ;开显示器LCALL WRZHILINGMAIN1: MOV R2,#0C0H ;设置起始行,从第0行开始,用R2作为行的变量,每幅画面每次移动一行 MAIN2: MOV A,R2 ;送行地址LCALL WRZHILING ;写行地址;########################### 一幅画面从这里开始 #################################### MOV R5,#00H ;字的偏移地址从0开始。

;-----------------------------------------------------------;为LCD的第0页(字的上半节)设置页地址与列地址及字节数,(0~7共8页)MOV A,#0B8H ;设置页地址,从第0页开始LCALL WRZHILINGMOV A,#40H ;设置列地址,从第0列开始LCALL WRZHILINGMOV R4,#48 ;字的上半部分共有48个字节(16X3=48)。

;*******************************************LOOP0: ;显示字的上半部分MOV A,R5MOVC A,@A+DPTRLCALL WRDATAINC R5DJNZ R4,LOOP0;***********************************************************;为LCD的第1页(字的下半节)设置页地址与列地址及字节数,(0~7共8页)MOV A,#0B9H ;设置/页地址,从第1页开始LCALL WRZHILINGMOV A,#40H ;设置列地址,从第0列开始LCALL WRZHILINGMOV R4,#48 ;字的下半部分共有48个字节(16X3=48)。

LCD12864原理与应用

LCD12864原理与应用

LCD12864原理与应用1、LCD12864简介:LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。

而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。

下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。

引脚功能:引脚符号状态引脚名称功能,输入芯片片选端,都是低电平有效CS1=0开左屏幕,CS1=1关左屏幕CS2=0开右屏幕,CS2=1关右屏幕RS输入数据/命令选择信号RS=1为数据操作,RS=0为写指令或读状态RW输入读写选择信号R/W=1为读选通,R/W=0为写选通E输入读写使能信号在E下降沿,数据被锁存(写)入液晶,在E高电平期间,数据被读出DB0—DB7三态数据总线数据或指令的传送通道输入复位信号,低电平时复位复位时,关闭液晶显示,使显示起始行为0,可以跟单片机的复位引脚RST相连,也可以直接接VCC,使之不起作用V0液晶显示器驱动电压-Vout-10V LCD驱动负电压与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。

这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。

此液晶有8页,一页有8行点阵点,左右各64列,共128列。

如下图所示:2、LCD12864中的几条重要指令(一)行(line)设置命令:由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。

(二)页(page)设置指令:起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。

(三)列(column)地址设置指令每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。

12864之Protues仿真

12864之Protues仿真

装上12864具体的电路还是两个电阻。

一个背光限流电阻。

一个液晶驱动电压调节电阻。

背光电阻还是任何时候在19、20脚与电源之间串上个100欧电位器接上电源。

调节电位器到合适亮度。

具体值最好是到调试完程序能够正常显示后再将阻值确定换成固定电阻。

液晶驱动电压的调整在数据线、电源线接好的前提下是在Vee(-15v)和地之间接一个电位器。

中间接V0,通过调节电位器来调节V0上的电压。

当V0上为-15V时为全暗(液晶显示为全黑)。

当V0为0V时为全亮。

调节电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。

待屏幕显示正常后,进行对比度的细调,然后测量这两边的阻值在地和V0之间、V0和Vee之间换成两个固定电阻焊上就好了。

注意在V0的电压是在一个很小的范围有效。

我的就是在-2.2——-2.5这个范围。

仔细调节V0和地之间的电阻使V0上的电压在2.3V。

更换为固定电阻后的装配图:下面说说具体的驱动:先来了解一下LCD12864的内部控制结构:见图可以看出12864屏是分为左、右两块控制的。

所有对屏幕的操作要受片选CS1、CS2来控制。

我们再来看一看对屏幕操作数据与屏幕点阵的排布关系:见下图。

从上图可以看出数据按字节在屏幕上是竖向排列的。

上方为低位,下方为高位。

因此在横向上(也就是Y)就一共是128列数据。

分为CS1和CS2两个64列来写入。

在竖方向上(也就是X)一字节数据显示8个点,竖向64个点分为8个字节,称做8页(X=0-7)。

了解这些后我们就知道要满屏显示一张图就要从y=0…127、X=0…7一共写128×8=1024个字节的数据。

同样在AT89S51中存一张图就要1024个字节的空间。

好!下面我们来了解对LCD12864进行操作的一些指令。

下面对上图的指作解释:1.显示开关控制(DISPLAY ON/OFF)D=1:开显示(DISPLAY ON) 意即显示器可以进行各种显示操作D=0:关显示(DISPLAY OFF) 意即不能对显示器进行各种显示操作2.设置显示起始行(DISPLAY START LINE)前面在Z地址计数器一节已经描述了显示起始行是由Z地址计数器控制的。

LCD128x64液晶Proteus仿真

LCD128x64液晶Proteus仿真

LCD128x64液晶Proteus仿真---AT89C52(并口) proteus 2010-04-07 20:05:40 阅读16 评论0字号:大中小/****************由龙丘科技开发板程序改写************************/ #include "AT89X52.H" //52系列单片机定义文件#include "intrins.h" //调用_nop_();延时函数用#define LCD_Data_Out P3sbit RW = P1^0;sbit RS = P1^1;sbit RST = P1^2;sbit CS = P1^3;sbit E = P1^4;#define X_WIDTH 132#define Y_WIDTH 64#define byte unsigned char //无符号字符(8位)#define uint unsigned int //无符号整数(16位)void LCD_Init(void);void LCD_CLS(void);void LCD_P6x8Str(byte x,byte y,byte ch[]);void LCD_P8x16Str(byte x,byte y,byte ch[]);void LCD_P14x16Str(byte x,byte y,byte ch[]);void LCD_Print(byte x, byte y, byte ch[]);void LCD_PutPixel(byte x,byte y);void LCD_Rectangle(byte x1,byte y1,byte x2,byte y2,byte gif); void Draw_LQLogo(void);void Draw_LibLogo(void);void Draw_BMP(byte x0,byte y0,byte x1,byte y1,byte bmp[]); void LCD_WrDat(byte date);void LCD_WrCmd(byte cmd);void LCD_Fill(byte bmp_data);void LCD_Set_Pos(byte x, byte y);//*************************建立数字库*********************code byte F6x8[][6] ={{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z};code byte F14x16_Idx[] ={"科技"};code byte F14x16[] = {0x24,0x24,0xA4,0xFE,0xA2,0x22,0x00,0x24,0x48,0x00,0xFE,0x80,0x80,0x00,0x04,0x03,0x00,0x3F,0x00,0x01,0x01,0x01,0x01,0x01,0x3F,0x00,0x00,0x00,//科2 0x10,0x10,0xFE,0x90,0x10,0x48,0xC8,0x48,0x7E,0x48,0x48,0xC8,0x08,0x00,0x12,0x21,0x1F,0x00,0x20,0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x20,0x00,//技3 };//************************延时******************************void LCD_DLY_ms(uint ms){int ii,jj;if (ms<1) ms=1;for(ii=0;ii<ms;ii++)for(jj=0;jj<2670;jj++); //busclk:16MHz--1ms}/**********************主函数*******************************/main(){LCD_Init(); //LCD初始化while(1){LCD_P6x8Str(0,3,"zjwind@163com"); //输出字符,利用ASCLL码/* LCD_P6x8Str(0,1,"1"); //输出字符,利用ASCLL码LCD_P6x8Str(0,2,"2"); //输出字符,利用ASCLL码LCD_P6x8Str(0,3,"3"); //输出字符,利用ASCLL码LCD_P6x8Str(0,4,"4"); //输出字符,利用ASCLL码LCD_P6x8Str(0,5,"5"); //输出字符,利用ASCLL码LCD_P6x8Str(0,6,"6"); //输出字符,利用ASCLL码LCD_P6x8Str(0,7,"7"); //输出字符,利用ASCLL码*/LCD_Print(0,0,"科技");}}/***************************LCD12864************************///**************************写命令**************************void LCD_WrCmd(byte cmd) //写命令{RS = 0; CS = 0; RW = 0; E = 1;P3 = cmd;_nop_();E = 0;}//**************************写数据************************** void LCD_WrDat(byte date) //--写数据{RS = 1; CS = 0; RW = 0; E = 1;P3 = date;_nop_();E = 0;}//************************清屏***************************** void LCD_Fill(byte bmp_data){byte y,x;for(y=0;y<8;y++) //分页,总共8页{LCD_WrCmd(0xb0+y); //设置页地址LCD_WrCmd(0x01); //设置column地址低地址LCD_WrCmd(0x10); //设置column地址高地址for(x=0;x<X_WIDTH;x++)LCD_WrDat(bmp_data);}}//*************************定指针坐标*********************** void LCD_Set_Pos(byte x, byte y) //定坐标,指针的位置{LCD_WrCmd(0xb0+y); //定初始页---P39LCD_WrCmd(((x&0xf0)>>4)|0x10); //坐标在column的位置MSB ---P40 LCD_WrCmd((x&0x0f)|0x01); //LSB 0X01 ---P40}//************************LCD初始化*************************void LCD_Init(void){RST = 0; //指令表---P37LCD_DLY_ms(50);RST = 1;LCD_DLY_ms(20);LCD_WrCmd(0xaf); //0xaf LCD On ---P39LCD_WrCmd(0x2f); //0x2f 设置上电控制模式---P44LCD_WrCmd(0x81); //0x81 电量设置模式(显示亮度?---P45LCD_WrCmd(0x1a); //指令数据0x0000~0x003fLCD_WrCmd(0x24); //0x24 V5内部电压调节电阻设置---P45LCD_WrCmd(0xa2); //0xa2 5V,0xa1 3V3 LCD偏压设置---P42 LCD_WrCmd(0xc0); //0xc8 正常,0xc0 倒置Com 扫描方式设置LCD_WrCmd(0xa1); //0xa0 正常,0xa1 反向Segment方向选择---P42 LCD_WrCmd(0xa4); //0xa4 全屏点亮/变暗指令---P42LCD_WrCmd(0xa6); //0xa6 正向反向显示控制指令---P42LCD_WrCmd(0xac); //0xac 关闭静态指示器---P46LCD_WrCmd(0x00); //指令数据LCD_WrCmd(0x40+32); //0x40+32 设置显示起始行对应RAM ---P39LCD_Fill(0x00); //初始清屏LCD_Set_Pos(0,0); //指针的位置}/******************************输出字符****************************/void LCD_P6x8Str(byte x,byte y,byte ch[]) //输入字符{byte c=0,i=0,j=0;while (ch[j]!='\0'){c =ch[j]-48; //F6x8[c][i]从032开始建立ASCLL码数组,要查找,需减32if(x>126){x=0;y++;}LCD_Set_Pos(x,y);for(i=0;i<6;i++)LCD_WrDat(F6x8[c][i]);x+=6;j++;}}/******************************输出汉字字符串***********************/void LCD_P14x16Str(byte x,byte y,byte ch[]){byte wm=0,ii = 0; //字节:0xffuint adder=1; //字:0xffffwhile(ch[ii] != '\0'){wm = 0;adder = 1;while(F14x16_Idx[wm] > 127) //why {if(F14x16_Idx[wm] == ch[ii]){if(F14x16_Idx[wm + 1] == ch[ii + 1]) {adder = wm * 14;break;}}wm += 2;}if(x>118){x=0;y++;}LCD_Set_Pos(x , y);if(adder != 1)// 显示汉字{LCD_Set_Pos(x , y);for(wm = 0;wm < 14;wm++){LCD_WrDat(F14x16[adder]);adder += 1;}LCD_Set_Pos(x,y + 1);for(wm = 0;wm < 14;wm++){LCD_WrDat(F14x16[adder]);adder += 1;}}else //显示空白字符{ii += 1;LCD_Set_Pos(x,y);for(wm = 0;wm < 16;wm++){LCD_WrDat(0);}LCD_Set_Pos(x,y + 1);for(wm = 0;wm < 16;wm++){LCD_WrDat(0);}}x += 14;ii += 2;}}//******************输出汉字和字符混合字符串********************** void LCD_Print(byte x, byte y, byte ch[]){byte ch2[3];byte ii=0;while(ch[ii] != '\0'){if(ch[ii] > 127) //汉字的码>127{ch2[0] = ch[ii];ch2[1] = ch[ii + 1];ch2[2] = '\0'; //汉字为两个字节LCD_P14x16Str(x , y, ch2); //显示汉字x += 14; //不太理解ii += 2;}else{ch2[0] = ch[ii];ch2[1] = '\0'; //字母占一个字节LCD_P8x16Str(x , y , ch2); //显示字母x += 8;ii+= 1;}}}。

Protues中单片机驱动12864仿真

Protues中单片机驱动12864仿真
3.其次在“其他选项”中,选择如下:
4.上面设置好之后我们就可以在文字输入区输入汉字了,以“Ctrl”+“Enter”结束:
5.然后点击“C51格式”,在点阵生成区就会出现相应的模如下,我们可以把每个汉字对应的模存放在相应的数组中:
上面为取模软件的使用方法,下面开始正式教给读者单片机驱动lcd12864液晶显示屏的方法,在这之前,需要对无字库lcd12864液晶显示屏有个基础的了解,相关引脚如下:
void LCDWriteChineseBlack (char leftright, char page, char column, char chinese[]);//12864指定页指定列显示一个汉字,以黑色背景白色文本显示
void LCDWriteNum (char leftright, char page, char column, char num[]);//12864指定屏指定页指定列显示一个数字
void LCDDelay (char t)
{
char i, j;
for (i = 0; i < t; i ++ )
for (j = 0; j < 10 ;j ++ );
}
void CheckState ( )
{
char dat;
LCDRs = 0;
LCDRw = 1;
do
{
dat = 0x00;
LCDEn = 1;
参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),
参数page用来选择在哪一页显示(0~7),
参数column用来选择在哪一列显示(0~64),
参数num[]即为待显示汉字的模。

12864液晶程序和原理图

12864液晶程序和原理图
{0xFE,0x02,0x32,0x4A,0x86,0x0C,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x00,
0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,0x01,0x01,0x7F,0x81,0x81,0x81,0xF1,0x00},/*"院",9*/
{
setpos(line,colum);//显示第i列上面8个点
write_dat(*(add+i));
setpos(line+1,colum++);//显示第i列下面8个点,然后列加1
write_dat(*(add+16+i));
delay(1000);//延时,达到汉字从左到右扫描显示的效果
}
}
{0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"工",12*/
void write_com(uchar);//写指令
void write_dat(uchar);//写数据
void setpos(uchar,uchar); //设置显示的起始位置
void main()
{
init();
for(i=0;i<6;i++)
{
if(i<3)
{
select(0);

单片机学习项目 (18) LCD12864的原理与应用

单片机学习项目 (18) LCD12864的原理与应用

单片机学习项目项目18-LCD12864的原理与应用一:电路原理图液晶12864和单片机的连接电路见图图6-2-3所示,其中12864的数据端D0~D7分别接单片机的P0口,需加上啦电阻;/WR接P24,/RD接P2.3,/CE接P2.2,/CD接P2.1,/RST接P2.0;12864的第4脚接多圈电位器,用来调节12864显示的对比度。

二:12864液晶显示器驱动程序12864的驱动程序中主要有系统配置预处理、基本操作函数和应用操作函数,基本操作函数有:向12864中写一个一字节数据,写一个一字节命令,写一个数据一个命令,写两个数据两个命令和12864基本设置函数、清屏函数以及延时函数,由于写过程中采用了延时,所以程序中省去了读状态操作;应用操作包含的函数有显示字符、显示汉字、显示图形等函数,因此12864中包含了字库和图形的文件。

基本操作类函数和应用操作类函数是12864的基本程序,保存在f12864.c文件中,所使用的字库、图形文件实例分别存放在ziku.c和tuxing.c中。

#include<reg51.h>#include<f12864.c>/*主函数*/void main(void){ucharsec,min = 30,hour = 12;F12864_init();F12864_clear();dispay_tuxing();delay(50000);delay(50000);delay(50000);delay(50000);F12864_clear();display_hanzi(2,0,0,6);display_hanzi(2,1,6,12);display_string(0,4,"----------------");display_string(2,5,"HelloWorld!");display_string(0,6,"0123456789ABCDEF");delay(50000);delay(50000);delay(50000);delay(50000);F12864_clear();while(1){display_hanzi(0,0,12,14);display_num(4,1,hour);display_num(7,1,min);display_num(10,1,sec);sec++;display_string(6,1,":");display_string(9,1,":");delay(50000);display_string(6,1,"");display_string(9,1," ");delay(50000);if(sec>= 60){sec= 0;min++;}if(min>= 60){min= 0;hour++;}if(hour>= 24)hour =0;}}(1)基本操作/*预处理*/#include<reg51.h>#include<ziku.c>#include<tuxing.c>#define uchar unsigned char#define uint unsigned intuchar num[] ="0123456789";sbit rest = P2^0; //复位信号,低电平有效sbit _cd = P2^1; //命令和数据控制口(高为命令,低为数据)sbit _ce = P2^2; //片选信号,低电平有效sbit _rd = P2^3; //读信号,低电平有效sbit _wr = P2^4; //写信号,低电平有效/*延迟函数*/void delay(uint i){while(i--);}/*写命令*/void write_commond(uchar com){_ce = 0;_cd = 1; //高电平,写指令_rd = 1;P0 = com;_wr = 0; _nop_();_wr = 1;_ce = 1;_cd = 0;}/*对写一个数据*/void write_date(uchar dat){_ce = 0;_cd = 0; //低电平,写指令_rd = 1;P0 = dat;_wr = 0;_nop_();_wr= 1;_ce = 1;_cd= 1;}/*写一个指令和一个数据*/void write_dc(uchar com,uchar dat){write_date(dat); //先写数据write_commond(com); //后写指令}/*写一个指令和两个数据*/voidwrite_ddc(uchar com,uchar dat1,uchar dat2){write_date(dat1); //先写数据write_date(dat2); //先写数据write_commond(com); //后写指令}/*LCD12864初始化函数*/voidf12864_init(void){rest = 0;delay(300);rest = 1;write_ddc(0x40,0x00,0x00); //设置文本显示区首地址0x0000write_ddc(0x41,128 / 8,0x00); //设置文本显示区宽度8点阵write_ddc(0x42,0x00,0x08); //设置图形显示区首地址0x0800write_ddc(0x43,128 / 8,0x00); //设置图形显示区宽度write_commond(0x81); //显示方式设置,文本与图形异或显示write_commond(0x9e); //显示开关设置,文本开,图形开,光标闪烁关}/*清屏函数*/void f12864_clear(void){unsigned int i;write_ddc(0x24,0x00,0x00); //置地址指针为从零开始write_commond(0xb0); //自动写for(i = 0;i <128 * 64 ;i++) write_date(0x00); //清一屏write_commond(0xb2); // 自动写结束write_ddc(0x24,0x00,0x00); //重置地址指针}(2) 应用操作/*显示一个ASCII码函数*/void write_char(uchar x,uchary,uchar Charbyte){uint adress;adress = 16 * y + x; //文本显示write_ddc(0x24,(uchar)(adress),(uchar)(adress >> 8)); //地址指针位置write_dc(0xC4,Charbyte - 32); //数据一次读写方式,查字符rom}/*显示字符串函数,8*8点阵,x:左右字符间隔,y:上下字符间隔*/void display_string(ucharx,uchar y,uchar *p){while(*p != 0){write_char(x,y,*p);x++;p++;if(x > 15 ) //自动换行 128*64 //共16行0~15{x= 0;y++;}}}/*显示1个汉字,x:左右点阵间距(8点阵倍数),y:上下点阵间距(16点阵倍数)*/void write_hanzi(ucharx,uchar y,uchar z){unsigned int address;uchar m,n = 0;address = 16 * 16 * y + x + 0x0800; //显示图形for(m = 0;m < 16;m++)//1个汉字占上下16行{write_ddc(0x24,(uchar)(address),(uchar)(address>>8));write_dc(0xc0,ziku[z][n++]);write_dc(0xc0,ziku[z][n++]);//一个汉字横向取模为两个字节address =address + 16; //换行}}/*显示多个汉字,x:左右点阵间距(8点阵倍数),y:上下点阵间距(16点阵倍数),从第i个汉字开始显示,显示j- i个*/void display_hanzi(ucharx,uchar y,uchar i,uchar j){for(i;i < j;i++){write_hanzi(x,y,i);x = x + 2;}}/*显示两位数字,每一个8*8点阵,x:左右字符间隔,y:上下字符间隔*/void display_num(ucharx,uchar y,uchar i){uint adress;adress = 16 * y + x; //文本显示,每行16字符write_ddc(0x24,(uchar)(adress),(uchar)(adress >> 8)); //地址指针位置write_dc(0xc0,num[i / 10] -32);write_dc(0xc0,num[i % 10] - 32); //写两个数字}/*显示128*64图形*/void dispay_tuxing(void){uchar i,j;uint address,x;address = 0x0800; //首地址,图形显示for(i = 0;i < 64;i++)//64行{write_ddc(0x24,(uchar)(address),(uchar)(address>>8));for(j =0;j < 16;j++)//每行16字节{write_dc(0xc0,tuxing[x]);x++;}address =address + 16;//换行}}uchar code ziku[][32] ={/*-- 文字: 好 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE,0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40,/*-- 文字: 人 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x01,0x00,0x01,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x80,0x04,0x40,0x08,0x60,0x08,0x30,0x10,0x18,0x20,0x0E,0x40,0x04,0x00,0x00, /*-- 文字: 一 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xFE, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*-- 文字: 生 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x10,0xC0,0x10,0x80,0x10,0x88,0x1F,0xFC,0x20,0x80,0x20,0x80,0x40,0x88, 0x9F,0xFC,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x84,0x7F,0xFE,0x00,0x00, /*-- 文字: 平 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x7F,0xFC,0x01,0x00,0x21,0x10,0x11,0x18,0x09,0x10,0x0D,0x20,0x09,0x40,0x01,0x00, 0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00, /*-- 文字: 安 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x02,0x00,0x01,0x00,0x3F,0xFE,0x20,0x04,0x44,0x08,0x06,0x00,0x04,0x00,0xFF,0xFE, 0x08,0x20,0x08,0x20,0x08,0x40,0x06,0x80,0x01,0x00,0x06,0xC0,0x18,0x38,0xE0,0x10, /*-- 文字: 祝 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x00,0x11,0xF8,0x11,0x08,0xFD,0x08,0x05,0x08,0x09,0x08,0x11,0x08,0x39,0xF8, 0x54,0x90,0x94,0x90,0x10,0x90,0x10,0x90,0x11,0x12,0x11,0x12,0x12,0x12,0x14,0x0E, /*-- 文字: 您 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x00,0x09,0x00,0x11,0xFE,0x12,0x04,0x34,0x40,0x32,0x50,0x52,0x48,0x94,0x44, 0x11,0x44,0x10,0x80,0x00,0x00,0x29,0x04,0x28,0x92,0x68,0x12,0x07,0xF0,0x00,0x00, /*-- 文字: 一 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xFE, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*-- 文字: 帆 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x00,0x11,0xF0,0x11,0x10,0x7D,0x10,0x55,0x10,0x55,0x10,0x55,0x90,0x55,0x50, 0x55,0x70,0x55,0x50,0x5D,0x10,0x11,0x12,0x11,0x12,0x12,0x12,0x12,0x0E,0x14,0x00, /*-- 文字: 风 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x1F,0xF8,0x10,0x08,0x10,0x48,0x14,0x68,0x12,0x48,0x11,0x48,0x10,0x88, 0x10,0x88,0x11,0x48,0x12,0x6A,0x24,0x2A,0x28,0x26,0x40,0x06,0x80,0x02,0x00,0x00, /*-- 文字: 顺 --*//*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x45,0xFE,0x54,0x20,0x54,0x40,0x55,0xFC,0x55,0x04,0x55,0x04,0x55,0x24, 0x55,0x24,0x55,0x24,0x55,0x24,0x54,0x20,0x44,0x50,0x84,0x8C,0x05,0x04,0x00,0x00, /*-- 文字: 时 --*//*-- 楷体_GB23129; 此字体下对应的点阵为:宽x高=12x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xCE,0xFF,0xAE,0xFF,0xAE,0x1F,0xA0,0xFF,0x8E,0xFF,0xA A,0xFF,0x8A,0xFF,0xAE,0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*-- 文字: 间 --*//*-- 楷体_GB23129; 此字体下对应的点阵为:宽x高=12x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/0xFF,0xFF,0xFF,0xFF,0xDE,0x7F,0xE9,0xBF,0xBF,0xBF,0xA1,0xBF,0xAD,0xBF,0xA1,0xBF, 0xAD,0xBF,0xA1,0xBF,0xBF,0xBF,0xBE,0xBF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, };。

LCD 1602,12864 编程与PROTEUS仿真

LCD 1602,12864 编程与PROTEUS仿真

第九章LCD显示本章主要介绍LCD1602,12864.9.1 LCD1602#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define port P0 //DB0~DB7数据口sbit e=P2^2;//使能sbit rw=P2^1;//读写sbit rs=P2^0;//数据/命令sbit busy=P0^7;//检测忙//延时void delay(uint n){uint i;for(;n>0;n--)for(i=200;i>0;i--);}//判断是否忙void check(){rs=0;rw=1; //读e=1;port=0x00;e=1;while(busy);e=0;}//写指令void send(uchar command){check();rs=0; //指令rw=0; //写e=0;port=command;e=1;_nop_();_nop_();e=0; //写入指令}//写数据void write(uchar dat){check();rs=1; //数据rw=0;port=dat;e=1;_nop_();_nop_();e=0;}//光标位置void pos(uint p){send(p|0x80);//第一行第一个0x80;}void init(){send(0x38); // 8位数据,双列,5*7字形delay(1);send(0x0c); //开0x08关delay(1);send(0x06);//地址增加一delay(1);send(0x01);//清屏delay(1);}void main(){int i=0,j=0;uchar num[]="abcdefghijklmnop";uchar string[]="abcdefghijklmnop";init();delay(10);pos(0);delay(1); //或者用i=0; //此步不能省。

使用Proteus模拟操作HDG12864F-1液晶屏

使用Proteus模拟操作HDG12864F-1液晶屏

使⽤Proteus模拟操作HDG12864F-1液晶屏 在Proteus中模拟了89C52操作HDG12864F-1液晶屏,原理图如下:⼀、HDG12864F-1官⽹信息 该液晶屏是Hantronix的产品,官⽹上搜索出这个型号是系列型号中的⼀种,各种型号间的区别主要是尺⼨不同、有⽆背光、背光颜⾊等等。

下⾯是官⽹中⼏个⼿册的链接:,该液晶屏的控制器使⽤的是爱普⽣SED1565系列官⽹照⽚⼆、基本操作函数 根据⼏个⼿册提供的信息,“写命令”和“写数据”函数如下:1 sbit cs = P1^7;//-cs,⽚选,低电平有效2 sbit rst = P1^6;//-rst,复位,低电平有效3 sbit a0 = P1^5;//写命令、写数据控制位。

1=Display data; 0=Control data;4 sbit wr = P1^4;//-Write serial data,写串⼝数据,低电平有效5 sbit rd = P1^3;//-Read serial data,读串⼝数据,低电平有效6 sbit scl = P1^2;//Shift clock input,时钟输⼊7 sbit si = P1^1;//Serial data input,串⼝数据输⼊8//⼿册中说了,各种操作都是ns级,不⽤各种等待命令,下⾯操作也没有写⼊等待功能9//写命令10void wrt_cmd(unsigned char command)11 {12 unsigned char i = 8;13 cs = 0;14 a0 = 0;//0=Control data,命令置015 wr = 0;16 rd = 1;17while(i--){18 scl = 0;19 si = (bit) (command & 0x80);//先写⾼位20 scl = 1;21 command <<= 1;22 }23 scl = 0;24 }25//写数据26void wrt_dt(unsigned char data_)27 {28 unsigned char i = 8;29 cs = 0;30 wr = 0;31 a0 = 1;//1=Display data,写数据置132 rd = 1;33while(i--){34 scl = 0;35 si = (bit) (data_ & 0x80);36 scl = 1;37 data_ <<= 1;38 }39 scl = 0;40 }三、显存和屏幕的对应关系 ⼿册中有描述,不太好理解,⽹上也查了不少,还是⽤⾃⼰的⽅法好理解⼀些。

基于Proteus仿真的12864液晶的显示

基于Proteus仿真的12864液晶的显示

Proteus实验报告课程题目:基于Proteus仿真的12864液晶的显示班级:XXX姓名:XXX学号:XXX完成时间:XXX目录一、概述 (3)1、1LCD简介 (3)1、2LCD引脚说明 (3)1、3LCD原理简图 (4)1、4LCD主要功能介绍 (4)1、5指令说明 (6)二、液晶显示原理 (8)2.1汉字和英文显示原理 (8)2.2图形显示 (9)三、软件仿真 (10)3.1汉字显示 (10)3.2向上滚动显示 (11)3.3PCB图 (11)四、部分实验代码 (12)五、总结 (18)一、概述1、LCD简介在Protues仿真软件中,AMPIRE12864是一种图形点阵液晶显示器。

它主要采用动态驱动原理由行驱动—控制器和列驱动器两部分组成了128(列)×64(行)的全点阵液晶显示。

软件中不提供中文字库,但可完成图形显示,也可以通过汉字取模软件显示8×4个(16×16点阵)汉字。

2、LCD引脚说明3、LCD原理简图4、LCD主要功能介绍1)显示数据RAM(DDRAM)DDRAM(64×8×8 bits)是存储图形显示数据的。

此RAM的每一位数据对应显示面板上一个点的显示(数据为H)与不显示(数据为L)。

DDRAM的地址与显示位置关系对照图(见附录一)2)I/O缓冲器(DB0~DB7)I/O缓冲器为双向三态数据缓冲器。

是LCM(液晶显示模块)内部总线与MPU总线的结合部。

其作用是将两个不同时钟下工作的系统连接起来,实现通讯。

I/O缓冲器在片选信号/CS有效状态下,I/O缓冲器开放,实现LCM(液晶显示模块)与MPU之间的数据传递。

当片选信号为无效状态时,I/O缓冲器将中断LCM(液晶显示模块)内部总线与MPU数据总线的联系,对外总线呈高阻状态,从而不影响MPU的其他数据操作功能。

3)输入寄存器输入寄存器用于接收在MPU运行速度下传送给LCM(液晶显示模块)的数据并将其锁存在输入寄存器内,其输出将在LCM(液晶显示模块)内部工作时钟的运作下将数据写入指令寄存器或显示存储器内。

结合PROTEUS仿真的12864液晶显示程序文档

结合PROTEUS仿真的12864液晶显示程序文档

在proteus上用51单片机控制12864液晶显示2008-12-20 16:23经过半天的努力,终于在PROTEUS上让液晶屏显出汉字了以下是源代码/*******************************main.h******************************/#ifndef _MAIN_H#define _MAIN_H#include <reg52.h>#define LcdDataPort P2 //数据端口#ifndef UCHAR_DEF#define UCHAR_DEFtypedef unsigned char uchar;#endifsbit Reset = P3^0; //复位sbit RS = P3^1; //指令数据选择sbit E = P3^2; //指令数据控制sbit CS1 = P3^4; //左屏幕选择,低电平有效sbit CS2 = P3^5; //右屏幕选择sbit RW = P3^3; //读写控制sbit busy = P2^7; //忙标志void SetOnOff(uchar onoff); //开关显示void SelectScreen(uchar screen);//选择屏幕void ClearScreen(uchar screen); //清屏void Show1616(uchar lin,uchar colum,uchar *address);//显示一个汉字void CheckState(); //判断状态void LcdDelay(unsigned int time); //延时void WriteData(uchar dat); //写数据void SendCommand(uchar command); //写指令void SetLine(uchar line); //置行地址void SetColum(uchar colum);//置列地址void SetStartLine(uchar startline);//置显示起始行void InitLcd(); //初始化void ResetLcd(); //复位#endif/*********************************************************************//***********************************lcd.c************************************** **/#include "main.h"void CheckState(){E = 1;RS = 0;RW = 1;LcdDataPort = 0xff;while(!busy);}void LcdDelay(unsigned int time) {while(time --);}void WriteData(uchar dat){CheckState();E = 1;RS = 1;RW = 0;LcdDataPort = dat;E = 0;}void SendCommand(uchar command) {CheckState();E = 1;RW = 0;RS = 0;LcdDataPort = command;E = 0;}void SelectScreen(uchar screen) //0-全屏,1—左屏,2-右屏{switch(screen){case 0 :CS1 = 0;LcdDelay(2);CS2 = 1;LcdDelay(2);break;case 1 :CS1 = 1;LcdDelay(2);CS2 = 0;LcdDelay(2);break;case 2 :CS1 = 0;LcdDelay(2);CS2 = 0;LcdDelay(2);break;}}void ClearScreen(uchar screen) // screen 0-全屏,1—左屏,2-右屏{uchar i,j;SelectScreen(screen);for(i = 0;i < 8;i ++){SetLine(i);SetColum(0);for(j = 0;j < 64; j ++)WriteData(0);}}void SetLine(uchar line) //line -> 0 : 7{line = line & 0x07;line = line | 0xb8; //1011 1xxxSendCommand(line);}void SetColum(uchar colum) //colum -> 0 :63{colum = colum & 0x3f;colum = colum | 0x40; //01xx xxxxSendCommand(colum);}void SetStartLine(uchar startline) //startline -> 0 : 63 {startline = startline & 0x3f;startline = startline | 0xc0; //11xxxxxxSendCommand(startline);}void SetOnOff(uchar onoff) //1-开显示 0-关{if(onoff == 1)SendCommand(0x3f); //0011 111xelseSendCommand(0x3e);}void ResetLcd(){Reset = 0;LcdDelay(2);Reset = 1;LcdDelay(2);RS0 = 0;LcdDelay(2);RS1 = 0;LcdDelay(2);SetOnOff(1);}void InitLcd(){ResetLcd();SetOnOff(0);ClearScreen(2);SetLine(0);SetColum(0);SetStartLine(0);SetOnOff(1);}void Show1616(uchar lin,uchar colum,uchar *address) {uchar i;SetLine(lin);SetColum(colum);for(i = 0;i < 16;i ++)WriteData(*(address ++));SetLine(lin + 1);SetColum(colum);for(i = 0;i < 16;i ++)WriteData(*(address ++));}/****************************************************************************** *//********************************main.c**************************************** *******/#include <reg52.h>#include "main.h"const uchar code HZ_tab[] = {0x10,0x21,0x62,0x06,0x82,0xE2,0x22,0x22,0x22,0xF2,0x22,0x02,0xFE,0x03,0x02,0x00, //河0x04,0x04,0xFE,0x01,0x00,0x0F,0x04,0x04,0x04,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00,0x04,0xE4,0x24,0x24,0x64,0xA4,0x24,0x3F,0x24,0xA4,0x64,0x24,0x24,0xF6,0x24,0x00, //南0x00,0xFF,0x00,0x09,0x09,0x09,0x09,0x7F,0x09,0x09,0x09,0x49,0x80,0x7F,0x00,0x00,0x24,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x24,0x48,0x00,0xFF,0x00,0x80,0x00,0x00, //科0x10,0x08,0x06,0x01,0xFF,0x00,0x01,0x02,0x02,0x02,0x02,0xFF,0x01,0x01,0x01,0x00,0x10,0x10,0x10,0xFF,0x10,0x10,0x88,0x88,0x88,0xFF,0x88,0x88,0x8C,0x08,0x00,0x00, //技 0x04,0x44,0x82,0x7F,0x01,0x80,0x81,0x46,0x28,0x10,0x28,0x26,0x41,0xC0,0x40,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x30,0x20,0x00, //大 0x00,0x40,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x10,0x20,0x60,0x20,0x00,0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00, //学 0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00, //电 0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00,0x80,0x80,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x80,0xC0,0x80,0x00, //子0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0xF8,0x07,0x24,0x24,0x24,0x25,0x26,0x24,0x24,0xB4,0x26,0x04,0x00, //信 0x00,0x00,0x00,0xFF,0x00,0x01,0xFD,0x45,0x45,0x45,0x45,0x45,0xFD,0x01,0x00,0x00,0x00,0x00,0x00,0xFC,0xA4,0xA6,0xA5,0xA4,0xA4,0xA4,0xA4,0xFE,0x04,0x00,0x00,0x00, //息 0x40,0x30,0x00,0x77,0x84,0x84,0x8C,0x94,0xB4,0x84,0x84,0xE7,0x00,0x10,0x60,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00, //工 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x20,0x7E,0x42,0x42,0x42,0x42,0x42,0x7F,0x02,0x00, //程 0x08,0x06,0x01,0xFF,0x00,0x43,0x41,0x49,0x49,0x49,0x7F,0x49,0x4D,0x69,0x41,0x00,0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00, //学0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0xFE,0x22,0x5A,0x96,0x0C,0x24,0x24,0x25,0x26,0x24,0x34,0xA4,0x14,0x0C,0x00, // 院 0x00,0xFF,0x04,0x08,0x87,0x81,0x41,0x31,0x0F,0x01,0x3F,0x41,0x41,0x41,0x70,0x00};void main(){uchar i,line,colum ;uchar *address ;InitLcd();while(1){colum = 16;line = 1;address = HZ_tab;SetOnOff(0); //关显示for(i = 1;i < 7;i ++){if(i < 4)SelectScreen(0);elseSelectScreen(1);Show1616(line,colum ,address);colum += 16;if(colum >63)colum = 0;address += 32; //向DDRAM中写入数据 }line = 5;colum = 0;for(i = 0;i <8; i ++){if(i < 4)SelectScreen(0);elseSelectScreen(1);Show1616(line,colum ,address);colum += 16;if(colum >63)colum = 0;address += 32;}SelectScreen(2);SetOnOff(1); // 开显示for(i = 0;i < 50;i ++) //延时LcdDelay(30000);}}/****************************************************************************** **/分享举报|1466 次阅读 | 6 个评论。

LCD12864的原理分析以及使用方法(含代码分析)

LCD12864的原理分析以及使用方法(含代码分析)

LCD12864液晶显示模块的使用与分析(函代码分析)一、LCD12864功能应用LCD12864液晶显示模块能显示中文汉字、数字、字符,能显示数字与字符的个数为64个(4行,每行16个数字或字符),能显示汉字的个数为32个(4行,每行8个汉字)。

其内置了8192个中文汉字(16*16的点阵)、128个字符(8*16点阵)、以及64*256 点阵显示RAM(GDRAM)。

图1外观尺寸图图2外观尺寸图图3 LCD12864读操作时序图4 LCD12864写操作时序二、LCD12864主要技术参数(1)工作电压:3.3V-5.5V,模块最佳电压为5V。

(2)可以在显示界面显示数字、字母和中文汉字。

(3)与外部单片机的通信方式有并行或串行两种通信方式,这里主要介绍并行通信方式。

(4)显示内容:128 列× 64 行(5)显示颜色:黄绿/蓝屏/灰屏(6)LCD 类型:STN(7)与MCU 接口:8 位或4 位并行/3 位串行(8)配置LED 背光(9)多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等三、LCD12864液晶显示的电路用法分析图5 LCD12864电路连接图图6 LCD12864电路连接图LCD12864模块主要用来显示所要的界面信息或数据,所以要求能显示汉字,字符和数字,而LCD12864满足系统要求的显示功能。

LCD12864在显示字母和数字时,是4*16的显示字符模块,即可以显示4行,每行可以显示16个字母或数字;在显示汉字时,是4*8的汉字显示模块,即可以显示4行,每行可以显示8个汉字。

下面进行介绍的是并行通信的显示方式。

按照电路原理图跟单片机最小系统进行连线,如图6所示。

LCD12864共有20个引脚,其引脚具体功能如表1所示,由表可得LCD12864引脚组成为8位数据传输端口(DB0-DB7);两个电源引脚(VCC,GND);两个电源背光引脚(BLK,BLA),控制LCD的背景亮度;一个VO引脚,外接一个上拉电阻(控制LCD12864的字符对比度,让字符更加的清晰可见);RST复位引脚,低电平有效,此处直接接高电平;第16、17位空引脚,不用管;剩下的RS,RW,EN 和PSB四个引脚则跟LCD12864的写入息息相关,通过PSB可以控制LCD12864跟单片机的通信方式,输入高电平,则LCD12864跟单片机的通信模式为并行通信,低电平则为串行通信。

LCD12864(proteus仿真)——指令详解

LCD12864(proteus仿真)——指令详解

AMPIRE 128X64 LCD显示器1. LCD接口液晶显示器件(LCD)独具的低压、微功耗特性使他在单片机系统中特得到了广泛的应用,常用的液晶显示模块分为数显液晶模块、点阵字符液晶模块和点阵图形液晶模块,其中图形液晶模块在我国应用较为广泛,因为汉字不能像西文字符那样用字符模块即可显示,要想显示汉字必须用图形模块。

本课设所选择的LCD是AMPIRE128×64的汉字图形型液晶显示模块,可显示汉字及图形,图形液晶显示显示器接口如图3-1图3-1 LCD电路图表3.1 AMPIRE128×64接口说明表管脚号管脚电平说明1 CS1 H/L 片选择信号,低电平时选择前64列2 CS2 H/L 片选择信号,低电平时选择后64列3 GND 0V 逻辑电源地4 VCC 5.0V 逻辑电源正5 V0 LCD驱动电压,应用时在Vout与GND之间加一个20K可调电阻,中心抽头接VO6 RS H/L 数据\指令选择:高电平:数据D0-D7将送入显示RAM;低电平:数据D0-D7将送入指令寄存器执行7 R/W H/L 读\写选择:高电平:读数据;低电平:写数据8 E H/L 读写使能,(上升沿使能,下降沿锁定数据。

)9 DB0 H/L 数据输入输出引脚10 DB1 H/L 数据输入输出引脚11 DB2 H/L 数据输入输出引脚12 DB3 H/L 数据输入输出引脚13 DB4 H/L 数据输入输出引脚14 DB5 H/L 数据输入输出引脚15 DB6 H/L 数据输入输出引脚16 DB7 H/L 数据输入输出引脚17 RST L 复位信号,低电平有效18 VOUT -10V LCD驱动电源2. 指令描述(1) 显示开/关设置CODE :R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0功能:设置屏幕显示开/关。

DB0=H ,开显示;DB0=L ,关显示。

不影响显示RAM(DD RAM)中的内容。

完整版Protues仿真12864液晶显示

完整版Protues仿真12864液晶显示

Protues仿真液晶显示目录1 LCD12864简介12 LCD12864显示原理62.1汉字和英文显示原理62.2图形显示72.3应用说明82.4指令描述93软件仿真123.1汉字显示123.2图形显示173.3同时显示多个汉字233.4向上滚动显示294小结381LCD12864简介ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液2晶还支持画图方式。

该类液晶支持68时序8位和4位并口以及串口。

<2)KS0108类这种控制器指令简单,不带字库。

支持68时序8位并口。

<3)T6963C类这种控制器功能强大,带西文字库。

有文本和图形两种显示方式。

有文本和图形两个图层,并且支持两个图层的叠加显示。

支持80时序8位并口。

<4)COG类常见的控制器有S6B0724和ST7565,这两个控制器指令兼容。

支持68时序8位并口,80时序8位并口和串口。

COG类液晶的特点是结构轻便,成本低。

ST7920 GND VCC V0 RS R/W E DB0-DB7 PSB RES VOUT BLA BLKKS0108 GND VCC V0 RS R/W E DB0-DB7 CS1 CS2 RES VOUT BLA BLK BLKBLA FS RES CS RS DB0-DB7 RD WR V0 VCC GND FG T6963C此触发器是用于模块屏幕显示开和关的控制。

DFF=1为开显示<DISPLAY OFF),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地址指针。

LCD12864_proteus仿真(移动显示中文)

LCD12864_proteus仿真(移动显示中文)

D_PORT EQU P1 ;P1连接LCD的数据口EN EQU P2.0 ;P2.0为LCD的使能脚RW EQU P2.1 ;P2.1为读写选择,低为写,高为读RS EQU P2.2 ;P2.2为指令或数据选择,低为指令,高为数据CS1 EQU P2.3 ;P2.3为左半LCD选择CS2 EQU P2.4 ;P2.4为右半LCD选择ORG 0000H;*******************************************MAIN:MOV DPTR,#TAB ;送表的首地址CLR CS1 ;开左边;CLR CS2 ;开右边MOV A,#3FH ;开显示器LCALL WRZHILINGMAIN1: MOV R2,#0C0H ;设置起始行,从第0行开始,用R2作为行的变量,每幅画面每次移动一行 MAIN2: MOV A,R2 ;送行地址LCALL WRZHILING ;写行地址;########################### 一幅画面从这里开始 #################################### MOV R5,#00H ;字的偏移地址从0开始。

;-----------------------------------------------------------;为LCD的第0页(字的上半节)设置页地址与列地址及字节数,(0~7共8页)MOV A,#0B8H ;设置页地址,从第0页开始LCALL WRZHILINGMOV A,#40H ;设置列地址,从第0列开始LCALL WRZHILINGMOV R4,#48 ;字的上半部分共有48个字节(16X3=48)。

;*******************************************LOOP0: ;显示字的上半部分MOV A,R5MOVC A,@A+DPTRLCALL WRDATAINC R5DJNZ R4,LOOP0;***********************************************************;为LCD的第1页(字的下半节)设置页地址与列地址及字节数,(0~7共8页)MOV A,#0B9H ;设置/页地址,从第1页开始LCALL WRZHILINGMOV A,#40H ;设置列地址,从第0列开始LCALL WRZHILINGMOV R4,#48 ;字的下半部分共有48个字节(16X3=48)。

lcd12864液晶屏原理图

lcd12864液晶屏原理图

lcd12864 液晶屏原理图液晶作为一种显示器件,以其特有的优势正广泛应用于仪器、仪表、电子设备等低功耗产品中。

以往的测控仪器的显示部分大都采用LED 式液晶显示屏进行参数设定和结果显示,其显示信息量少、形式单一、人机交互性差、操作人员要求较高。

而液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示方式无法比拟的优点,不仅可以显示数字、字符,还可以显示各种图形、曲线、及汉字,并且可实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能;人机界面更加友好,使用操作也更加灵活、方便,使其日益成为智能仪器仪表和测试设备的首选显示器件。

液晶作为一种显示器件,以其特有的优势正广泛应用于仪器、仪表、电子设备等低功耗产品中。

以往的测控仪器的显示部分大都采用LED 式液晶显示屏进行参数设定和结果显示,其显示信息量少、形式单一、人机交互性差、操作人员要求较高。

而液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示方式无法比拟的优点,不仅可以显示数字、字符,还可以显示各种图形、曲线、及汉字,并且可实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能;人机界面更加友好,使用操作也更加灵活、方便,使其日益成为智能仪器仪表和测试设备的首选显示器件。

lcd12864 带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128&TImes;64,内置8192 个16*16 点汉字,和128 个16*8 点ASCII 字符集。

利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8&TImes;4 行16&TImes;16 点阵的汉字。

也可完成图形显示。

低电压低功耗是其又一显着特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

基于Proteus仿真的12864液晶的显示

基于Proteus仿真的12864液晶的显示

Proteus实验报告课程题目:基于Proteus仿真的12864液晶的显示班级:XXX姓名:XXX学号:XXX完成时间:XXX目录一、概述 (3)1、1LCD简介 (3)1、2LCD引脚说明 (3)1、3LCD原理简图 (4)1、4LCD主要功能介绍 (4)1、5指令说明 (6)二、液晶显示原理 (8)2.1汉字和英文显示原理 (8)2.2图形显示 (9)三、软件仿真 (10)3.1汉字显示 (10)3.2向上滚动显示 (11)3.3PCB图 (11)四、部分实验代码 (12)五、总结 (18)一、概述1、LCD简介在Protues仿真软件中,AMPIRE12864是一种图形点阵液晶显示器。

它主要采用动态驱动原理由行驱动—控制器和列驱动器两部分组成了128(列)×64(行)的全点阵液晶显示。

软件中不提供中文字库,但可完成图形显示,也可以通过汉字取模软件显示8×4个(16×16点阵)汉字。

2、LCD引脚说明3、LCD原理简图4、LCD主要功能介绍1)显示数据RAM(DDRAM)DDRAM(64×8×8 bits)是存储图形显示数据的。

此RAM的每一位数据对应显示面板上一个点的显示(数据为H)与不显示(数据为L)。

DDRAM的地址与显示位置关系对照图(见附录一)2)I/O缓冲器(DB0~DB7)I/O缓冲器为双向三态数据缓冲器。

是LCM(液晶显示模块)内部总线与MPU总线的结合部。

其作用是将两个不同时钟下工作的系统连接起来,实现通讯。

I/O缓冲器在片选信号/CS有效状态下,I/O缓冲器开放,实现LCM(液晶显示模块)与MPU之间的数据传递。

当片选信号为无效状态时,I/O缓冲器将中断LCM(液晶显示模块)内部总线与MPU数据总线的联系,对外总线呈高阻状态,从而不影响MPU的其他数据操作功能。

3)输入寄存器输入寄存器用于接收在MPU运行速度下传送给LCM(液晶显示模块)的数据并将其锁存在输入寄存器内,其输出将在LCM(液晶显示模块)内部工作时钟的运作下将数据写入指令寄存器或显示存储器内。

lcd2864液晶显示原理电路图程序

lcd2864液晶显示原理电路图程序

DB0X=8∫ PAGE7DB74、设置列地址CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0L L L H 列地址(0~63)功能: DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。

5、状态检测CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0H L BF L ON/OFF RST L L L L功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。

BF=H:内部正在执行操作;BF=L:空闲状态。

RST=H:正处于复位初始化状态;RST=L:正常状态。

ON/OFF=H:表示显示关闭;ON/OFF=L:表示显示开。

6、写显示数据CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0L H D7 D6 D5 D4 D3 D2 D1 D0功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。

D7-D0位数据为1表示显示,数据为0表示不显示。

写数据到DD RAM前,要先执行“设置页地址”及“设置列地址”命令。

7、读显示数据CODE: RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0H H D7 D6 D5 D4 D3 D2 D1 D0功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。

从DD RAM读数据前要先执行“设置页地址”及“设置列地址”命令。

六、接口时序1.写操作时序时序11.读操作时序时序2时序参数表:名称符号最小值典型值最大值单位E周期时间Tcyc 1000 nsE高电平宽度Pweh 450 nsE低电平宽度Pwel 450 ns九、读写模块程序举例 ● 写指令子程序(INST ) SETB E CLR D_I CLR R_W MOV P1, A CLR E RET● 写数据子程序(DATA ) SETB E SETB D_I CLR R_W MOV P1, A CLR E RET● 写一页显示RAM 数据(假设指令子程序为INST ,数据子程序为DATA ) MOV A , #0B8HLCALL INST ;置页地址为0页 MOV A , #40HLCALL INST ;置列地址为0列 MOV R2, #40H MOV R1, #00H MOV DPTR ,#ADDR LOOP :MOV A , R1 MOVC A , @A+DPTR LCALL DATA INC R1VEE ’V0第三脚VEE 第18脚可调10K(三极管内置)DJNZ R2, LOOP带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

LCD12864原理与应用(源程序+原理图+proteus仿真)

LCD12864原理与应用(源程序+原理图+proteus仿真)

LCD12864原理与应用1、LCD12864简介:LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。

而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。

下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。

引脚功能:引脚符号状态引脚名称功能,输入芯片片选端,都是低电平有效CS1=0开左屏幕,CS1=1关左屏幕CS2=0开右屏幕,CS2=1关右屏幕RS 输入数据/命令选择信号RS=1为数据操作,RS=0为写指令或读状态RW 输入读写选择信号R/W=1为读选通,R/W=0为写选通E 输入读写使能信号在E下降沿,数据被锁存(写)入液晶,在E高电平期间,数据被读出DB0—DB7 三态数据总线数据或指令的传送通道输入复位信号,低电平时复位复位时,关闭液晶显示,使显示起始行为0,可以跟单片机的复位引脚RST相连,也可以直接接VCC,使之不起作用V0 液晶显示器驱动电压-Vout -10V LCD驱动负电压与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。

这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。

此液晶有8页,一页有8行点阵点,左右各64列,共128列。

如下图所示:2、LCD12864中的几条重要指令(一)行(line)设置命令:由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。

(二)页(page)设置指令:起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。

(三)列(column)地址设置指令每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LCD12864原理与应用1、LCD12864简介:LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。

而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。

下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。

引脚功能:引脚符号状态引脚名称功能CS1,CS2输入芯片片选端,都是低电平有效CS1=0开左屏幕,CS1=1关左屏幕CS2=0开右屏幕,CS2=1关右屏幕RS输入数据/命令选择信号RS=1为数据操作,RS=0为写指令或读状态RW输入读写选择信号R/W=1为读选通,R/W=0为写选通E输入读写使能信号在E下降沿,数据被锁存(写)入液晶,在E高电平期间,数据被读出DB0—DB7三态数据总线数据或指令的传送通道RST 输入复位信号,低电平时复位复位时,关闭液晶显示,使显示起始行为0,可以跟单片机的复位引脚RST相连,也可以直接接VCC,使之不起作用V0液晶显示器驱动电压-Vout-10V LCD驱动负电压与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。

这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。

此液晶有8页,一页有8行点阵点,左右各64列,共128列。

如下图所示:2、LCD12864中的几条重要指令(一)行(line)设置命令:由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。

(二)页(page)设置指令:起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。

(三)列(column)地址设置指令每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。

(四)读状态指令3、用LCD12864显示汉字(一)由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址/),LCD1602显示自定义字符的时候也是用它。

在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在/下载到关于字模提取原理文档)字体选择默认的“宋体,常规,小四号”,小四号为16*16大小,如下图所示:LCD12864与单片机的连接如下图所示:C程序如下:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//下面是“欢迎访问伊人憔悴百度空间”点阵数据,一个汉字有32字节数据组成unsigned char code huan[]= // 欢{0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00, 0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00 };unsigned char code ying[]= //迎{0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00, 0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00 };unsigned char code fang[]= //访{0x40,0x40,0x42,0xCC,0x00,0x08,0x08,0xF8,0x89,0x8E,0x88,0x88,0x88,0x08,0x08,0x00, 0x00,0x00,0x00,0x3F,0x90,0x48,0x30,0x0F,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00 };unsigned char code wen[]= //问{0x00,0xF8,0x01,0x02,0x00,0xE2,0x22,0x22,0x22,0xE2,0x02,0x02,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00 };unsigned char code yi[]= //伊{0x00,0x80,0x60,0xF8,0x07,0x20,0x22,0x22,0xFE,0x22,0x22,0x22,0xFE,0x20,0x20,0x00, 0x01,0x00,0x00,0xFF,0x00,0x80,0x42,0x32,0x0F,0x02,0x02,0x02,0x07,0x00,0x00,0x00 };unsigned char code ren[]= //人{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x00 };unsigned char code qiao[]= //憔{0xE0,0x00,0xFF,0x10,0x20,0x10,0xFC,0x27,0x24,0x25,0xFE,0x24,0x24,0x24,0x04,0x00, 0x01,0x00,0xFF,0x00,0x80,0x60,0x1F,0x29,0xC9,0x09,0x2F,0xC9,0x09,0x29,0xC8,0x00 };unsigned char code cui[]= //悴{0x80,0x70,0x00,0xFF,0x08,0x90,0x44,0x34,0x45,0x86,0x44,0x34,0x44,0x84,0x00,0x00, 0x00,0x00,0x00,0xFF,0x00,0x04,0x04,0x04,0x04,0xFE,0x04,0x04,0x04,0x04,0x04,0x00 };unsigned char code bai[]= //百{0x02,0x02,0xE2,0x22,0x22,0x32,0x2A,0x26,0x22,0x22,0x22,0x22,0xE2,0x02,0x02,0x00, 0x00,0x00,0xFF,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFF,0x00,0x00,0x00 };unsigned char code du[]= //度{0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00, 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00 };unsigned char code kong[]= //空{0x10,0x0C,0x44,0x24,0x14,0x04,0x05,0x06,0x04,0x04,0x14,0x24,0x44,0x14,0x0C,0x00,0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,0x00};unsigned char code jian[]= //间{0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00};sbit CS1=P2^0;//片选1,低电平有效,CS1=0开左屏幕,CS1=1关左屏幕sbit CS2=P2^1;//片选2,低电平有效,CS2=0开右屏幕,CS2=1关右屏幕sbit RS=P2^2;//数据,指令选择信号,RS=1为数据操作,RS=0为写指令或读状态(一般为读忙标志)sbit RW=P2^3;//读写选择信号,RW=1为读选通,RW=0为写选通sbit EN=P2^4;//读写使能信号void busy()//忙检测函数{P0=0X00; //这句不能少RS=0;RW=1;EN=1;while(P0&0X80);//P0&0X80结果为真则一直执行空操作,也就是说P0&0X80为0则结束循环EN=0;}void wcmd(uchar cmd){busy(); //每次写入指令或数据之前都进行忙检测RS=0;RW=0;P0=cmd;EN=1;_nop_();_nop_();//在EN下降沿写入数据和指令EN=0;}void wdata(uchar dat) //写命令和写数据只在RS=0或RS=1上不同,其余都相同{busy();RS=1;RW=0;P0=dat;EN=1;_nop_();_nop_();//在EN下降沿写入数据和指令EN=0;}void set_page(uchar page)//设置页,12864LCD共有8页,每页有8行点阵点。

{page=0xb8|page; //首页地址为0XB8wcmd(page);//page取值范围为0~7,表示第1到8页}void set_line(uchar line)//设置显示的起始行,共有0——63行,一般从0行开始显示{line=0xc0|line; //起始行地址0XC0wcmd(line);//line取值范围为0~63,表示第1到64行}void set_column(uchar column)//设置显示的列{//column=column&0x3f; //列的最大值为0X3F,即64column=0x40|column;//列的首地址为0X40,wcmd(column);//column的取值范围为0~63,共64列}void set_onoff(uchar onoff)//设置显示开关,onoff取值为0或1{onoff|=0x3e;//0X3E是关显示,0X3F是开显示wcmd(onoff);//所以若onoff为0,则表示关显示,onoff为1,则表示开显示}void select_screen(uchar screen)//选屏,screen取值范围为0,1,2{switch(screen){case 0:CS1=0;CS2=0;break; //全屏case 1:CS1=0;CS2=1;break; //左半屏case 2:CS1=1;CS2=0;break; //右半屏default:break;}}void clear_screen(uchar screen)//清屏{uchar i,j;select_screen(screen);//先选屏for(i=0;i<8;i++)//控制页数0——7,共8页{set_page(i);//设置页set_column(0); //设置列,每页都从第1列开始,共64列for(j=0;j<64;j++)//控制列数0——63,共64列wdata(0x00);//写入0,列地址指针会自动加1}}void init()//LCD初始化{busy(); //忙检测select_screen(0);//选屏,全屏set_onoff(0);//关显示select_screen(0); //选屏,全屏set_onoff(1);//开显示select_screen(0); //选屏,全屏clear_screen(0); //清屏set_line(0);//起始行:0}void show(uchar screen,uchar page,uchar column,uchar *p)//显示一个汉字,一个汉字有32字节数据{uchar i;//screen表示选择屏幕,page表示页,column表示列,*p表示汉字的数组select_screen(screen); //选屏set_page(page);//设置页,写上半页set_column(column);//设置列for(i=0;i<16;i++) //控制16列的数据输出wdata(p[i]); //汉字的上半部分set_page(page+1); //写下半页set_column(column);//控制列for(i=0;i<16;i++) //控制16列的数据输出wdata(p[i+16]);//汉字的下半部分}void main(){init(); //LCD初始化clear_screen(0); //清屏set_line(0); //显示开始行//1表示左屏显示,0表示从0页开始显示。

相关文档
最新文档