单片机12864动态波形显示
- 格式:doc
- 大小:61.00 KB
- 文档页数:13
12864液晶画波形2009-08-19 19:22:0512864液晶画波形要能画波形,有一点是至关重要重要的,那就是打点,所谓打点,就是能在指定的X,Y的坐标处打上一个小黑点,12864液晶的操作就像大多数16位以上的处理器一样是字节或字或双字操作的,不像51和彩色液晶一样的位操作,所以要在12864上打点,就必须用“与或”的方式。
下面把打点的函数贴上,这是以前做温度波形显示的时候做的/****************打点******************/void point(uchar x,uchar y){uchar y1,hang,lie,msb_data,lsb_data,temp=0x01;if(y1!=y){msb_data=0;lsb_data=0;}y1=y;if(y<32){hang=0x80+y;lie=0x80;}if(y>31){hang=0x80+y-32;lie=0x88;}if(y>63)//return;{lcm_com(0x80);_nop_();hanzi("温度超出显示范围");while(1)flash();}lie=lie+x/16;if(x%16==0){msb_data=0;lsb_data=0;}if(x%16<8){msb_data=msb_data|(temp<<(7-x%16));lsb_data=0x00|lsb_data;}//保留以前的数据,把第x个点亮if(x%16==8){msb_data=msb_data|0x00;lsb_data=lsb_data|0x80;}if(x%16>8){msb_data=msb_data|0x00;lsb_data=lsb_data|(temp<<(15-x%16));}lcm_com(0x34);//扩充指令集lcm_com(hang);lcm_com(lie);lcm_dat(msb_data);lcm_dat(lsb_data);lcm_com(0x36);//绘图显示开}打点完成之后波形就相应的出来了,比如说要记录一个波形随时间变化,x坐标随着时间自动增加,x增加一个单位时相应y的值就得确定,在送个打点函数,波形就出来了。
《单片机原理及应用》课程设计题目128*64点阵LCD的显示院系信息学院专业通信工程姓名XXX学号XXXXX指导老师XXX报告日期2009.09.101.题目:128*64点阵LCD的显示2.原理简述12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
图形或汉字的点阵信息当然由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。
左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。
(少数厂商为了简化用户设计,在模块中增加译码电路,使得128*64液晶屏就是一个整屏,只需一个片选信号。
)显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。
512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。
每个存储单元存储8个液晶点的显示信息。
为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。
每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。
(需要注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。
即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。
因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。
12864L CD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为L CD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。
点阵式图形液晶显示屏是LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。
12864L CD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。
分为两种,带字库的和不带字库的。
不带字库的L CD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。
带字库的LCD提供字库字模,但是只能显示GB2312的宋体。
各有优缺点,根据不同应用场景灵活选择。
其液晶模块原理图如下所示。
12864L CD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。
如下表所示:12864L CD 的引脚说明管脚号管脚名称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD- 液晶显示器驱动电压4RS (D/I)H/LD/I=“H”,表示DB7∽DB0 为显示数据D/I=“L”,表示DB7∽DB0 为显示指令数据5R/WH/LR/W=“H”,E=“H”数据被读到D B7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR6EN H/LR/W=“L”,E 信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 7DB0 H/L 数据线8DB1 H/L数据线9DB2 H/L 数据线10DB3H/L 数据线11DB4H/L数据线12DB5H/L数据线13DB6H/L数据线14DB7H/L数据线15CS1H/L H:选择芯片(右半屏)信号16CS2H/L H:选择芯片(左半屏)信号17RETH/L复位信号,低电平复位18VEE -10VLCD驱动负电压19LED+- LED 背光板电源20LED-- LED 背光板电源12864L CD点阵图形液晶模块应用连接电路液晶驱动设置在理解12864LCD硬件原理和管脚功能之后,可以针对LCD进行驱动的编写,分两种情况:仿真环境下和实物开发板编程。
(完整版)12864显示波形Lcd12864。
c:#include ”lcd12864.h”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;LCDDelay(2);LCDEn=0;dat=0x80&dat;}while(!(dat==0x00));}void write_com (char cmdcode){CheckState ( );LCDRs = 0;LCDRw = 0;LCDData = cmdcode;LCDDelay (2);LCDEn = 1;LCDDelay (2);LCDEn = 0;}void write_data (char LCDDispdata){CheckState ( );LCDRs=1;LCDRw=0;LCDData=LCDDispdata;LCDDelay(2);LCDEn=1;LCDDelay(2);LCDEn=0;}void LCDInit (){(完整版)12864显示波形LCDDelay(100);LCDCs1=1;LCDCs2=1;LCDDelay(100);write_com(LCDDispOff);write_com(PageAdd+0);write_com(StartLine+0);write_com(LCDColAdd+0);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);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);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[]){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);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[]){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);write_com(LCDColAdd+column);for(j=0;j〈8;j++){write_data(num[8*i+j]);}}}void LCDWriteNumBlack(char leftright,char page,char column,char num[]){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);write_com(LCDColAdd+column);for(j=0;j<8;j++){write_data(~num[8*i+j]);}}}Lcd12864。
课程设计(论文)任务书电气与电子工程学院系自动化专业 13—2 班级一、课程设计(论文)题目简易信号发生器的设计二、课程设计(论文)工作自2016 年 1 月 5 日起至2016 年 1 月 14 日止。
三、课程设计(论文)的内容要求:课程设计不仅仅要求学生完成所规定的题目要求,同时还要培养学生良好的科学态度和严谨的设计习惯。
课程设计报告要求内容如下:(1)设计思想和设计说明(2)硬件原理框图(3)硬件原理图与软件配合介绍 (4)程序存储器和数据存储器的单元分配(5) 程序流程图 (6)系统功能描述(7) 设计调试过程总结(8) 附录里面包括:芯片资料、源程序清单和符合制图规范的硬件原理图的图纸。
设计要求内容:用D/A实现正弦信号,三角波信号,方波信号的输出,并且在LCD上显示出当前波形。
要求输出信号的频率和幅度可调。
设计内容:(1)满足设计要求内容。
(2)扩展锯齿波波形输出。
(3)汉字显示当前波形形状与当前频率的大小学生签名年月日课程设计(论文)评审意见(1)题目复杂程度:复杂()、较复杂()、一般()、简单()(2)总体方案的选择是否正确:正确()、较正确()、欠正确()、不正确()(3) 系统能否满足任务要求:满足()、较满足()、欠满足()、不满足()(4) 元器件选择是否合理:合理()、较合理()、欠合理()、不太合理()(5) 学习实践态度:好()、较好()、一般()、不太好()(6) 独立工作能力:强()、较强()、一般()、较差()(7) 回答问题是否正确:正确()、较正确()、基本正确()、大多不正确()(8) 图表是否符合标准:符合()、较符合()、基本符合()、大多不符合()(9) 撰写是否规范整洁:规范整洁()、较规范()、欠规范()、不太规范()总评成绩:优()、良()、中()、及格()、不及格()评阅人职称副教授2016 年 1 月日目录一、课程设计及要求及目的通过课程设计环节加深对单片机原理及应用技术的理解,提高理论结合实践的能力,提高单片机系统设计和开发的能力,初步学习一个完整的单片机系统的研发过程,并培养严谨细致的科研态度。
/****************************************************************************** ** 描述: ** 12864标准字库液晶演示数据p0,控制p2 ******************************************************************************** */#include <reg51.h>#include <math.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/************* 12864LCD引脚定义*************/#define LCD_data P0 //数据口sbit LCD_RS = P2^6; //寄存器选择输入sbit LCD_RW = P2^5; //液晶读/写控制sbit LCD_EN = P2^7; //液晶使能控制sbit LCD_PSB = P3^2; //串/并方式控制sbit LCD_RST = P3^7; //液晶复位端口#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};/*********************************************************/uchar code DIS1[] = {"Vpp:"};uchar code DIS2[] = {"F:"};uchar DIS3[] = {"5V"};uchar DIS4[] = {"12Hz"};uchar D1[]={"0123456789"};/*********************************************************///正弦波代码uchar code tab[]={126,100,80,70,65,62,65,70,80,100,126,152,172,182,187,190,187,182,172,152};//背景图片uchar code Photo1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00};/****************************************************************************** //*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay(int ms){while(ms--){uchar i;for(i=0;i<150;i++){_nop_();_nop_();_nop_();_nop_();}}}/*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay1(int ms){while(ms--){uchar y;for(y=0;y<100;y++) ;}}/*******************************************************************//* *//*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。
#include <iom128v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define PSBH PORTC|=BIT(0);#define PSBL PORTC&=~BIT(0);#define EH PORTC|=BIT(1);#define EL PORTC&=~BIT(1);#define RWH PORTC|=BIT(2);#define RWL PORTC&=~BIT(2);#define RSH PORTC|=BIT(3);#define RSL PORTC&=~BIT(3);void Delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/**********************************************************液晶显示(串行方式)**********************************************************/void SendByte(uchar zdata) // 按照液晶的串口通信协议,发送数据{uchar i;for(i=0; i<8; i++){if((zdata << i) & 0x80){RWH;}else{RWL;}EL;EH;}}void write_LCD_cmd(uchar cmdcode) // 写串口指令{RSL;RSH;SendByte(0xf8);SendByte(cmdcode & 0xf0);SendByte((cmdcode << 4) & 0xf0);Delay_ms(2);}void write_LCD_dat(uchar Dispdata) // 写数据{RSL;RSH;SendByte(0xfa);SendByte(Dispdata & 0xf0);SendByte((Dispdata << 4) & 0xf0);Delay_ms(2);}void Display_str(uchar X,uchar Y,uchar *p)//显示字符串函数{uint i; //局部循环体控制变量switch(X){case 0:write_LCD_cmd( 0x80 + Y );break; //第一行case 1:write_LCD_cmd( 0x90 + Y );break; //第二行case 2:write_LCD_cmd( 0x88 + Y );break; //第三行case 3:write_LCD_cmd( 0x98 + Y );break; //第四行}for(i=0;p[i]!='\0';i++){write_LCD_dat(p[i]);}}//**********液晶初始化**********//void LCD_init(){PSBL; //串行方式Delay_ms(5);write_LCD_cmd(0x30);//选择基本指令操作Delay_ms(1);write_LCD_cmd(0x0C);//显示状态开关:整体显示开,光标显示关,光标显示反白关Delay_ms(1);write_LCD_cmd(0x01); //清除显示DDRAMDelay_ms(2);write_LCD_cmd(0x06);//启始点设定:光标右移Delay_ms(1);}void main(void){DDRD=0xFF;PORTD=0xFF;LCD_init();Display_str(0,0,"AD电压采集显示值");Display_str(1,0,"实际电压:");while(1);}。
摘要本文使用FPGA技术实现,通过控制液晶屏的地址,将汉字、字符或图形输入到液晶屏上,通过连续几屏显示实现动态效果。
关键词FPGA;12864lcd;静态显示;动态显示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",由图片可知,后两行并未输出内容。
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",由图片可知,后两行并未输出内容。
51单⽚机⽰波器制作(12864显⽰带字库)⾸先说明:我才接触51单⽚机3个星期(6⽉8号才⾼考完),对C语⾔还很陌⽣。
我就是⼀个萌新,还希望⼤佬们多多指导。
12864(带字库st7920驱动)为显⽰器,XPT2046为AD转换芯⽚。
(不要问我为什么⽤这个芯⽚,开发板⾃带的坑货。
我在⽹上下载的⽰波器程序⼤多以ADC0832或ADC0808为AD转换芯⽚,结果我都⽤不了,所以才被迫⾃写程序。
)⽰波器程序由main.c XPT2046.c XPT2046.h三个⼦⽂件构成,main.c是我根据⽹上的⼀个12864画图程序改编⽽成我也加了⼀些注释,后⾯两个⽂件取⾃开发板⾃带的例程并进⾏了修改。
所以说这个程序基本上不是我编写的,也有很多问题和不⾜之处还请指正。
下⾯是效果图。
⾸先是⽅波。
由于没有函数发⽣器,就只能通过⼿机播放只做好的正弦⾳频,再检测⼿机⽿机接⼝信号。
不知道为什么,正弦波有⼀半不见了,似乎是由于不能检测到负电压还是什么的。
下⾯贴出main.c 的代码。
01.#include <reg52.h>02.#include"XPT2046.h" 03.#define uint unsigned int 04.#define uchar unsigned char05.06.sbit RS=P2^6; //LCD 数据或命令选择端07.sbit RW=P2^5; //LCD 写⼊或读出选择端08.sbit RST=P1^0; //LCD 复位端⼝09.sbit LCDE=P2^7; // LCD 使能端10.sbit PSB=P3^2;//串⾏或并⾏选择端11.12. void delay(uchar i)13. {14. while(i--);15. } //延时函数,i=1时延时约10微秒(12M晶振)16.17. void SPI_Start()18. {19. CLK = 0;20. CS = 1;21. DIN = 1;22. CLK = 1;23. CS = 0;24. } //ADC芯⽚(XPT2046)初始化函数25.26. void lcd_busy()27.28. {29.30. RS=0;31.32. RW=1;33.34. P0=0XFF;35.36. LCDE=1;37.38. delay(14);39.40. while((P0&0x80)==0x80);41. LCDE=0;42.43. }//LCD12864(st7920驱动)查忙函数44.45. void write_com(uchar com)46.47. {48.49. lcd_busy();RS=0;50.51. RW=0;52.53. LCDE=0;54.55. P0=com;56.57. delay(9);58.59. LCDE=1;60.61. delay(9);62.63. LCDE=0;64.65. }//LCD写指令函数66.67. void write_num(uchar num)68.69. {70.71. lcd_busy();72.73. RS=1;75. RW=0;76.77. LCDE=0;78.79. P0=num;80.81. delay(7);82.83. LCDE=1;84.85. delay(9);86.87. LCDE=0;88.89. }//LCD写数据函数90.91. uchar read_data()92.93. {94.95. uchar read;96.97. lcd_busy();98.99. RS=1;100.101. RW=1;102.103. LCDE=0;104.105. delay(7);106.107. LCDE=1;108.109. delay(9);110.111. read=P0;112.113. LCDE=0;114.115. delay(11);;116.117.118.119. return read;120.121. } //LCD读数据函数122.123. void clear_lcd()124.125. {126.127. uchar i,j;128.129. write_com(0x34);130.131. for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三⼗⼆次132.133. {134.135. write_com(0x80+i); //先写⼊纵坐标Y的值137. write_com(0x80); //再写⼊横坐标X的值138.139. for(j=0;j<32;j++) //横坐标有16位,每位写⼊两个字节的的数据,也就写⼊32次140.141. { //因为当写⼊两个字节之后横坐标会⾃动加1,所以就不⽤再次写⼊地址了。
/*------------------------------------------------------------------------------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);}}。
/******************************************************************************* ******************************************************************************** *******///程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能//端口设置:RS、RW、EN分别为P0口的0、1、2,数据口为P2口用取模软件取的图形或汉字必须是逐行取的,因为本函数是在液晶上逐行打点的/******************************************************************************* ******************************************************************************** ******/#include<reg51.h>#include<intrins.h> //内含-NOP-函数#include<stdlib.h> //内含rand()函数#define uchar unsigned char#define uint unsigned int//**********宏定义所需指令#define BASIC_SET 0x30#define EXTEND_SET 0x34#define DRAW_ON 0x36#define DRAW_OFF 0x34//*************端口定义sbit LCD_RS = P2^5;sbit LCD_RW = P2^6;sbit LCD_EN = P2^7;sbit DS=P3^3; //定义温度DS18B20接口,详情见原理图//************变量定义uchar code t0[]="温度 . ℃";uchar code t1[]="0123456789"; //利用一个温度表解决温度显示乱码uchar i,k,a,b;//****************短延时void delay(uint k){uint i;uchar j;for(i = 0; i < k ;i ++)for(j = 0; j < 10 ;j ++);}//***********12864写指令函数void write_com(uchar cmd){LCD_RS = 0;LCD_RW = 0;P0 = cmd;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//********12864写数据函数void write_dat(uchar dat){LCD_RS = 1;LCD_RW = 0;P0 = dat;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//****************从LCD中读数据uchar read_dat(void){uchar temp;P0 = 0XFF; //释放数据线LCD_RS = 1; //数据LCD_RW = 1; // 读模式LCD_EN = 1; //E为高电平进行读数据或指令delay(1);temp = P0;LCD_EN = 0;return temp;}//******************************************************** //设置光标(地址)函数//参数说明:x---为行号,y为列号//********************************************************void set_cursor(unsigned char x, unsigned char y){unsigned char i;switch(x) //确定行号{case 0x00: i=0x80; break; //第一行case 0x01: i=0x90; break; //第二行case 0x02: i=0x88; break; //第三行case 0x03: i=0x98; break; //第四行default : break;}i = y+i; //确定列号write_com(i);}//********************************************************//显示字符函数//********************************************************void display_char(unsigned char Alphabet){write_dat(Alphabet); //写入需要显示字符的显示码}//********************************************************//指定位置显示字符串函数//参数说明:x为行号,y为列号//********************************************************void display_string(unsigned char x,unsigned char y,unsigned char *Alphabet) {unsigned char i=0;set_cursor(x,y); //设置显示的起始地址while(Alphabet[i]!='\0'){write_dat(Alphabet[i]); //写入需要显示字符的显示码i++;}}//***************************************************************************以下为GDRAM绘图部分************************************************************************////*********************绘图显示的清屏函数(因清屏指令在画图时不能用)------------------------------------------------------------------------------注意!!!!!!!void gui_clear(){uchar i , j , k;write_com(EXTEND_SET);//扩展指令集,8位数据传输write_com(DRAW_OFF);//绘图显示关闭for(i = 0; i < 2; i ++)//分上下两屏写{for(j = 0; j < 32; j ++){write_com(0x80 + j);//写y坐标delay(1);if(i == 0) //写x坐标{write_com(0x80);delay(1);}else //写下半屏{write_com(0x88);delay(1);}for(k = 0; k < 16; k ++)//写一整行数据{write_dat(0x00);//写高字节write_dat(0x00);//写低字节delay(1);}}}write_com(DRAW_ON);//打开绘图显示write_com(BASIC_SET);//打开基本指令集}//***********(给定坐标并打点的)任意位置打点函数void lcd_set_dot(uchar x,uchar y){uchar x_byte,x_bit;//确定在坐标的那一字节哪一位uchar y_ping , y_bit;//确定在坐标的哪一屏哪一行uchar tmph , tmpl;//定义两个临时变量,用于存放读出来的数据write_com(EXTEND_SET);//扩展指令集write_com(DRAW_OFF);//绘图显示关闭x_byte = x / 16;//算出在哪一字节,注意一个地址是16位的x_bit = x % 16;//& 0x0f;//算出在哪一位y_ping = y / 32;//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏y_bit = y % 32;//& 0x1f;//确定在第几行write_com(0X80 + y_bit);//先写垂直地址(最高位必须)write_com(0x80 + x_byte + 8 * y_ping);//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏read_dat();//预读取数据tmph = read_dat();//读取当前显示高8位数据tmpl = read_dat();//读取当前显示低8位数据delay(1);write_com(0x80 + y_bit);//读操作会改变AC,所以重新设置一下write_com(0x80 + x_byte + 8 * y_ping);delay(1);if(x_bit < 8){write_dat(tmph | (0x01 << (7 - x_bit)));//写高字节,因为坐标是从左向右的,GDRAM高位在昨,低位在右write_dat(tmpl);//原低位数据送回}else{write_dat(tmph);//原高位数据送回write_dat(tmpl | (0x01 << (15 - x_bit)));}write_com(DRAW_ON); //打开绘图显示write_com(BASIC_SET);//回到基本指令集}//************画水平线函数**********************************////x0、x1为起始点和终点的水平坐标,y为垂直坐标***************////**********************************************************// void gui_hline(uchar x0, uchar x1, uchar y){uchar bak;//用于对两个数互换的中间变量,使x1为大值if(x0 > x1){bak = x1;x1 = x0;x0 = bak;}do{lcd_set_dot(x0 , y);//从左到右逐点显示x0 ++;}while(x1 >= x0);}//***********画竖直线函数***********************************// //x为起始点和终点的水平坐标,y0、y1为垂直坐标***************// //**********************************************************// void gui_rline(uchar x, uchar y0, uchar y1){uchar bak;//用于对两个数互换的中间变量,使y1为大值if(y0 > y1){bak = y1;y1 = y0;y0 = bak;}do{lcd_set_dot(x , y0);//从上到下逐点显示y0 ++;}while(y1 >= y0);}//*********任意两点间画直线*********************************// //x0、y0为起始点坐标,x1、y1为终点坐标**********************// //**********************************************************//void gui_line(uchar x0 , uchar y0 , uchar x1 , uchar y1){char dx;//直线x轴差值char dy;//直线y轴差值char dx_sym;//x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym;//y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2;//dx*2值变量,用于加快运算速度char dy_x2;//dy*2值变量,用于加快运算速度char di; //决策变量if(x0 == x1)//判断是否为垂直线{gui_rline(x0 , y0 , y1);//画垂直线return;}if(y0 == y1)//判断是否为水平线{gui_hline(x0 , x1 , y0);//画水平线return;}dx = x1 - x0;//求取两点之间的差值dy = y1 - y0;//****判断增长方向,或是否为水平线、垂直线、点*//if(dx > 0)//判断x轴方向dx_sym = 1;else{if(dx < 0)dx_sym = -1;else{gui_rline(x0 , y0 , y1);return;}}if(dy > 0)//判断y轴方向dy_sym = 1;else{if(dy < 0)dy_sym = -1;else{gui_hline(x0 , x1 , y0);return;}}/*将dx、dy取绝对值***********/dx = dx_sym * dx;dy = dy_sym * dy;/****计算2倍的dx、dy值*******/dx_x2 = dx * 1;//我改为了一倍,这样才跟真实的两点对应dy_x2 = dy * 1;/***使用bresenham法进行画直线***/if(dx >= dy)//对于dx>=dy,使用x轴为基准{di = dy_x2 - dx;while(x0 != x1){lcd_set_dot(x0,y0);x0 +=dx_sym;if(di < 0)di += dy_x2;//计算出下一步的决策值else{di += dy_x2 - dx_x2;y0 += dy_sym;}}lcd_set_dot(x0, y0);//显示最后一点}else //对于dx<dy使用y轴为基准{di = dx_x2 - dy;while(y0 != y1){lcd_set_dot(x0, y0);y0 += dy_sym;if(di < 0)di += dx_x2;else{di += dx_x2 - dy_x2;x0 += dx_sym;}}lcd_set_dot(x0, y0);//显示最后一点}}//***************************************************************************以上为自定义字库部分**************************************************************////****************12864初始化函数void lcd_init(){write_com(0x30);//基本指令操作,8位并口delay(1);write_com(0x06);//设置为游标右移,DDRAM地址加一,画面不动delay(1);write_com(0x0c);//显示开,关光标delay(1);write_com(0x01);//清除lcd显示内容delay(1);}//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/*************DS18B20温度读取模块*************/void tmpDelay(int num)//延时函数{while(num--) ;}void Init_DS18B20()//初始化ds1820{unsigned char x=0;DS = 1; //DS复位tmpDelay(8); //稍做延时DS = 0; //单片机将DS拉低tmpDelay(80); //精确延时大于 480usDS = 1; //拉高总线tmpDelay(14);x=DS; //稍做延时后如果x=0则初始化成功 x=1则初始化失败tmpDelay(20);}unsigned char ReadOneChar()//读一个字节{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DS = 0; // 给脉冲信号dat>>=1;DS = 1; // 给脉冲信号if(DS)dat|=0x80;tmpDelay(4);}return(dat);}void WriteOneChar(unsigned char dat)//写一个字节{unsigned char i=0;for (i=8; i>0; i--){DS = 0;DS = dat&0x01;tmpDelay(5);DS = 1;dat>>=1;}}unsigned int Readtemp()//读取温度{unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //连续读两个字节数据 //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a; //两字节合成一个整型变量。
12864显示程序,51单片机,C语言可显示固定中文,字符,数字;可实时动态刷新显示数字,字符;#include<reg52.h>sbit rs=P1^2;sbit rw=P1^1;sbit cs=P1^0;sbit psb=P1^3;unsigned char code table[]={" X0: Y0: "}; unsigned char code table1[]={"现在X1: Y1: "}; unsigned char code table2[]={"划线模式:"}; unsigned char code table3[]={"开始暂停"};void delay(unsigned char z) //延时{unsigned i,j;for(i=0;i<z;i++)for(j=0;j<110;j++);}void write_com(unsigned int com) //写命令{rs=0;rw=0;cs=0;P2=com;delay(5);cs=1;delay(5);cs=0;}void write_date(unsigned char dat) //写数据{rs=1;rw=0;cs=0;P2=dat;delay(5);cs=1;delay(5);cs=0;}void pos(unsigned char x,unsigned char y) //起点函数{unsigned char pos;if(x==0)x=0x80;else if(x==1)x=0x90;else if(x==2)x=0x88;else if(x==3)x=0x98;pos=x+y/2;write_com(pos);}void init(){unsigned char i;psb=1; //1并行,0串行write_com(0x30); //基本指令操作delay(5);write_com(0x0c); //显示开,关光标delay(5);write_com(0x01); //清除led的显示内容delay(5);pos(0,0);i=0;while(table[i]!='\0') //第一行固定显示{write_date(table[i]);i++;}pos(1,0);i=0;while(table1[i]!='\0'){write_date(table1[i]); //第二行固定显示i++;}pos(2,0);i=0;while(table2[i]!='\0'){write_date(table2[i]); //第三行固定显示i++;}pos(3,0);i=0;while(table3[i]!='\0'){write_date(table3[i]); //第四行固定显示i++;}}void write_dianya(unsigned char add_x,unsigned char add_y,int date){//12864刷新char bai,shi,ge;bai=date/100;shi=date%100/10;ge=date%10;pos(add_x,add_y);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);}void main(){init();while(1){write_dianya(0,3,134);}}。
12864显示波形实例#include <reg52.H>#include<intrins.h>#include<math.h>sbit RS=P0^0; //并行的指令/数据选择信号, H数据, L命令sbit RW=P0^1; //并行读写选择信号, H读, L写sbit E=P0^2; //并行使能端, H有效, L无效sbit PSB=P0^3; //并/串接口选择, H并,L串sbit led=P0^4;sbit jiakey=P1^0;sbit jiankey=P1^1;sbit ledkey=P1^2;#define LcdData P2unsigned char dati=0;unsigned char dat[100];unsigned char over=0;unsigned int temp=0;unsigned char mode=0;unsigned int delnop=0;//////////////////////////////////////unsigned char Lcd_CheckBusy(void){unsigned char Busy;LcdData=0xff;RS=0;RW=1;E=1;_nop_();Busy=LcdData&0x80;E=0;return Busy;}/*********************************向LCD写入字节数据**********************************/void Lcd_WriteData(unsigned char Data){while(Lcd_CheckBusy());RS=1;RW=0;E=0;_nop_();_nop_();LcdData=Data;E=1;_nop_();_nop_();E=0;}/***********************************从LCD中读出数据************************************/unsigned char Lcd_ReadData(void){unsigned char Temp;while(Lcd_CheckBusy());LcdData=0xff;RS=1;RW=1;E=1;_nop_();Temp=LcdData;E=0;return Temp;}/*************************************想LCD中写入指令代码**************************************/void Lcd_WriteCmd(unsigned char CmdCode){while(Lcd_CheckBusy());RS=0;RW=0;E=0;_nop_();_nop_();LcdData=CmdCode;_nop_();_nop_();E=1;_nop_();_nop_();E=0;}/**************************************为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法***************************************/code unsigned intLcdMaskTab[]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200, 0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};/***************************************向LCD指定坐标写入一个象素,象素颜色有两种,0代表白(无显示),1代表黑(有显示)****************************************/void Lcd_PutPixel(unsigned char x,unsigned char y,unsigned char Color){unsigned char z,w;unsigned int Temp;if(x>=128||y>=64)return;Color=Color%2;w=15-x%16;//确定对这个字的第多少位进行操作x=x/16;//确定为一行上的第几字if(y<32) //如果为上页z=0x80;else //否则如果为下页z=0x88;y=y%32;//EA=0;Lcd_WriteCmd(0x36);Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+z); //列地址Temp=Lcd_ReadData();//先空读一次Temp=(unsigned int)Lcd_ReadData()<<8;//再读出高8位Temp|=(unsigned int)Lcd_ReadData();//再读出低8位//EA=1;if(Color==1) //如果写入颜色为1Temp|=LcdMaskTab[w];//在此处查表实现加速else //如果写入颜色为0Temp&=~LcdMaskTab[w];//在此处查表实现加速//EA=0;Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+z); //列地址Lcd_WriteData(Temp>>8);//先写入高8位,再写入低8位Lcd_WriteData(Temp&0x00ff);Lcd_WriteCmd(0x30);//EA=1;}/*****************************************清除Lcd全屏,如果清除模式Mode为0,则为全屏清除为颜色0(无任何显示)否则为全屏清除为颜色1(全屏填充显示)******************************************/void Lcd_Clear(unsigned char Mode){unsigned char x,y,ii;unsigned char Temp;if(Mode%2==0)Temp=0x00;elseTemp=0xff;Lcd_WriteCmd(0x36);//扩充指令绘图显示for(ii=0;ii<9;ii+=8)for(y=0;y<0x20;y++)for(x=0;x<8;x++){//EA=0;Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+0x80+ii); //列地址Lcd_WriteData(Temp); //写数据D15-D8Lcd_WriteData(Temp); //写数据D7-D0//EA=1;}Lcd_WriteCmd(0x30);}/****************************************LCD初始化*****************************************/void Lcd_Reset(){PSB=1;Lcd_WriteCmd(0x30); //选择基本指令集Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00HLcd_WriteCmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位}//////////////////////////////////////void InitADC(){P1ASF=0X80;ADC_RES=0;ADC_CONTR=0xef;EADC=1;}void adc_isr() interrupt 5 using 1{ADC_CONTR=0xef;if(over==0){temp=delnop;while(temp){temp--;}dat[dati]=ADC_RES;dati++;if(dati>100){dati=0;over=1;}}}//////////////////////////////////////void disp_0(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);}void disp_1(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+4,1);}void disp_2(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+4,1);}void disp_3(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}void disp_4(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}void disp_5(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}disp_p(unsigned char x,unsigned char y){Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+4,y+0,1);}disp_k(unsigned char x,unsigned char y){Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+0,y+1,1);Lcd_PutPixel(x+0,y+2,1);Lcd_PutPixel(x+0,y+3,1);Lcd_PutPixel(x+0,y+4,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+4,1);}void disp_hz(unsigned char x,unsigned char y) {Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+0,y+1,1);Lcd_PutPixel(x+0,y+2,1);Lcd_PutPixel(x+0,y+3,1);Lcd_PutPixel(x+0,y+4,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+4,y+1,1);Lcd_PutPixel(x+4,y+3,1);Lcd_PutPixel(x+4,y+4,1);Lcd_PutPixel(x+5,y+1,1);Lcd_PutPixel(x+5,y+2,1);Lcd_PutPixel(x+5,y+4,1);}void disp_ledon(unsigned char x,unsigned char y){Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+4,1);Lcd_PutPixel(x+4,y+2,1);}void disp_ledoff(unsigned char x,unsigned char y){Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);}void clr(unsigned char starx,unsigned char stary,unsigned char endx,unsigned char endy) {char x=0;char y=0;for(x=starx;x<endx;x++){for(y=stary;y<endy;y++){Lcd_PutPixel(x,y,0);}}}void disp_bj(void){unsigned char x=0; unsigned char y=0;for(x=13;x<114;x++) {Lcd_PutPixel(x,52,1); }for(y=0;y<52;y++) {Lcd_PutPixel(13,y,1); }for(y=0;y<52;y++) {Lcd_PutPixel(114,y,1); }Lcd_PutPixel(13,51,0); Lcd_PutPixel(13,41,0); Lcd_PutPixel(13,31,0); Lcd_PutPixel(13,21,0); Lcd_PutPixel(13,11,0); Lcd_PutPixel(13,1,0); Lcd_PutPixel(114,51,0); Lcd_PutPixel(114,41,0); Lcd_PutPixel(114,31,0); Lcd_PutPixel(114,21,0); Lcd_PutPixel(114,11,0); Lcd_PutPixel(114,1,0);disp_0(5,50);disp_1(5,40);disp_2(5,30);disp_3(5,20);disp_4(5,10);disp_5(5,0);disp_0(117,50);disp_1(117,40);disp_2(117,30);disp_3(117,20);disp_4(117,10);disp_5(117,0);disp_2(13,58);disp_hz(18,58);disp_2(38,58);disp_0(43,58);disp_hz(48,58);disp_2(63,58);disp_0(68,58);disp_0(73,58);disp_hz(78,58);disp_2(88,58);disp_k(93,58);disp_hz(98,58);}line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1) {int i,dx,dy,e,x,y;Lcd_PutPixel(x0,y0,1);Lcd_PutPixel(x1,y1,1);dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(dx>0&&dy>0){if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;e=e+2*dy;if(e>=0){y++;e=e-2*dx;}}}else{e=-dy;x=x0;y=y0;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;e=e+2*dx;if(e>=0){x++;e=e-2*dy;}}}}if(dx<0&&dy<0){dx=x0-x1;dy=y0-y1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x--;e=e+2*dy;if(e>=0){y--;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;e=e+2*dx;if(e>=0){x--;e=e-2*dy;}}}}if(dx>0&&dy<0){dy=y0-y1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;e=e+2*dy;if(e>=0){y--;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;e=e+2*dx;if(e>=0){x++;e=e-2*dy;}}}}if(dx<0&&dy>0){dx=x0-x1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x--;e=e+2*dy;if(e>=0){y++;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;e=e+2*dx;if(e>=0){x--;e=e-2*dy;}}}}if(dx!=0&&dy==0){if(dx>0){for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;}}else{dx=x0-x1;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);}}}if(dx==0&&dy!=0){if(dy>0){for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;}}else{dy=y0-y1;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;}}}}disp_ware(){unsigned char x=0;unsigned char y=0;clr(14,0,15,52);for(x=1;x<100;x++){clr(x+14,0,x+15,52);line(x+13,51-(dat[x-1]/5),x+14,51-(dat[x]/5));}}//////////////////////////////////////main(){Lcd_Reset();Lcd_Clear(0);InitADC();disp_bj();EA=1;{if(over){disp_ware();if(ledkey==0){led=~led;}if(jiakey==0){if(mode<3){mode++;}}if(jiankey==0){if(mode>0){mode--;}}if(led){clr(5,58,10,63);disp_ledon(5,58);}else{clr(5,58,10,63);disp_ledoff(5,58);}switch(mode){case 0:delnop=1;disp_p(91,54);clr(66,54,71,57);clr(41,54,46,57);clr(16,54,21,57);break;case 1:delnop=40;disp_p(66,54);clr(91,54,96,57);clr(41,54,46,57);clr(16,54,21,57);break;case 2:delnop=440;disp_p(41,54);clr(91,54,96,57);clr(66,54,71,57);clr(16,54,21,57);break;case 3:delnop=4440;disp_p(16,54);clr(91,54,96,57);clr(41,54,46,57);clr(66,54,71,57);break;default:break;}over=0;}}}。
基于51单片机的12864LCD显示驱动摘要:利用51单片机对12864LCD显示屏进行驱动,并令其显示动态及静态图像。
可使用4位/8位并行、2线或3线串行多种接口方式,拥有多种字库的点阵图形液晶显示模块;接口方式灵活,操作指令简单、方便,可构成全中文人机交互图形界面。
可以显示汉字,也可完成图形显示;电压、功耗较低;硬件电路结构与显示程序都要简洁,同时价格也略低于相同点阵的图形液晶模块。
关键词:51单片机12864LCD 显示屏动态静态图像引言带中文字库的TS128X64(图1)具有4位/8位并行、2线或3线串行多种接口方式,引脚功能见图2。
其内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。
图1 TS12864液晶实物图该模块接口方式灵活和操作指令简单、方便,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字。
也可完成图形显示,有低电压低功耗的特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构还是显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
本设计讲采用STC89C52对TS128X64进行驱动,设计并制作LCD驱动电路,使其可通过按键切换LCD的显示内容,并且实现对数字,汉字,英文以及图片的显示,滚屏,以及动画功能。
1.硬件设备STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
/****************************************************************************** ** 描述: ** 12864标准字库液晶演示数据p0,控制p2 ******************************************************************************** */#include <reg51.h>#include <math.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/************* 12864LCD引脚定义*************/#define LCD_data P0 //数据口sbit LCD_RS = P2^6; //寄存器选择输入sbit LCD_RW = P2^5; //液晶读/写控制sbit LCD_EN = P2^7; //液晶使能控制sbit LCD_PSB = P3^2; //串/并方式控制sbit LCD_RST = P3^7; //液晶复位端口#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};/*********************************************************/uchar code DIS1[] = {"Vpp:"};uchar code DIS2[] = {"F:"};uchar DIS3[] = {"5V"};uchar DIS4[] = {"12Hz"};uchar D1[]={"0123456789"};/*********************************************************///正弦波代码uchar code tab[]={126,100,80,70,65,62,65,70,80,100,126,152,172,182,187,190,187,182,172,152};//背景图片uchar code Photo1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00};/****************************************************************************** //*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay(int ms){while(ms--){uchar i;for(i=0;i<150;i++){_nop_();_nop_();_nop_();_nop_();}}}/*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay1(int ms){while(ms--){uchar y;for(y=0;y<100;y++) ;}}/*******************************************************************//* *//*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。