Protues中单片机驱动12864仿真

合集下载

12864指令以及PROTUES的应用

12864指令以及PROTUES的应用

表3.1 AMPIRE128×64接口说明表管脚电平说明管脚号1 CS1 H/L 片选择信号,低电平时选择前64列2 CS2 H/L 片选择信号,低电平时选择后64列3 GND 0V 逻辑电源地4 VCC 5.0V 逻辑电源正5 V0 LCD驱动电压,应用时在VEE与V0之间加一2K可调电阻6 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 L L L L H H H H H H/L 功能:设置屏幕显示开/关。

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

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

(2)设置显示起始行CODE:R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L H H行地址(0~63)功能:执行该命令后,所设置的行将显示在屏幕的第一行。

显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。

Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。

(3)设置页地址CODE:R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L H L H H H页地址(0~7)功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。

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地址计数器控制的。

基于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(液晶显示模块)内部工作时钟的运作下将数据写入指令寄存器或显示存储器内。

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)中的内容。

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)。

基于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液晶的显示

目录一、概述 (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(液晶显示模块)内部工作时钟的运作下将数据写入指令寄存器或显示存储器内。

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

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

由RAM 地址映射表可知LCD 显示屏由两片控制器控制,分别用CS1和CS2控制。每个内部带有 64X64 位(512字节)的RAM 缓冲区,对应关系如图3-2所示。
点 LCD 128*64
: 页 列 IC1 8 *64
: 页 列 IC2 8 *64
图3-2 LCD地址映射图
整个屏幕分左、右两个屏,每个半屏右8页,每页有8行,注意数据是竖行排列,如表3.2。显示1个 汉字要16*16点,全屏有128*64个点,故可显示32个中文汉字。每两页显示一行汉字,可显示4行汉字, 每行8个汉字,共32个汉字。而显示1个字符需要16*8个点(或8*8个点),可显示数据是汉字的两陪(用 8*8个点就是4倍)。
功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。
BF=H:内部正在执行操作;
BF=L:空闲状态。
RST=H:正处于复位初始化状态;
RST=L:正常状态。
ON/OFF=H:表示显示关闭;
ON/OFF=L:表示显示开。

(6)写显示数据 CODE:R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L H D7 D6 D5 D4 D3 D2 D1 D0
功能:写数据到 DDRAM,DDRAM 是存储图形显示数据的,写指令执行后 Y 地址计数器自 动加 1。D7-D0 位数据为 1 表示显示(点亮),数据为 0 表示不显示(熄灭)。写数据到 DD RAM 前, 要先执行“设置页地址”及“设置列地址”命令。
(2) 设置显示起始行
CODE:R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L HH
行地址(0~63)

使用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 }三、显存和屏幕的对应关系 ⼿册中有描述,不太好理解,⽹上也查了不少,还是⽤⾃⼰的⽅法好理解⼀些。

单片机仿真之12864(AMPIRE128_64)

单片机仿真之12864(AMPIRE128_64)

程序://作者:安徽建筑工业学院08自动化一班paladin //QQ:905408963#include <reg52.h>#include<string.h>#include<intrins.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned char#define DATA P0 //LCD12864数据线sbit RS=P2^0; // 数据\指令选择sbit RW=P2^1; // 读\写选择sbit EN=P2^2; // 读\写使能sbit cs1=P2^3; // 片选1sbit cs2=P2^4; // 片选2/********************************//* 定义中文字库*//********************************/uchar code Hzk[]={/*-- 文字: 相--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x08,0x04,0x03,0x00,0xFF,0x00,0x03,0x00,0xFF,0x42,0x42,0x42,0x42,0xFF,0x00,0x00,/*-- 文字: 信--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x04,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xF9,0x49,0x49,0x49,0x49,0x49,0xF9,0x00,0x00,/*-- 文字: 自--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xF8,0x88,0x8C,0x8A,0x89,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00,/*-- 文字: 己--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00,/*-- 文字: 詹--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x10,0xF8,0x4C,0xCB,0xAA,0x9A,0xAA,0xCA,0x8E,0x9A,0xE8,0xA8,0x88,0x00,0x00, 0x80,0x60,0x1F,0x00,0xE0,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xE0,0x00,0x00,0x00,/*-- 文字: 书--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x80,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xFA,0x84,0x9C,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x10,0x20,0x40,0x30,0x0F,0x00,0x00,/*-- 文字: 庭--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFC,0x04,0x14,0x94,0x74,0x05,0xA6,0xA4,0xE4,0x94,0x94,0x94,0x04,0x00,0x40,0x30,0x8F,0x48,0x31,0x1E,0x20,0x48,0x48,0x48,0x4F,0x48,0x48,0x48,0x48,0x00,/*-- 文字: ★--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x40,0xC0,0xC0,0xC0,0xE0,0xFC,0xFF,0xFC,0xE0,0xC0,0xC0,0xC0,0x40,0x40,0x00,0x00,0x00,0x40,0x39,0x3F,0x1F,0x1F,0x0F,0x1F,0x1F,0x3F,0x39,0x40,0x00,0x00,0x00,/*-- 文字: ☆--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0xC0,0x40,0x40,0x40,0x60,0x1C,0x03,0x1C,0x60,0x40,0x40,0x40,0xC0,0x40,0x00,0x00,0x00,0x41,0x39,0x26,0x10,0x10,0x08,0x08,0x10,0x26,0x39,0x41,0x00,0x00,0x00,/*-- 文字: *--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x40,0x40,0x80,0x80,0x00,0xFC,0x00,0x80,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x03,0x01,0x03,0x04,0x08,0x10,0x00,0x00,0x00,0x00, };/*状态检查,LCD是否忙*/void CheckState(){uchar dat;//状态信息(判断是否忙)RS=0; // 数据\指令选择,D/I(RS)=“L”,表示DB7∽DB0 为显示指令数据RW=1; //R/W=“H”,E=“H”数据被读到DB7∽DB0do{DATA=0x00;EN=1; //EN下降沿dat=DATA;EN=0;dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)}while(!(dat==0x00));}/*写命令到LCD中*/SendCommandToLCD(uchar com){CheckState();//状态检查,LCD是否忙RS=0; //向LCD发送命令。

串行方式使用12864的proteus仿真实例

串行方式使用12864的proteus仿真实例
先上仿真图
程序如下:
/*取模方式:行列式逆向阴码*/
/*参数A0=0时表示发命令A0=1时表示发送示数据*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_SI=P3^0;//clock input同步时钟输入端
LCD_write(0x04|(0x0f&column_f),0); //设定列地址低4位为0
for(j=0;j<column_sum;j++)
{
LCD_write(BMP[d_where],1);
d_where++;
}
}
}
//------------------------------------------------------------------------------
sbit LCD_SCL=P3^1;//data input/output串行数据输入、输出端
sbit LCD_A0=P3^2;//选择命令还是数据
sbit LCD_RST=P3^3;//复位
sbit LCD_CS=P3^4;//片选
uchar code BMP[]=
{0xFB,0xDB,0xBB,0x7B,0x9B,0x63,0xBF,0xCF,0xF0,0x37,0xF7,0xF7,0xD7,0xE7,0xFF,0xFF,
LCD写函数
void LCD_write(数据或者命令,A0选择)
****************************************************************/

C51PG12864fproteus仿真

C51PG12864fproteus仿真

这个别人是用A VR单片机仿的,我只会C51就把它的仿真图和程序改了下,调试了可以显示。

因为我也没有PG12864f的液晶资料,不过大家可以对着程序理解下,其实原理和1206有点类似。

仿真总图:#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit wr=P2^0;sbit rd=P2^1;sbit ce=P2^2;sbit cd=P2^3;sbit rst=P2^4;void delay(uint t);void init_12864();void write_data(uchar dat);void write_cmd1(uchar cmd);void write_cmd2(uchar dat,uchar cmd);void write_cmd3(uchar data1,uchar data2,uchar cmd); uchar read_status();void check_status();void clear_screen();void display_char(uchar x,uchar y,uchar ch);int main(){uchar i,j=0;init_12864();for(i=0;i<128;i++){display_char(i/16,i%16,'0'+i);}clear_screen();}//处在x y处显示chvoid display_char(uchar x,uchar y,uchar ch)//x 0-7 y 0-15{write_cmd3((((x*2)<<4)+y),0x00,0x24);//地址指针位置write_cmd2(ch-32,0xc0);//t6963c字符表与ASCII差32@@@@@@@@@@@@@@@@ }void delay(uint t){uint i,j;for(i=0;i<t;i++)for(j=0;j<114;j++);}void init_12864(){P2=0Xff;P1=0Xff;rst=1;delay(10);rst=0;rd=1;ce=1;cd=1;rst=1;check_status();write_cmd3(0x01,0x00,0x21);//光标指针设置check_status();write_cmd3(0x00,0x00,0x40);//文本区首地址check_status();write_cmd1(0x80);//显示方式设置,正常显示check_status();write_cmd1(0x94);//。

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)。

Protues仿真12864液晶显示

Protues仿真12864液晶显示

Protues仿真液晶显示目录1 LCD12864简介 (2)2 LCD12864显示原理 (6)2.1汉字和英文显示原理 (6)2.2图形显示 (7)2.3应用说明 (8)2.4指令描述 (9)3软件仿真 (12)3.1汉字显示 (12)3.2图形显示 (17)3.3同时显示多个汉字 (23)3.4向上滚动显示 (30)4小结 (39)1LCD12864简介(1)ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。

该类液晶支持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 BLK KS0108 GND VCC V0 RS R/W E DB0-DB7 CS1 CS2 RES VOUT BLA BLKT6963C FG GND VCC V0 WR RD DB0-DB7 RS CS RES FS BLA BLKS6B0724 GND VCC RS WR RD CS DB0-DB7 RES BLA BLK12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。

可完成图形显示,也可以显示8×4个(16×16点阵)汉字。

管脚名称LEVER 管脚功能描述VSS 0 电源地VDD +5.0V 电源电压V0 - 液晶显示器驱动电压D/I(RS) H/LD/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W=“L”,E=“H→L”数据被写到IR或DRE H/LR/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0DB0 H/L 数据线DB1 H/L 数据线DB2 H/L 数据线DB3 H/L 数据线DB4 H/L 数据线DB5 H/L 数据线DB6 H/L 数据线DB7 H/L 数据线CS1 H/L H:选择芯片(右半屏)信号CS2 H/L H:选择芯片(左半屏)信号RET H/L 复位信号,低电平复位VOUT -10V LCD驱动负电压LED+ - LED背光板电源LED- - LED背光板电源在使用12864LCD前先必须了解以下功能器件才能进行编程。

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;}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.其次在“其他选项”中,选择如下:
4.上面设置好之后我们就可以在文字输入区输入汉字了,以“Ctrl”+“Enter”结束:
5.然后点击“C51格式”,在点阵生成区就会出现相应的模如下,我们可以把每个汉字对应的模存放在相应的数组中:
上面为取模软件的使用方法,下面开始正式教给读者单片机驱动lcd12864液晶显示屏的方法,在这之前,需要对无字库lcd12864液晶显示屏有个基础的了解,相关引脚如下:
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;
LCDEn = 0;
}
void LCDInit ( )
{
LCDDelay (100);
LCDCs1 = 1;
LCDCs2 = 1;
LCDDelay (100);
write_com (LCDDispOff);
write_com (PageAdd+0);
write_com (StartLine+0);
write_com (LCDColAdd+0);
(2)假设有一个已经编写好的函数LCDWriteNumBlack (char leftright, char page, char column, char num[]),
参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),
参数page用来选择在哪一页显示(0~7),
参数column用来选择在哪一列显示(0~64),
void LCDWriteChineseBlack (char leftright, char page, char column, char chinese[]);//12864指定页指定列显示一个汉字,以黑色背景白色文本显示
void LCDWriteNum (char leftright, char page, char column, char num[]);//12864指定屏指定页指定列显示一个数字
LCDEn = 1;
LCDDelay (2);
LCDEn = 0;
}
void write_data (char LCDDispdata)
{
CheckState ( );
LCDRs = 1;
LCDRw = 0;
LCDData = LCDDispdata;
LCDDelay (2);
LCDEn = 1;
LCDDelay (2);
参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),
参数page用来选择在哪一页显示(0~7),
参数column用来选择在哪一列显示(0~64),
参数num[]即为待显示汉字的模。
这样我们要在12864的左半屏第2页和第3页的第3列至第10列的16×8区域里显示汉字“农”,可以调用函数LCDWriteChinese(‘L’, 2, 3, nong[])即可(nong[]数组为汉字“农”的模)。
for (j = 0; j < 64; j ++ )
{
write_com (LCDColAdd+j);
write_data (0x00);
}
}
}
void LCDWriteChinese (char leftright, char page, char column, char chinese[])
{
{
char i = 0, j = 0;
if (leftright == 'L')
{
LCDCs1 = 0;
LCDCs2 = 1;
}
else if (leftright == 'R')
{
LCDCs1 = 1;
LCDCs2 = 0;
}
for ( i = 0; i < 2; i ++ )
{
write_com (PageAdd + page + i);
下面附上lcd12864模块代码:
lcd12864.h文件内容:
#ifndef __LCD12864_H
#define __LCD12864_H
#include <reg51.h>
#define LCDDispOff0x3e
#define LCDDispOn0x3f
#define PageAdd0xb8//页地址
write_com (LCDColAdd + column);
for (j = 0; j < 16; j ++)
{
write_data(chinese[16*i+j]);
}
}
}
void LCDWriteChineseBlack (char leftright, char page, char column, char chinese[])
void LCDWriteNumBlack (char leftright, char page, char column, char num[]);// 12864指定屏指定页指定列显示一个数字,以黑色背景白色文本显示
#endif
lcd12864.c文件内容:
#include "lcd12864.h"
E
H/L
R/W=“L”,E信号下降沿锁存DB7∽DB0
R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0
DB0
H/L
数据线
DB1
H/L
数据线
DB2
H/L
数据线
DB3
H/L
数据线
DB4
H/L
数据线
DB5
H/L
数据线
DB6
H/L
数据线
DB7
H/L
数据线
CS1
H/L
H:选择芯片(右半屏)信号
CS2
按照上面的描述,我们就不需要在深究lcd12864液晶显示屏的内部原理以及相关指令,我们需要一个封装好的C模块文件(API),直接调用对应的函数即可。具体如下:
(1)假设有一个已经编写好的函数LCDWriteNum (char leftright, char page, char column, char num[]),
参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),
参数page用来选择在哪一页显示(0~7),
参数column用来选择在哪一列显示(0~64),
参数num[]即为待显示数字的模。
这样我们要在12864的左半屏第2页和第3页的第3列至第10列的16×8区域里显示数字5,可以调用函数LCDWriteNum (‘L’, 2, 3, num5[])即可(num5[]数组为数字5的模)。
管脚名称
LEVER
管脚功能描述
VSS
0
电源地
VDD
+5.0V
电源电压
V0
-
液晶显示器驱动电压
D/I(RS)
H/L
D/I=“H”,表示DB7∽DB0为显示数据
D/I=“L”,表示DB7∽DB0为显示指令数据
R/W
H/L
R/W=“H”,E=“H”数据被读到DB7∽DB0
R/W=“L”,E=“H→L”数据被写到IR或DR
LCDDelay (2);
LCDEn = 0;
dat = 0x80 & dat;
}
while (! (dat == 0x00));
}
void write_com (char cmdcode)
{
CheckState ( );
LCDRs = 0;
LCDRw = 0;
LCDData = cmdcode;
LCDDelay (2);
write_com (LCDColAdd + column);
for (j = 0; j < 16; j ++)
{
write_data(~chinese[16*i+j]);
}
}
}
void LCDWriteNum (char leftright, char page, char column, char num[])
write_com (LCDDispOn);
}
void LCDClear ( )
{
char k, j;
LCDCs1 = 0;
LCDCs2 = 0;
write_com (PageAdd+0);
write_com (LCDColAdd+0);
for (k = 0; k < 8; k++)
{
write_com (PageAdd+k);
static void write_data (char LCDDispdata);//写数据
/*函数声明,外部调用*/
void LCDInit ( );// 12864初始化
void LCDClear ( );// 12864清屏
void LCDWriteChinese (char leftright, char page, char column, char chinese[]);//12864指定页指定列显示一个汉字
相关文档
最新文档