12864LCD动态显示
基于C51的LCD12864液晶动画显示
![基于C51的LCD12864液晶动画显示](https://img.taocdn.com/s3/m/a006cb59be1e650e52ea991b.png)
题目:基于C51的LCD12864液晶动画显示课程名称:单片机系统设计与Proteus仿真电子工程学院制2015年5月基于C51的液晶显示动画设计目录摘要 (4)前言 (5)1 绪论 (6)1.1 设计的研究背景 (6)1.2 设计的国内的研究现状 (6)1.3 设计的国外的研究现状 (6)1.4 设计的应用领域及发展 (6)2 单片机控制液晶显示系统设计 (7)2.1单片机控制液晶显示系统框图设计 (7)2.2 单片机控制液晶显示系统功能设计 (7)3单片机控制液晶显示系统的硬件设计 (7)3.1 Proteus画图软件介绍 (7)3.2 单片机控制液晶显示子系统的电路设计 (8)3.2.1简介AT89C5................................................... (8)3.2.2简介LCD1286............................................. (10)3.2.3简介蜂鸣器SOUNDER.............................. (11)3.3 单片机控制液晶显示子系统的电路设计 (11)3.3.1单片机最小系统..................... (11)3.3.2峰鸣器驱动系统..................... (12)3.3.3 LCD12864液晶显示系统..................... (12)3.3.4开始结束按键系统..................... (13)3.4单片机控制液晶显示系统的整体电路实现................. (13)3.5 单片机控制液晶显示系统电路的PCB设计................ (14)4 单片机控制液晶显示系统的软件设计..................... (14)4.1 单片机控制液晶显示系统开发环境介绍..................... ......... (14)4.2 单片机控制液晶显示系统程序流程图设计..................... (16)4.3单片机控制液晶显示系统程序实现..................... (17)5 单片机控制液晶显示系统的仿真实现..................... (21)5.1 单片机控制液晶显示系统的仿真实现..................... (21)5.2 单片机控制液晶显示系统的仿真数据..................... (23)5.3 数据分析................ (26)5.4 结论..................... (26)参考文献..................... (27)致谢 (28)摘要本文针对基于C51单片机的protues仿真在LCD12864在动画方面应用相对较为稀缺而当代大学生在这方面能力又为欠缺的的情况下,在单片机液晶显示系统和动画设计在车内广告、智能广告、可视电话、仪表盘、空调、洗衣机和其它低功耗电子产品中得到广泛应用。
12864LCD液晶显示原理及使用方法
![12864LCD液晶显示原理及使用方法](https://img.taocdn.com/s3/m/f5145c271fd9ad51f01dc281e53a580216fc5032.png)
12864LCD液晶显示原理及使用方法
一、液晶显示原理
1.液晶材料的性质
液晶是介于固体和液体之间的一种物质状态。
它具有流动性和定向性,通过控制电场可以改变其流动性。
液晶分子呈现出各种不同的排列方式,
包括向列排列、向行排列、扭曲排列等。
2.电场的作用
当液晶材料处于电场作用下时,液晶分子会发生定向排列。
电场的存
在导致液晶分子的定向,形成一定的直流电场效应。
通过改变电场的强度
和方向,可以改变液晶分子的排列状态。
3.光的传输
液晶分子的定向排列对入射光的传播具有影响。
根据液晶分子的不同
排列状态,可以选择性地传递或阻挡入射光。
通过控制电场的强度和方向,可以调节液晶分子的排列状态,从而改变光的传输效果。
4.显示原理
二、液晶显示的使用方法
1.连接电源
2.初始化
在液晶屏开始显示之前,需要进行初始化设置。
通过向液晶屏发送命令,配置液晶屏的各种参数,如显示模式、显示偏移量、对比度等。
3.显示图像
初始化完成后,可以通过向液晶屏发送数据以显示图像。
可以通过控制每个像素点的液晶分子排列状态,从而显示出对应的图像。
可以通过编写程序或者使用液晶屏驱动库来控制显示内容。
4.其他控制
除了显示图像外,液晶显示屏还具有其他一些控制功能。
例如,可以通过发送命令来设置光标位置、清除屏幕内容、切换显示区域等。
总结:。
液晶显示12864
![液晶显示12864](https://img.taocdn.com/s3/m/e2d78c641611cc7931b765ce050876323112748f.png)
液晶显示12864事无巨细,LCD12864上次写了1602的使用,这次来写写LCD12864。
作为绝大多数单片机学习板的液晶显示模块之一,LCD12864功能要比LCD1602要强悍许多。
仅仅是1602的两行英文字母,数字和各种符号,严格来说勉强能显示几个中文,是无法满足我们的需求的。
当需要显示一些稍微复杂的图形的时候,12864的用处就显现出来了。
下面是两个正在工作的LCD12864:跟1602一样,各种型号的LCD12864在价格,性能,效率上也都是大同小异。
据我所知,市场上全新的12864价格在50到80不等,感觉有点贵。
不过,如果你要买的话,最好了解清楚它是不是带字库的。
什么是字库呢?就是在12864里的CGROM存储器里存放有可调用显示的绝大部分的中文和各种符号。
这和我们调用GCC-AVR的各种头文件里的子函数有点类似:如果没有这个头文件,那么你只能自己去编写;同样如果12864没有字库,你也需要自己去编一个字库,只是方式上是通过图形取模软件来转换实现的。
建议对自己实力不太自信的朋友购买带字库的LCD12864。
LCD12864,即像素为128*64的显示液晶。
它的每一行横向一共有128个可显示点,每一列纵向有64个,这些“点”其实也都是一个个发光二极管。
它可以在一个16*16的点阵区域上显示一个中文;也可以在一个8*16的点阵区域显示一个非中文字符,一般称为半宽字体。
即一个中文字所占显示面积是一个非中文字符的两倍。
LCD12864其实还有个叫法叫12864图形点阵,看出关键了么?对了,点阵二字。
归根结底,它是一个点阵。
既然是点阵,那么它的工作原理就和我们以前接触的LED点阵类似。
即在要点亮的“点”上赋予正向压降即可。
理解这点,对使用12864的图形显示功能有基础作用。
关于LCD12864的引脚结构和功能,并非全部的LCD12864引脚都是一样的。
在此无法一一叙述。
我们论坛板子的LCD12864接口是20个引脚,并行数据总线的LCD12864。
lcd12864的显示原理
![lcd12864的显示原理](https://img.taocdn.com/s3/m/495270f2fc0a79563c1ec5da50e2524de518d08a.png)
lcd12864的显示原理
LCD12864是一种基于液晶技术的显示器件,具有128x64个像素点的显示区域。
它采用液晶分子在电场作用下改变排列方式从而实现显示的原理。
LCD12864由若干个液晶单元组成,每个液晶单元由两片平行的电极层之间夹着的液晶分子组成。
在电场作用下,液晶分子会改变排列方式,从而使光的传播方式发生改变。
在LCD12864的背光光源照射下,背光光束通过液晶单元后,会受到液晶分子排列的影响,进而改变光束的方向和光强度。
LCD12864的液晶分子排列方式分为两种:平行排列和垂直排列。
当平行排列的液晶分子受到电场作用时,光束可以通过液晶单元,这时显示区域会出现明亮;而当垂直排列的液晶分子受到电场作用时,光束无法通过液晶单元,这时显示区域会出现暗淡。
通过在液晶单元两侧施加不同的电压,可以控制液晶分子的排列方式。
通过在液晶单元上加上适当的驱动电压,LCD12864可以实现对每个像素点的控制,从而显示出各种图像和文字。
为了控制LCD12864的显示,需要使用专门的驱动电路和微控制器。
通过驱动电路的控制,可以向LCD12864发送相应的电压信号,从而控制液晶分子的排列方式,实现显示的效果。
总结来说,LCD12864的显示原理利用液晶分子在电场作用下
改变排列方式来实现光的传播和屏幕显示,通过驱动电路和控制器来控制电压信号,从而控制液晶分子的排列方式,实现显示区域的明暗变化,从而显示出图像和文字。
FPGA实现12864液晶的静动态显示共3页文档
![FPGA实现12864液晶的静动态显示共3页文档](https://img.taocdn.com/s3/m/63822e21f242336c1eb95ef9.png)
FPGA实现12864液晶的静动态显示1 芯片和液晶屏介绍本实验所用芯片为ALTERA公司开发的EP1C6Q240C8芯片,cyclone系列,具有240个引脚,工作时最多可同时处理10路控制信号,工作电压为1.4V~3.6V。
液晶屏为12864,显示类型 STN ,点阵格式 128 x 64 ,点尺寸 0.48 x 0.48mm 。
软件编程环境:Altera的Quartus II。
2 焊接板子,原理图如下左侧为EP1C6Q240C8芯片:共有240个引脚,相当于把4块芯片联系在一起,备选的引脚比较多。
右侧为液晶屏引脚,本液晶屏内置汉字库(通过查汉字编码库,得到代码)。
3 静态显示的设计3.1 给data_buffer赋内容constant data_buf0:data_buffer:=(x"a3",x"c6",x"a3",x"d0",//显示:fpgax"a3",x"c7",x"a3",x"c1","x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20");// x"20"代表空格constant data_buf1:data_buffer:=(x"cd",x"f5",x"cf",x"d4",//显示:王显03x"a3",x"b0",x"a3",x"b3",x"20",x"20",x"20",x"20" ,x"20",x"20",x"20",x"20");constant data_buf2与constant data_buf3所赋值均为x"20",由图片可知,后两行并未输出内容。
51单片机带字库12864液晶动态汉字显示C语言源程序
![51单片机带字库12864液晶动态汉字显示C语言源程序](https://img.taocdn.com/s3/m/6353b422482fb4daa58d4b0f.png)
51单片机带字库12864液晶动态汉字显示C语言源程序2009-10-17 19:36实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。
其实和显示汉字的程序一样,只是稍做一下修改即可。
C语言源程序如下:#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>sbit RS=P2^4;sbit WRD=P2^5;sbit E=P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT[]={"我是一个中国人啊"};void initinal(void){delay(40);PSB=1; //并口工作模式delay(1);RES=0; //复位delay(1);RES=1; //复位置高delay(10);TransferData(0x30,0);delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);}void main(void){while(1){initinal();//调用LCD字库初始化程序delay(100);lcd_mesg003(IC_DAT);}}void lcd_mesg003(unsigned char code *addr1){unsigned char i;//第一行TransferData(0x80,0);delay(100);for(i=0;i<16;i++){TransferData(*addr1,1);addr1++;delayms(50);}}void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}原理就是在显示每个汉字的时候加了一个延时程序,当然可以用定时器来实现,这样的话,不占用CPU处理时间。
FPGA实现12864液晶的静动态显示
![FPGA实现12864液晶的静动态显示](https://img.taocdn.com/s3/m/b6827a3f25c52cc58ad6be53.png)
FPGA实现12864液晶的静\动态显示作者:王显来源:《科技传播》2010年第21期摘要本文使用FPGA技术实现,通过控制液晶屏的地址,将汉字、字符或图形输入到液晶屏上,通过连续几屏显示实现动态效果。
关键词 FPGA;12864lcd;静态显示;动态显示中图分类号TP27 文献标识码A 文章编号 1674-6708(2010)30-0152-021 芯片和液晶屏介绍本实验所用芯片为ALTERA公司开发的EP1C6Q240C8芯片,cyclone系列,具有240个引脚,工作时最多可同时处理10路控制信号,工作电压为1.4V~3.6V。
液晶屏为12864,显示类型 STN ,点阵格式 128 x 64 ,点尺寸 0.48 x 0.48mm 。
软件编程环境:Altera的Quartus II。
2 焊接板子,原理图如下左侧为EP1C6Q240C8芯片:共有240个引脚,相当于把4块芯片联系在一起,备选的引脚比较多。
右侧为液晶屏引脚,本液晶屏内置汉字库(通过查汉字编码库,得到代码)。
3 静态显示的设计3.1 给data_buffer赋内容constant data_buf0:data_buffer:=(x"a3",x"c6",x"a3",x"d0",//显示:fpgax"a3",x"c7",x"a3",x"c1","x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20");// x"20"代表空格constant data_buf1:data_buffer:=(x"cd",x"f5",x"cf",x"d4",//显示:王显03x"a3",x"b0",x"a3",x"b3",x"20",x"20",x"20",x"20" ,x"20",x"20",x"20",x"20");constant data_buf2与constant data_buf3所赋值均为x"20",由图片可知,后两行并未输出内容。
12864LCD图像滚动演示
![12864LCD图像滚动演示](https://img.taocdn.com/s3/m/1e9f0b450c22590103029d23.png)
uchar tCurRow, tCurCol; //文本当前行、列存储,行高8点,列宽8点
uchar ShowModeSW; //当前显示模式
unit txthome , grhome;
//--------------------------------------------------------------------------------------------------------------- //LCD控制相关函数
{
if((LCMCW & 0xo3) ==0x03)
break;
}
Return i; //错误时返回0
}
//--------------------------------------------------------------------------------------------------------------- //状态位ST3判断(数据自动写状态)
PG12864液晶的显示控制函数,这些函数在后续案例设计中仍会用到,阅读该文件可参考本
例液晶的技术手册,读者还可以参考Protues自带的汇编版代码。
本例待显示图像的像素信息保存在数组ImageX中,全屏显示需要128*64/8=1024字节,主程序中的两个for循环分别根据LCD_HEIGHT(64)和LCD_WIDTH(16)控制LCD显示,共显示64行,每行显示16字节数据,128个像素点。
12864LCD图像滚动演示
4.14 110401402 李慧
12864LCD图像滚动演示
本例使用了基于T6963C控制芯片的像素可寻址的PG12864液晶显示屏,运行本例是液
12864图片动画程序
![12864图片动画程序](https://img.taocdn.com/s3/m/9dcb3e3267ec102de2bd899b.png)
12864液晶从图像到动画在开始之前你必须了解12864液晶的原理,我开始看原理的时候也看不懂,不要紧,我理解,但是你必须看,等你写程序的时候你还是要回头看的。
12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。
芯片的结构一定要清楚!点阵LCD的显示原理在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。
实际上是用字模来显示一个字符的。
图1 “A”字模图而中文的“你”在字模中如图2所示:图2 .“你”字模图注意:可能这里你就不明白了,我曾经到论坛上问过,为什么上半屏垂直坐标是00——1F,水平坐标水平坐标分别为0X80+(00~07)。
画个图也许你会懂得这样就清楚了,其实只有两行生产的时候把本来右边的部分折到下边就形成了128*64,两个64*64液晶屏的组合。
图片显示芯片结构分块与汉字显示不一样图象显示过程是这样的:首先设置垂直地址,再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址,然后在每个地址里写入16位数据)。
绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。
GDRAM的坐标地址与资料排列顺序如图5:分上下屏写入。
12864LCD液晶显示原理及使用方法
![12864LCD液晶显示原理及使用方法](https://img.taocdn.com/s3/m/8d847bcbd1d233d4b14e852458fb770bf78a3b05.png)
12864LCD液晶显示原理及使用方法
液晶显示原理:
液晶材料具有两个特点:有机分子结构和束缚之外的液态状态。
当电
场施加在液晶分子上时,液晶分子将会排列成有序的状态,形成有规律的
分子阵列,使得光线通过时发生偏转。
当电场消除时,液晶分子恢复到原
始的无序状态,光线通过时则无偏转。
通过控制电场的开关,可以控制液
晶分子的排列状态,从而实现显示效果。
1.接口连接:将液晶显示器与控制器或者主控板通过正确的接口连接,通常使用平行接口或者SPI接口。
2.电源连接:将电源线正确连接到液晶显示器上,通常有正负两极,
要连接正确以保证电源供应的正常。
3.控制信号输入:根据控制器或者主控板的要求,输入相应的数据和
控制信号。
如数据线、时钟线、片选线等。
4.编程:根据液晶显示器的要求,通过程序编程,设置相应的显示模式、亮度、对比度等参数。
5.数据传输:通过数据线将需要显示的信息传输到液晶显示器上,并
且根据编程的设置,显示出相应的图像或文字。
使用注意事项:
1.温度:液晶显示器对温度敏感,使用时应保持在合适的温度范围内,一般在0℃-50℃之间。
2.湿度:湿度过高或过低对液晶显示器都会有影响,要避免潮湿的环
境和液体直接接触。
3.防护:避免受到力的撞击以及接触尖锐物体,这样会导致液晶显示器损坏。
4.清洁:定期使用干净、柔软的布擦拭液晶显示器,避免使用化学物品或者刷子擦拭,以免划伤显示屏。
总结:。
无字库12864液晶屏滚动显示程序
![无字库12864液晶屏滚动显示程序](https://img.taocdn.com/s3/m/8d78b83fb52acfc789ebc9fb.png)
无字库12864液晶屏滚动显示程序[转]#include<reg52.h>#include<intrins.h>#include<absacc.h>#define Lcd_Bus P0 //MCU P0<------> LCM#define Disp_On 0x3f//开显示#define Disp_Off 0x3e//关显示#define Col_Add 0x40//列地址#define Page_Add 0xb8//页地址#define Start_Line 0xc0//起始页sbit cs1=P2^3; //Master chip enablesbit cs2=P2^4; //Slave chip enablesbit Enable=P2^2; // mode Enable singlesbit Di=P2^0; //Data or Instrument Selectsbit RW=P2^1; //Write or Readsbit Lcd_Rst=P2^5; //Lcm reset/*****************************字模,此字体下对应的点阵为:宽x高=16x16*****************************/unsigned char code Chinese_character[][32]={{0x02,0xF2,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xF2,0x02,0x0 0 ,0x00,0x7F,0x28,0x24,0x22,0x21,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F, 0x00,0x00},/*"西",0*/{0x80,0x90,0x8C,0x84,0x84,0xF4,0xA5,0x86,0x84,0x84,0x84,0x84,0x94,0x8C,0x84,0x0 0,0x80,0x80,0x80,0x40,0x47,0x28,0x28,0x10,0x28,0x24,0x43,0xC0,0x40,0x00, 0x00,0x00},/*"安",1*/{0x00,0x42,0x62,0x5A,0xC6,0x10,0x54,0x54,0x54,0xFF,0x54,0x54,0x7C,0x10,0x10,0x0 0,0x40,0x23,0x14,0x08,0x17,0x28,0x29,0x49,0x49,0x7F,0x49,0x49,0x49,0x49, 0x40,0x00},/*"建",2*/{0x10,0x48,0x47,0xCC,0x54,0x44,0x14,0xE8,0x27,0x24,0x2C,0xF4,0x04,0x04,0x04,0x0 0,0x10,0x30,0x10,0x0F,0x88,0x48,0x30,0x0F,0x01,0x06,0x00,0x3F,0x40,0x40, 0x70,0x00},/*"筑",3*/{0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x02,0xFF,0x01, 0x01,0x00},/*"科",4*/{0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x0 0,0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x12,0x21,0x60, 0x20,0x00},/*"技",5*/{0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x0 0,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0, 0x40,0x00},/*"大",6*/{0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x0 0,0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02, 0x02,0x00},/*"学",4*/{0x00,0x02,0x1C,0xE8,0x00,0x40,0x60,0x58,0x47,0x22,0x20,0x28,0x30,0xE0,0x40,0x0 0,0x02,0x02,0x7F,0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x21,0x7F,0x00, 0x00,0x00},/*"冶",0*/{0x40,0x40,0x20,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x50,0x20,0x60,0x20,0x0 0,0x40,0x40,0x42,0x42,0x4A,0x72,0x42,0x7F,0x42,0x62,0x5A,0x42,0x42,0x40, 0x40,0x00},/*"金",1*/{0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x0 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x00},/*"工",2*/{0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x0 0,0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44, 0x40,0x00},/*"程",3*/{0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x0 0,0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02, 0x02,0x00},/*"学",4*/{0xFE,0x02,0x32,0x4A,0x86,0x0C,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x0 0,0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,0x01,0x01,0x7F,0x81,0x81,0x81, 0xF1,0x00},/*"院",5*/{0x10,0x10,0xD0,0xFE,0x50,0x90,0x00,0x10,0x10,0x10,0xD0,0xFE,0x10,0x10,0x10,0x0 0,0x08,0x06,0x01,0xFF,0x00,0x01,0x10,0x08,0x04,0x43,0x80,0x7F,0x00,0x00, 0x00,0x00},/*"材",0*/{0x20,0x24,0xA8,0x70,0xFF,0x68,0xA4,0x20,0x42,0x8C,0x00,0x00,0xFF,0x00,0x00,0x00x08,0x06,0x01,0x00,0xFF,0x00,0x01,0x02,0x02,0x03,0x02,0x02,0xFF,0x01, 0x01,0x00},/*"料",1*/{0x00,0x08,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0xF8,0x08,0x08,0x08,0xF8,0x0 0,0x00,0x40,0x20,0x18,0x07,0x00,0x20,0x40,0x3F,0x00,0x7F,0x10,0x10,0x10,0x3F, 0x00,0x00},/*"加",2*/{0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x0 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x00},/*"工",4*/{0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x0 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x00},/*"工",4*/{0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x0 0,0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44, 0x40,0x00},/*"程",5*/};unsigned char code E[][16]={{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x0 0},/*"C",0*/{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x0 0},/*"r",1*/{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x2 0},/*"a",2*/{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x0 0},/*"s",3*/{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x0 0},/*"y",4*/{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x0 0},/*"b",5*/{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x0 0},/*"o",6*/{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x0 0},/*"y",7*/{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x0 0},/*"e",8*/};/***********************延时子程序***********************/void delay(unsigned int k){unsigned int i;unsigned int j;for(i=0;i<k;i++)for(j=0;j<20;j++);}/***********************写命令左***********************/ void write_cmd_1(unsigned char command){cs1=1;cs2=0;Di=0;RW=0;Lcd_Bus=command; //P0口delay(0);Enable=1;delay(0);Enable=0;}/***********************写命令右***********************/ void write_cmd_2(unsigned char command){cs1=0;cs2=1;Di=0;RW=0;Lcd_Bus=command;delay(0);Enable=1;delay(0);Enable=0;}/***********************写数据左***********************/ void write_data_1(unsigned char dis_data){cs1=1;cs2=0;Di=1;RW=0;Lcd_Bus=dis_data;delay(0);Enable=1;delay(0);Enable=0;}/***********************写数据右***********************/ void write_data_2(unsigned char dis_data){cs1=0;cs2=1;Di=1;RW=0;Lcd_Bus=dis_data;delay(0);Enable=1;delay(0);Enable=0;}/***********************清内存左***********************/void clear_1(void){unsigned char j,k;cs1=1;cs2=0;write_cmd_1(Page_Add+0);write_cmd_1(Col_Add+0);for(k=0;k<8;k++){write_cmd_1(Page_Add+k);for(j=0;j<64;j++)write_data_1(0x00);}}/***********************清内存右***********************/void clear_2(void){unsigned char j,k;cs1=0;cs2=1;write_cmd_2(Page_Add+0);write_cmd_2(Col_Add+0);for(k=0;k<8;k++){write_cmd_2(Page_Add+k);for(j=0;j<64;j++)write_data_2(0x00);}}/***********************显示汉字16*16左************************/void Chinese_disp_1(unsigned char pag,unsigned char col,unsigned char n) {unsigned char i=0;unsigned char j=0;cs1=1;cs2=0;for(i=0;i<2;i++){write_cmd_1(Page_Add+pag+i);write_cmd_1(Col_Add+col);for(j=0;j<16;j++)write_data_1(Chinese_character[n][16*i+j]);}}/***********************显示汉字16*16右***********************/void Chinese_disp_2(unsigned char pag,unsigned char col,unsigned char n) {unsigned char i=0;unsigned char j=0;cs1=0;cs2=1;for(i=0;i<2;i++){write_cmd_2(Page_Add+pag+i);write_cmd_2(Col_Add+col);for(j=0;j<16;j++)write_data_2(Chinese_character[n][16*i+j]);}}/***********************显示英文16*8左************************/void E_disp_1(unsigned char pag,unsigned char col,unsigned char n){unsigned char i=0;unsigned char j=0;cs1=1;cs2=0;for(i=0;i<2;i++){write_cmd_1(Page_Add+pag+i);write_cmd_1(Col_Add+col);for(j=0;j<8;j++)write_data_1(E[n][8*i+j]);}}/***********************显示英文16*8右***********************/void E_disp_2(unsigned char pag,unsigned char col,unsigned char n){unsigned char i=0;unsigned char j=0;cs1=0;cs2=1;for(i=0;i<2;i++){write_cmd_2(Page_Add+pag+i);write_cmd_2(Col_Add+col);for(j=0;j<8;j++)write_data_2(E[n][8*i+j]);}}/***********************液晶屏初始化***********************/ void init_lcd(){Lcd_Rst=0;delay(100);Lcd_Rst=1;delay(100);write_cmd_1(Disp_Off); write_cmd_2(Disp_Off);write_cmd_1(Page_Add+0); write_cmd_2(Page_Add+0);write_cmd_1(Start_Line+0); write_cmd_2(Start_Line+0);write_cmd_1(Col_Add+0); write_cmd_2(Col_Add+0);write_cmd_1(Disp_On); write_cmd_2(Disp_On);}/***********************LCD显示子程序***********************/ void display(void){unsigned char i;for(i=Start_Line;i<0xff;i++){Chinese_disp_1(0,0, 0);Chinese_disp_1(0,16,1);Chinese_disp_1(0,32,2);Chinese_disp_1(0,48,3);Chinese_disp_2(0,0, 4);Chinese_disp_2(0,16,5);Chinese_disp_2(0,32,6);Chinese_disp_2(0,48,7);//西安建筑科技大学Chinese_disp_1(2,16,8);Chinese_disp_1(2,32,9);Chinese_disp_1(2,48,10);Chinese_disp_2(2,0,11);Chinese_disp_2(2,16,12);Chinese_disp_2(2,32,13);//冶金工程学院Chinese_disp_1(4,16,14);Chinese_disp_1(4,32,15);Chinese_disp_1(4,48,16);Chinese_disp_2(4,0,17);Chinese_disp_2(4,16,18);Chinese_disp_2(4,32,19);//材料加工工程E_disp_1(6,24,0);E_disp_1(6,32,1);E_disp_1(6,40,2);E_disp_1(6,48,3);E_disp_1(6,56,4);E_disp_2(6,0,5);E_disp_2(6,8,6);E_disp_2(6,16,7);E_disp_2(6,24,8);//Crasyboyewrite_cmd_1(i);write_cmd_2(i);delay(3000);//调整滚动速度}//delay(60000);}/***********主程序************/ void main(void){ init_lcd();clear_1();clear_2();while(1){display();}}。
学习笔记:LCD12864的卷动显示
![学习笔记:LCD12864的卷动显示](https://img.taocdn.com/s3/m/481e2e0d6bd97f192279e92b.png)
学习笔记:LCD12864的屏幕卷动显示首先,先来介绍下与卷动显示相关的存储器:DDRAM(Data Display Ram)。
DDRAM(Data Display Ram):数据显示RAM,往里面写啥,屏幕就会显示啥,与GDRAM不同的是,这里存储的是字符的编码。
也就是显示字符用的RAM。
字符的显示是先到CGROM (存储了中文字库)或HCGROM(存储了ASCII码)找到对应编码的字模,再显示到屏幕上。
笔者使用的这块12864内部有4行×32字节的DDRAM空间。
但是任一时刻,屏幕只能显示2行×32字节的空间,那么剩余的这些空间呢?它们可以用于缓存,在实现卷屏显示时这些空间就派上用场了。
DDRAM结构如下所示:80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH 90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH 地址与屏幕显示对应关系如下:第一行:80H、81H、82H、83H、84H、85H、86H、87H第二行:90H、91H、92H、93H、94H、95H、96H、97H第三行:88H、89H、8AH、8BH、8CH、8DH、8EH、8FH第四行:98H、99H、9AH、9BH、9CH、9DH、9EH、9FH说明:红色部分的数据归上半屏显示,黑色部分的数据归下半屏显示。
一般屏幕的显示用的是上面两行的空间,也就是80H~8FH,90H~9FH,也就是说屏幕显示的内容是存储在80H~8FH,90H~9FH。
12864显示原理
![12864显示原理](https://img.taocdn.com/s3/m/046bb8bcbb0d4a7302768e9951e79b8968026881.png)
12864显示原理12864显示原理是指12864液晶显示屏的工作原理和特点。
在深入了解12864显示原理之前,我们首先要了解液晶显示屏的基本结构和工作原理。
液晶显示屏是一种利用液晶材料的光学特性来显示图像的平面显示器件。
它由玻璃基板、液晶材料、驱动电路和偏光片等组成。
其中,12864显示屏是指屏幕分辨率为128×64的液晶显示屏。
它广泛应用于电子仪器、仪表、通讯设备、汽车电子等领域。
12864显示原理的核心是液晶材料的电光效应。
液晶材料具有两个特性,扭曲结构和双折射。
当施加电场时,液晶分子会发生扭曲,改变光的传播路径,从而实现像素点的亮暗变化。
通过合理的驱动电路,可以控制每个像素点的亮度,从而显示出所需的图像。
在12864显示原理中,驱动电路起着至关重要的作用。
它主要由控制器、驱动芯片和接口电路组成。
控制器负责接收外部信号并生成显示数据,驱动芯片则负责将显示数据转化为对液晶的驱动信号,接口电路则负责与外部系统进行通信。
通过这些部件的协同工作,才能实现12864显示屏的正常工作。
除了驱动电路,偏光片也是12864显示原理中不可或缺的部分。
偏光片可以过滤出特定方向的光线,使得液晶显示出清晰的图像。
在实际应用中,偏光片的选择和安装位置对显示效果有着重要的影响。
总的来说,12864显示原理是液晶显示技术的一个重要分支,它通过液晶材料的电光效应和驱动电路的协同作用,实现了图像的高质量显示。
在实际应用中,我们需要根据具体的场景和要求,选择合适的液晶显示方案,并合理设计驱动电路和偏光片,以实现最佳的显示效果。
通过对12864显示原理的深入了解,我们可以更好地应用液晶显示技术,提高产品的竞争力,为用户带来更好的视觉体验。
同时,也可以为液晶显示技术的进一步发展提供有益的参考和借鉴。
希望本文对您理解12864显示原理有所帮助,谢谢阅读!。
基于C51的LCD12864液晶动画显示
![基于C51的LCD12864液晶动画显示](https://img.taocdn.com/s3/m/88ab566e4431b90d6d85c734.png)
成绩课程论文题目:基于C51的LCD12864液晶动画显示课程名称:Proteus学生姓名:王文奇学生学号:1114210132系别:电气信息工程学院专业:自动化年级:2011(3)任课教师:王丽电气信息工程学院制2015年1月基于C51的LCD12864液晶动画显示学生:王文奇指导教师:王丽电气信息工程学院自动化专业1.主要芯片简介1.1 AT89C51单片机简介AT89C51是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和128 bytes的随机存取数据存储器(RAM ),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C51单片机能应用许多高性价比的场合,可灵活应用于各种控制领域。
图1 AT89C51封装图主要性能参数(1)主要特性:·4K字节可编程闪烁存储器;·全静态工作:0Hz-24Hz·三级程序存储器锁定·128*8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路(2)部分管脚说明:VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收.P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
12864LCD液晶显示原理及使用方法
![12864LCD液晶显示原理及使用方法](https://img.taocdn.com/s3/m/c00f0012aaea998fcd220e06.png)
12864LCD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。
点阵式图形液晶显示屏是 LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD 的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。
12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。
分为两种,带字库的和不带字库的。
不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。
带字库的LCD提供字库字模,但是只能显示GB2312的宋体。
各有优缺点,根据不同应用场景灵活选择。
其液晶模块原理图如下所示。
12864LCD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。
如下表所示:12864LCD 的引脚说明管脚号管脚名称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD - 液晶显示器驱动电压4RS (D/I) H/LD/I=“H”,表示DB7∽DB0 为显示数据D/I=“L”,表示DB7∽DB0 为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR 或DR 6EN H/L R/W=“L”,E 信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM 数据读到DB7∽DB0 7DB0 H/L 数据线8DB1 H/L数据线9DB2 H/L 数据线10DB3 H/L 数据线11DB4 H/L数据线12DB5 H/L数据线13DB6 H/L数据线14DB7 H/L数据线15CS1 H/L H:选择芯片(右半屏)信号16CS2 H/L H:选择芯片(左半屏)信号17RET H/L复位信号,低电平复位18VEE -10VLCD 驱动负电压19LED+ - LED 背光板电源20LED- - LED 背光板电源12864LCD点阵图形液晶模块应用连接电路液晶驱动设置在理解12864LCD硬件原理和管脚功能之后,可以针对LCD进行驱动的编写,分两种情况:仿真环境下和实物开发板编程。
12864LCD动态显示
![12864LCD动态显示](https://img.taocdn.com/s3/m/5c5b7d295901020207409ca1.png)
/*------------------------------------------------------------------------------PC2 PC3 PC4 PC5 PC6 PC7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7RS R/W E PSB NC RST DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7RS高电平写数据,低电平写指令代码.R/W高电平为读,低电平为写E为使能信号,PSB高电平为并行模式,低电平为串行模式,RST低电平有效显示地址:80H,81H,......86H,87H.第一行显示地址90H,91H,......96H,97H.第二行显示地址88H,89H,......8EH,8FH.第二行显示地址98H,99H,......9EH,9FH.第三行显示地址写指令01H:显示清屏,写指令02H: 位址归位,写指令0CH:开显示(无游标,不反白)写指令30H:基本指令集,写指令80H:设置DDRAM,写指令10H:显示HCGROM------------------------------------------------------------------------------*/#include <iom16v.h>#include <macros.h>#define RS_H DDRC |= (1<<2);PORTC |= (1<<2); //RS设为高电平#define RS_L DDRC |= (1<<2);PORTC &= ~(1<<2); //RS设为低电平#define RW_H DDRC |= (1<<3);PORTC |= (1<<3); //RW设为高电平#define RW_L DDRC |= (1<<3);PORTC &= ~(1<<3); //RW设为低电平#define E_H DDRC |= (1<<4);PORTC |= (1<<4); //E设为高电平#define E_L DDRC |= (1<<4);PORTC &= ~(1<<4); //E设为低电平#define RST_H DDRC |= (1<<7);PORTC |= (1<<7); //RST为高电平unsigned char MainMenu0[] = {"第二课堂胜风电子"};unsigned char MainMenu1[] = {"数据为:"};unsigned char Shuzi[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'};/***********************函数功能:LCD延时子程序入口参数:t********************/ void delay(unsigned int t){ unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/***********************函数功能:端口初始化***********************************/ void PORT_init(){ PORTA = 0xFF;DDRA = 0xFF;PORTC = 0xCE;DDRC = 0xCE;}/**********************函数功能:LCD测试忙程序*********************************//**********************RS=L,RW=H,EN=高脉冲,读取忙碌标志DB7(BF)*****************/unsigned char check_busy(){ unsigned char BF; //忙标志BFDDRA = 0X00; //端口A设为输入方式PORTA = 0XFF;delay(1);RS_L; //RS=0(命令)delay(1);RW_H;delay(1);E_H; //EN=1,使能delay(1);BF = PINA; //读取A口数据delay(1);E_L; //EN=0delay(1);DDRA = 0XFF; //端口A设为输出方式BF &= 0x80; //读取lcd_data第八位return (BF); //读取结果返回}/***********************函数功能:写指令数据到lcd子程序入口参数:cmd**********/ /***********************RS=L,RW=L,EN=高脉冲,DB0-DB7=指令码******************/void lcdwc(unsigned char cmd){ while(check_busy()); //判断LCD是否为忙状态RS_L; //RS=0(指令),RW=0(写)RW_L;PORTA = cmd; //向LCD发送指令E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:写入显示数据到lcd子程序入口参数:data*******/ /***********************RS=H,RW=L,EN=高脉冲,DB0-DB7=数据********************/void lcdwd(unsigned char Data){ while(check_busy()); //判断LCD是否为忙状态RS_H; //RS=1(数据),RW=0(写)RW_L;PORTA = Data; //向LCD写数据E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:lcd初始化子程序******************************/ void lcd_init(){ delay(5);lcdwc(0x30); //功能设置8位数据,基本指令delay(5);lcdwc(0x0C); //显示状态ON,游标OFF,反白OFFdelay(5);lcdwc(0x01); //清除显示,并且设定地址指针为00Hdelay(5);lcdwc(0x02); //地址归位delay(5);lcdwc(0x80); //设置DDRAM地址}/**********************函数功能:LCD显示子程序*********************************//**********************入口参数:y是所选择的行号,p为写入的字符串**************/ void Char_Set_XY(unsigned char y, unsigned char *p){if(y == 0){lcdwc((0x80));}if(y == 1){lcdwc((0x90));}if(y == 2){lcdwc((0x88));}if(y == 3){lcdwc((0x98));}while(*p != 0) //没写完就继续写{lcdwd(*p++);}}/**********************函数功能:LCD浮点数显示*********************************//**********************入口参数:M为显示的数据,add为从哪里开始显示数据********/ void display_f(float M,unsigned char add){ unsigned char ledbuf[7]={0,0,0,0,0,0,0};unsigned char i,j,k;unsigned long m;if(M>0) //正实数处理{ ledbuf[0] = 12;m = M;if(M<10000) {m = 10*M;}if(M<1000) {m = 100*M;}if(M<100) {m = 1000*M;}if(M<10) {m = 10000*M;}}if(M<0) //负实数处理{ ledbuf[0] = 11;m = -1*M;if(M>-10000) {m = -10*M;}if(M>-1000) {m = -100*M;}if(M>-100) {m = -1000*M;}if(M>-10) {m = -10000*M;}}ledbuf[1]=m/10000; //万位ledbuf[2]=m%10000/1000; //千位ledbuf[3]=m%1000/100; //百位ledbuf[4]=m%1000%100/10; //十位ledbuf[5]=m%1000%100%10; //个位ledbuf[6]=10; //小数点if(M>=0) //+号处理{ if(M<10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10;}if(M<1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10;}if(M<100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10;}if(M<10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10;}}if(M<0) //-号处理{ if(M>-10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10; }if(M>-1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10; }if(M>-100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10; }if(M>-10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10; }}lcdwc(add);for(k=0;k<7;k++){ i = ledbuf[k];j = Shuzi[i];lcdwd(j);}}/***********************函数功能:主函数***************************************/ void main(void){ float i = 168.88;PORT_init(); //端口初始化lcd_init(); //初始化LCD屏RST_H;Char_Set_XY(0,MainMenu0); //第一行显示Char_Set_XY(1,MainMenu1); ////第二行显示while(1){ //delay(1000);display_f(i,0x94);delay(100);//i += 0.02;//delay(1000);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*------------------------------------------------------------------------------PC2 PC3 PC4 PC5 PC6 PC7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7RS R/W E PSB NC RST DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7RS高电平写数据,低电平写指令代码.R/W高电平为读,低电平为写E为使能信号,PSB高电平为并行模式,低电平为串行模式,RST低电平有效显示地址:80H,81H,......86H,87H.第一行显示地址90H,91H,......96H,97H.第二行显示地址88H,89H,......8EH,8FH.第二行显示地址98H,99H,......9EH,9FH.第三行显示地址写指令01H:显示清屏,写指令02H: 位址归位,写指令0CH:开显示(无游标,不反白)写指令30H:基本指令集,写指令80H:设置DDRAM,写指令10H:显示HCGROM------------------------------------------------------------------------------*/#include <iom16v.h>#include <macros.h>#define RS_H DDRC |= (1<<2);PORTC |= (1<<2); //RS设为高电平#define RS_L DDRC |= (1<<2);PORTC &= ~(1<<2); //RS设为低电平#define RW_H DDRC |= (1<<3);PORTC |= (1<<3); //RW设为高电平#define RW_L DDRC |= (1<<3);PORTC &= ~(1<<3); //RW设为低电平#define E_H DDRC |= (1<<4);PORTC |= (1<<4); //E设为高电平#define E_L DDRC |= (1<<4);PORTC &= ~(1<<4); //E设为低电平#define RST_H DDRC |= (1<<7);PORTC |= (1<<7); //RST为高电平unsigned char MainMenu0[] = {"第二课堂胜风电子"};unsigned char MainMenu1[] = {"数据为:"};unsigned char Shuzi[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'};/***********************函数功能:LCD延时子程序入口参数:t********************/ void delay(unsigned int t){ unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/***********************函数功能:端口初始化***********************************/ void PORT_init(){ PORTA = 0xFF;DDRA = 0xFF;PORTC = 0xCE;DDRC = 0xCE;}/**********************函数功能:LCD测试忙程序*********************************//**********************RS=L,RW=H,EN=高脉冲,读取忙碌标志DB7(BF)*****************/unsigned char check_busy(){ unsigned char BF; //忙标志BFDDRA = 0X00; //端口A设为输入方式PORTA = 0XFF;delay(1);RS_L; //RS=0(命令)delay(1);RW_H;delay(1);E_H; //EN=1,使能delay(1);BF = PINA; //读取A口数据delay(1);E_L; //EN=0delay(1);DDRA = 0XFF; //端口A设为输出方式BF &= 0x80; //读取lcd_data第八位return (BF); //读取结果返回}/***********************函数功能:写指令数据到lcd子程序入口参数:cmd**********/ /***********************RS=L,RW=L,EN=高脉冲,DB0-DB7=指令码******************/void lcdwc(unsigned char cmd){ while(check_busy()); //判断LCD是否为忙状态RS_L; //RS=0(指令),RW=0(写)RW_L;PORTA = cmd; //向LCD发送指令E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:写入显示数据到lcd子程序入口参数:data*******/ /***********************RS=H,RW=L,EN=高脉冲,DB0-DB7=数据********************/void lcdwd(unsigned char Data){ while(check_busy()); //判断LCD是否为忙状态RS_H; //RS=1(数据),RW=0(写)RW_L;PORTA = Data; //向LCD写数据E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:lcd初始化子程序******************************/ void lcd_init(){ delay(5);lcdwc(0x30); //功能设置8位数据,基本指令delay(5);lcdwc(0x0C); //显示状态ON,游标OFF,反白OFFdelay(5);lcdwc(0x01); //清除显示,并且设定地址指针为00Hdelay(5);lcdwc(0x02); //地址归位delay(5);lcdwc(0x80); //设置DDRAM地址}/**********************函数功能:LCD显示子程序*********************************//**********************入口参数:y是所选择的行号,p为写入的字符串**************/ void Char_Set_XY(unsigned char y, unsigned char *p){if(y == 0){lcdwc((0x80));}if(y == 1){lcdwc((0x90));}if(y == 2){lcdwc((0x88));}if(y == 3){lcdwc((0x98));}while(*p != 0) //没写完就继续写{lcdwd(*p++);}}/**********************函数功能:LCD浮点数显示*********************************//**********************入口参数:M为显示的数据,add为从哪里开始显示数据********/ void display_f(float M,unsigned char add){ unsigned char ledbuf[7]={0,0,0,0,0,0,0};unsigned char i,j,k;unsigned long m;if(M>0) //正实数处理{ ledbuf[0] = 12;m = M;if(M<10000) {m = 10*M;}if(M<1000) {m = 100*M;}if(M<100) {m = 1000*M;}if(M<10) {m = 10000*M;}}if(M<0) //负实数处理{ ledbuf[0] = 11;m = -1*M;if(M>-10000) {m = -10*M;}if(M>-1000) {m = -100*M;}if(M>-100) {m = -1000*M;}if(M>-10) {m = -10000*M;}}ledbuf[1]=m/10000; //万位ledbuf[2]=m%10000/1000; //千位ledbuf[3]=m%1000/100; //百位ledbuf[4]=m%1000%100/10; //十位ledbuf[5]=m%1000%100%10; //个位ledbuf[6]=10; //小数点if(M>=0) //+号处理{ if(M<10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10;}if(M<1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10;}if(M<100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10;}if(M<10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10;}}if(M<0) //-号处理{ if(M>-10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10; }if(M>-1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10; }if(M>-100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10; }if(M>-10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10; }}lcdwc(add);for(k=0;k<7;k++){ i = ledbuf[k];j = Shuzi[i];lcdwd(j);}}/***********************函数功能:主函数***************************************/ void main(void){ float i = 168.88;PORT_init(); //端口初始化lcd_init(); //初始化LCD屏RST_H;Char_Set_XY(0,MainMenu0); //第一行显示Char_Set_XY(1,MainMenu1); ////第二行显示while(1){ //delay(1000);display_f(i,0x94);delay(100);//i += 0.02;//delay(1000);}}。