LCD12864液晶显示的设计
- 格式:doc
- 大小:552.00 KB
- 文档页数:20
实验三 LCD12864液晶显示参赛序号实验题目LCD12864液晶显示实验成组员左虎博杨颂王志鹏指导教师赵勇报告日期2014年7月16日-2014年7月18日摘要:本设计以超低功耗MSP430单片机为微控制器,以4位/8位并行,2线或3线串行多种接口方式的LCD12864为输出显示器。
通过对MSP430单片机进行编程,在LCD12864上显示8×4行16×16点阵的汉字。
关键字:MSP430 LCD12864目录一.方案论证 (4)液晶显示器的论证与选择 (4)二.LCD12864的工作原理 (4)1.引脚功能说明 (4)LCD12864采用20接口,各引脚接口说明如表3所示: (4)2. 指令说明 (5)三.实验框图和电路图 (7)1. 系统框图 (7)2. 电路原理图 (7)四.实验程序设计 (7)五.系统测试 (11)1. 测试方案 (11)2. 测试结果 (11)3. 测试分析与结论 (12)一.方案论证液晶显示器的论证与选择方案一:采用带中文字库的LCD12864。
LCD12864具有4 位/8 位并行、2 线或3 线串行多种接口方式,可以显示8×4 行16×16 点阵的汉字。
也可完成图形显示。
低电压低功耗是其一显著特点。
方案二:采用LCD1602。
LCD1602显示内容为16X2,即可以显示两行,每行16个字符液晶模块,只能显示字符和数字。
通过论证可知LCD12864显示内容多,功能多,低电压低功耗,因此选用方案一。
二.LCD12864的工作原理1.引脚功能说明LCD12864采用20接口,各引脚接口说明如表1所示:表1 引脚说明表管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对比度(亮度)调整4 RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据RS=“L”,表示DB7——DB0为显示指令数据5 R/W(SID)H/LR/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线表1 引脚说明表注释1:如在实际应用中仅使用串口通讯模式,可将PSB 接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。
基于LCD12864显示器的数字示波器设计图2 LCD点阵分布结构图此LCD 屏由水平128 列,垂直64 行组成。
水平128 列分左右各64 列两个半屏构成。
垂直64 行又分8 页,每页8 行(1 列8 点刚好1 字节)。
程序每次对LCD 的绘图操作就是以最小单位1 字节举行操作的。
理解这点至关重要。
也就是每次只能针对8 点举行操作,而不是1 点举行操作。
左右屏由单独地址线控制(前面的接口定义就是分左右屏定义的)。
实际打点只需往指定“位置”写入数据,“1”亮,“0”暗。
LCD 驱动忙检测函数void loop_lcd12864_is_busy(unsigned char right)。
void loop_lcd12864_is_busy(unsigned char right){unsigned char tmp,counter=0;do { if(right) tmp = LCD_RCR;else tmp = LCD_LCR;if(counter++>50) break; // 超时跳出}while ((tmp|0x7f)==0xff); //bit7 为1 则表示LCD 内部执行指令,处于“忙”状态}对LCD 举行读写操作时,需要举行“忙”检测,LCD 内部也是由控制器来完成一系列刷屏操作的,执行各种操作都是需要一定的时光,也就是说不是任何时候外部控制器都可以对LCD 发操作命令的,惟独LCD为空闲状态时才可以操作,忙检测就是循环读取LCD状态标记位,推断是否空闲,关于指令的详情请参考数据手册。
指令写入函数void lcd_cmd_wr(unsigned char cmd,right)。
void lcd_cmd_wr(unsigned char cmd, right)第1页共4页。
电子信息学院实验报告书课程名:"微机原理与接口技术"题目: 128×64LCD液晶显示设计实验类别【综合】班级:学号:姓名:一.概述21.1设计背景21.2课程设计的目的和意义 (2)1.3课程设计的容 (2)二.课程设计的步骤与方法 (3)2.1系统硬件设计32.11控制模块32.12 显示模块32.13电源模块52.2系统软件设计62.21系统流程图62.22系统时序图72.3系统调试7三.设计结论7四.收获与体会7参考文献:8附录一:程序清单8附录二:实验仪器16一.概述1.1设计背景液晶作为一种显示器件,以其特有的优势正广泛应用于仪器、仪表、电子设备等低功耗产品中。
以往的测控仪器的显示局部大都采用LED式液晶显示屏进展参数设定和结果显示,其显示信息量少、形式单一、人机交互性差、操作人员要求较高。
而液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示方式无法比较的优点,不仅可以显示数字、字符,还可以显示各种图形、曲线、及汉字,并且可实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能;人机界面更加友好,使用操作也更加灵活、方便,使其日益成为智能仪器仪表和测试设备的首选显示器件。
1.2课程设计的目的和意义〔1〕了解点阵式液晶显示器工作原理和显示方法。
〔2〕掌握8088微机系统与液晶显示器之间接口设计与编程。
1.3课程设计的容利用取模软件建立标准字库,编制程序,在液晶显示器上显示汉字。
二.课程设计的步骤与方法采用已有的DJ-598K三合一单片机微机试验仪作为设计平台来构建系统,以减少设计工作量。
2.1系统硬件设计2.11控制模块硬件构造应结合软件方案一并考虑,做到软件、硬件功能相匹配。
在DJ-598K三合一单片机微机试验仪上,硬件设计参考方案如下:2.12 显示模块图2.12显示模块的原理图LCM12864ZK中文图形液晶显示模块的液晶屏幕为128×64 ,可显示四行,每行显示8 个汉字。
液晶显示实验一实验要求所有程序必须由verilog语言编写,同时需要通过按键切换屏幕显示文字,一页全是英文,一页全是中文。
我的文字是我的的课程、班级、学号和姓名。
二实验原理1.12864简介12864系列中文图形液晶模块的特性主要由其控制器决定。
控制器同时作为控制器和驱动器,它可提供33 路com 输出和64 路seg 输出。
在驱动器的配合下,最多可以驱动256×32 点阵液晶。
其汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
LCD类型为STN与MCU接口为8位或4位并行/3位串行可实现光标显示、画面移位、自定义字符、睡眠模式等多种软件功能。
其原理简图为:引脚号引脚名称方向功能说明1 VSS - 模块的电源地2 VDD - 模块的电源正端3 V0 - LCD驱动电压输入端4 RS(CS) H/L 并行的指令/数据选择信号;串行的片选信号5 R/W(SID) H/L 并行的读写选择信号;串行的数据口6 E(CLK) H/L 并行的使能信号;串行的同步时钟7 DB0 H/L 数据08 DB1 H/L 数据19 DB2 H/L 数据210 DB3 H/L 数据311 DB4 H/L 数据412 DB5 H/L 数据513 DB6 H/L 数据614 DB7 H/L 数据715 PSB H/L 并/串行接口选择:H-并行;L-串行16 NC 空脚17 /RET H/L 复位低电平有效18 NC 空脚19 LED_A - 背光源正极(LED+5V)20 LED_K - 背光源负极(LED-OV)2.12864工作时序原理图8位并行连接时序图,分为MPU写资料到模块与MPU从模块读出资料MPU写资料到模块MPU从模块读出资料串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T=25℃VDD=4.5V)三实验流程图及管脚分配初始化流程:流程简易图:管教分配图:四实验程序主要程序:module lcd_test( clk, key,rs,rw,en,psb,reset,sel,dat);input clk;input key;output rs;output rw;output en;output psb;output reset;output [7:0] dat;output [2:0] sel;wire [127:0] row1_val="xx:xxx ";wire [127:0] row2_val="xx:xxxxxxxxxx ";wire [127:0] row3_val=" xxxxxx ";wire [127:0] row4_val="xx:xxxxxxxx ";wire [127:0] row5_val="xxxx:xxxxxxxxxxx";wire [127:0] row6_val="NUMB:xxxxxxxxxx";wire [127:0] row7_val=" EDA ";wire [127:0] row8_val="CLASS :20090823";wire [127:0] row1;wire [127:0] row2;wire [127:0] row3;wire [127:0] row4;assign sel=3'b110;assign psb = 1;assign reset = 1;assign row1=(key==1'b1)?(row1_val):(row5_val);assign row2=(key==1'b1)?(row2_val):(row6_val);assign row3=(key==1'b1)?(row3_val):(row7_val);assign row4=(key==1'b1)?(row4_val):(row8_val);//assign row1=row5_val;xian(.clk(clk),.rs(rs),.rw(rw),.en(en),.dat(dat),.row1_val(row1),.row2_val(row2),.row3_val(row3),.row4_val(row4),.key(key));Endmodule显示部分程序:xian(clk, rs, rw, en,dat,row1_val,row2_val,row3_val,row4_val,key);input clk;input [127:0] row1_val;input [127:0] row2_val;input [127:0] row3_val;input [127:0] row4_val;input key;output [7:0] dat;output rs,rw,en;reg e;reg [7:0] dat;reg rs;reg [23:0] counter;reg [6:0] current,next;reg clkr;reg [1:0] cnt;parameter set0=8'h0; //定义了很多状态机parameter set1=8'h1;parameter set2=8'h2;parameter set3=8'h3;parameter set4=8'h4;parameter set5=8'h5;parameter set6=8'h6;parameter dat0=8'h7; parameter dat1=8'h8; parameter dat2=8'h9; parameter dat3=8'hA; parameter dat4=8'hB; parameter dat5=8'hC; parameter dat6=8'hD; parameter dat7=8'hE; parameter dat8=8'hF; parameter dat9=8'h10;parameter dat10=8'h12; parameter dat11=8'h13; parameter dat12=8'h14; parameter dat13=8'h15; parameter dat14=8'h16; parameter dat15=8'h17; parameter dat16=8'h18; parameter dat17=8'h19; parameter dat18=8'h1A; parameter dat19=8'h1B; parameter dat20=8'h1C; parameter dat21=8'h1D; parameter dat22=8'h1E; parameter dat23=8'h1F; parameter dat24=8'h20; parameter dat25=8'h21; parameter dat26=8'h22; parameter dat27=8'h23; parameter dat28=8'h24; parameter dat29=8'h25; parameter dat30=8'h26; parameter dat31=8'h27; parameter dat32=8'h28; parameter dat33=8'h29; parameter dat34=8'h2A; parameter dat35=8'h2B; parameter dat36=8'h2C; parameter dat37=8'h2E; parameter dat38=8'h2F; parameter dat39=8'h30; parameter dat40=8'h31; parameter dat41=8'h32;parameter dat42=8'h33;parameter dat43=8'h34;parameter dat44=8'h35;parameter dat45=8'h36;parameter dat46=8'h37;parameter dat47=8'h38;parameter dat48=8'h39;parameter dat49=8'h40;parameter dat50=8'h41;parameter dat51=8'h42;parameter dat52=8'h43;parameter dat53=8'h44;parameter dat54=8'h45;parameter dat55=8'h46;parameter dat56=8'h47;parameter dat57=8'h48;parameter dat58=8'h49;parameter dat59=8'h50;parameter dat60=8'h51;parameter dat61=8'h52;parameter dat62=8'h53;parameter dat63=8'h54;//parameter dat64=8'h54;parameter nul=8'h55;always @(posedge clk) //da de shi zhong pinlvbegincounter=counter+1'b1;if(counter==2499999)begincounter<=0;clkr=~clkr;endendalways @(posedge clkr)begincurrent=next;case(current)set0: begin rs<=0; dat<=8'h30; next<=set1; end // LCD的初始化set1: begin rs<=0; dat<=8'h0c; next<=set2; endset2: begin rs<=0; dat<=8'h6; next<=set3; endset3: begin rs<=0; dat<=8'h1; next<=dat0; enddat0: begin rs<=1; dat<=row1_val[127:120]; next<=dat1; end //显示第一行dat1: begin rs<=1; dat<=row1_val[119:112]; next<=dat2; enddat2: begin rs<=1; dat<=row1_val[111:104]; next<=dat3; enddat3: begin rs<=1; dat<=row1_val[103:96];next<=dat4; enddat4: begin rs<=1; dat<=row1_val[95:88]; next<=dat5; enddat5: begin rs<=1; dat<=row1_val[87:80]; next<=dat6; enddat6: begin rs<=1; dat<=row1_val[79:72]; next<=dat7; enddat7: begin rs<=1; dat<=row1_val[71:64];next<=dat8; enddat8: begin rs<=1; dat<=row1_val[63:56]; next<=dat9; enddat9: begin rs<=1; dat<=row1_val[55:48];next<= dat10 ; enddat10: begin rs<=1; dat<=row1_val[47:40]; next<=dat11; enddat11: begin rs<=1; dat<=row1_val[39:32]; next<=dat12; enddat12: begin rs<=1; dat<=row1_val[31:24]; next<=dat13; enddat13: begin rs<=1; dat<=row1_val[23:16]; next<=dat14; enddat14: begin rs<=1; dat<=row1_val[15:8]; next<=dat15; enddat15: begin rs<=1; dat<=row1_val[7:0];next<=set4; endset4: begin rs<=0; dat<=8'h90; next<=dat16; end //显示第二行90是第二行的起始显示地址dat16: begin rs<=1; dat<=row2_val[127:120]; next<=dat17; enddat17: begin rs<=1; dat<=row2_val[119:112]; next<=dat18; enddat18: begin rs<=1; dat<=row2_val[111:104]; next<=dat19; enddat19: begin rs<=1; dat<=row2_val[103:96]; next<=dat20; enddat20: begin rs<=1; dat<=row2_val[95:88]; next<=dat21; enddat21: begin rs<=1; dat<=row2_val[87:80]; next<=dat22; enddat22: begin rs<=1; dat<=row2_val[79:72]; next<=dat23; enddat23: begin rs<=1; dat<=row2_val[71:64]; next<=dat24; enddat24: begin rs<=1; dat<=row2_val[63:56]; next<=dat25; enddat25: begin rs<=1; dat<=row2_val[55:48]; next<=dat26; enddat26: begin rs<=1; dat<=row2_val[47:40]; next<=dat27; enddat27: begin rs<=1; dat<=row2_val[39:32]; next<=dat28; enddat28: begin rs<=1; dat<=row2_val[31:24]; next<=dat29; enddat29: begin rs<=1; dat<=row2_val[23:16]; next<=dat30; enddat30: begin rs<=1; dat<=row2_val[15:8]; next<=dat31; enddat31: begin rs<=1; dat<=row2_val[7:0]; next<=set5; endset5: begin rs<=0; dat<=8'h88; next<=dat32; end //显示第三行88是第三行的起始显示地址dat32: begin rs<=1; dat<=row3_val[127:120]; next<=dat33 ; enddat33: begin rs<=1; dat<=row3_val[119:112]; next<=dat34; enddat34: begin rs<=1; dat<=row3_val[111:104]; next<=dat35; enddat35: begin rs<=1; dat<=row3_val[103:96]; next<=dat36; enddat36: begin rs<=1; dat<=row3_val[95:88]; next<=dat37; enddat37: begin rs<=1; dat<=row3_val[87:80]; next<=dat38; enddat38: begin rs<=1; dat<=row3_val[79:72]; next<=dat39; enddat39: begin rs<=1; dat<=row3_val[71:64]; next<=dat40; enddat40: begin rs<=1; dat<=row3_val[63:56]; next<=dat41; enddat41: begin rs<=1; dat<=row3_val[55:48]; next<=dat42; enddat42: begin rs<=1; dat<=row3_val[47:40]; next<=dat43; enddat43: begin rs<=1; dat<=row3_val[39:32]; next<=dat44; enddat44: begin rs<=1; dat<=row3_val[31:24]; next<=dat45; enddat45: begin rs<=1; dat<=row3_val[23:16]; next<=dat46; enddat46: begin rs<=1; dat<=row3_val[15:8]; next<=dat47; enddat47: begin rs<=1; dat<=row3_val[7:0]; next<=set6; endset6: begin rs<=0; dat<=8'h98; next<=dat48; end //显示第四行dat48: begin rs<=1; dat<=row4_val[127:120]; next<=dat49 ; enddat49: begin rs<=1; dat<=row4_val[119:112]; next<=dat50; enddat50: begin rs<=1; dat<=row4_val[111:104]; next<=dat51; enddat51: begin rs<=1; dat<=row4_val[103:96]; next<=dat52; enddat52: begin rs<=1; dat<=row4_val[95:88]; next<=dat53; enddat53: begin rs<=1; dat<=row4_val[87:80]; next<=dat54; enddat54: begin rs<=1; dat<=row4_val[79:72]; next<=dat55; enddat55: begin rs<=1; dat<=row4_val[71:64]; next<=dat56; enddat56: begin rs<=1; dat<=row4_val[63:56]; next<=dat57; enddat57: begin rs<=1; dat<=row4_val[55:48]; next<=dat58; enddat58: begin rs<=1; dat<=row4_val[47:40]; next<=dat59; enddat59: begin rs<=1; dat<=row4_val[39:32]; next<=dat60; enddat60: begin rs<=1; dat<=row4_val[31:24]; next<=dat61; enddat61: begin rs<=1; dat<=row4_val[23:16]; next<=dat62; enddat62: begin rs<=1; dat<=row4_val[15:8]; next<=dat63; enddat63: begin rs<=1; dat<=row4_val[7:0]; next<=nul; endnul: begin rs<=0; dat<=8'h00; // 把液晶的E 脚拉高if(key==1'h0)begine<=0;next<=set0;endelsebegin next<=nul; e<=1;endenddefault: next=set0;endcaseendassign en=clkr|e;assign rw=0;endmodule五实验结果满足实验要求,液晶进行扫描屏幕显示中英文转换。
lcd12864的显示原理
LCD12864是一种基于液晶技术的显示器件,具有128x64个像素点的显示区域。
它采用液晶分子在电场作用下改变排列方式从而实现显示的原理。
LCD12864由若干个液晶单元组成,每个液晶单元由两片平行的电极层之间夹着的液晶分子组成。
在电场作用下,液晶分子会改变排列方式,从而使光的传播方式发生改变。
在LCD12864的背光光源照射下,背光光束通过液晶单元后,会受到液晶分子排列的影响,进而改变光束的方向和光强度。
LCD12864的液晶分子排列方式分为两种:平行排列和垂直排列。
当平行排列的液晶分子受到电场作用时,光束可以通过液晶单元,这时显示区域会出现明亮;而当垂直排列的液晶分子受到电场作用时,光束无法通过液晶单元,这时显示区域会出现暗淡。
通过在液晶单元两侧施加不同的电压,可以控制液晶分子的排列方式。
通过在液晶单元上加上适当的驱动电压,LCD12864可以实现对每个像素点的控制,从而显示出各种图像和文字。
为了控制LCD12864的显示,需要使用专门的驱动电路和微控制器。
通过驱动电路的控制,可以向LCD12864发送相应的电压信号,从而控制液晶分子的排列方式,实现显示的效果。
总结来说,LCD12864的显示原理利用液晶分子在电场作用下
改变排列方式来实现光的传播和屏幕显示,通过驱动电路和控制器来控制电压信号,从而控制液晶分子的排列方式,实现显示区域的明暗变化,从而显示出图像和文字。
LCD12864系列点阵型液晶显示模块使用说明书一、OCM12864液晶显示模块概述1.OCM12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。
采用KS0107控制IC。
2.外观尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)78×70×10mm(ocm12864-3),3.视域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),64×44mm(ocm12864-3)4.重量:大约g补充说明:外观尺寸可根据用户的要求进展适度调整。
二、最大工作X围1、逻辑工作电压(Vcc):4.5~5.5V2、电源地(GND):0V3、LCD驱动电压(Vee):0~-10V4、输入电压:Vee~Vdd5、工作温度(Ta):0~55℃(常温) / -20~70℃〔宽温〕6、保存温度(Tstg):-10~65℃三、电气特性(测试条件Ta=25,Vdd=5.0+/-0.25V)1、输入高电平(Vih):3.5Vmin2、输入低电平(Vil):0.55Vmax3、输出高电平(Voh):3.75VminH H D7 D6 D5 D4 D3 D2 D1 D0功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。
从DD RAM读数据前要先执行“设置页地址〞及“设置列地址〞命令。
六、接口时序1.写操作时序时序11.读操作时序时序2时序参数表:名称符号最小值典型值最大值单位E周期时间Tcyc 1000 nsE高电平宽度Pweh 450 nsE低电平宽度Pwel 450 nsX=7Line60 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB4 Line61 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB5 Line62 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB6 Line631/0 1/0 1/0 1/0…………1/0 1/0 1/0 DB7八、测试硬件电路九、读写模块程序举例● 写指令子程序〔INST 〕 SETB E CLR D _I CLR R _W MOV P1, A CLR E RET● 写数据子程序〔DATA 〕 SETB E SETB D_I CLR R _W MOV P1, A CLR E RET● 写一页显示RAM 数据〔假设指令子程序为INST ,数据子程序为DATA 〕VEE ’V0第三脚VEE 第18脚可调10K〔三极管内置〕MOV A, #0B8HLCALL INST ;置页地址为0页MOV A, #40HLCALL INST ;置列地址为0列MOV R2,#40HMOV R1,#00HMOV DPTR,#ADDRLOOP:MOV A, R1MOVC A, A+DPTRLCALL DATAINC R1DJNZ R2, LOOP带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
本文介绍了图形液晶显示器MGLS12864与单片机W78E58的硬件设计和软件设计技术。
同时给出了ASCII码8×16字库、汉字16×16字库建立的程序及在液晶上显示数字、字符和汉字的程序。
引言液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。
LCD可分为段位式LCD、字符式LCD和点阵式LCD。
其中,段位式LCD和字符式LCD只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动,动画功能,分区开窗口,反转,闪烁等功能,用途十分广泛。
本文介绍了点阵式液晶显示器MGLS12864与单片机的接口及编程的方法,同时介绍了创建8×16字符和16×16点阵汉字的方法,及常用的字符显示和汉字显示程序。
硬件设计这里着重介绍液晶显示器与单片机的接口技术。
有关MGLS12864图形液晶引脚功能及控制器HD61202的接口时序波形,可查看图形液晶显示器产品有关手册。
单片机可以通过数据总线与控制信号直接采用存储器访问形式、I/O设备访问形式控制该液晶显示模块。
本文以华邦公司的W78E58为例,它是51系列单片机兼容的微控制器,其内部有32KB的FLASH EEPROM,用户编制的程序及需要显示的英文字母、数字、汉字、曲线和图形都可以存储在里面,免去了扩展外部存储器的麻烦,使得以W78E58单片机为核心的控制系统电路更简单。
因此十分适用于液晶显示。
MGLS12864与W78E58单片机接口电路如图1所示。
该图采用直接访问方式,单片机通过低位地址A2控制CSA;A3控制CSB,以选通液晶显示屏上各区的控制器HD61202;同时W78E58用地址A1作为R/W信号控制数据总线的数据流向;用地址A0作为D/I 信号控制寄存器的选择;E信号由W78E58的读信号/RD和写信号/WR合成产生;另外单片机的复位脚(9脚)经反相器后连接到液晶显示器复位脚(17脚 /RST),当单片机上电复位或手动复位时, 液晶显示器同时也复位;从而实现了W78E58对内置HD61202图形液晶显示器模块的电路连接。
LCD12864详细设计方案1.LCD12864简介:FYD12864-0402B 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个16*16 点汉字,和128 个16*8点ASCII 字符集。
利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4 行16×16 点阵的汉字。
也可完成图形显示。
低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
2.LCD12864规格:基本特性:低电源电压(VDD:+3.0--+5.5V)显示分辨率:128×64点内置汉字字库,提供8192个16×16 点阵汉字(简繁体可选)内置 128 个16×8点阵字符2MHZ 时钟频率显示方式:STN、半透、正显驱动方式:1/32DUTY,1/5BIAS视角方向:6 点背光方式:侧部高亮白色LED,功耗仅为普通LED 的1/5—1/10通讯方式:串行、并口可选内置DC-DC 转换电路,无需外加负压无需片选信号,简化软件设计工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃12864主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。
注意:1、3脚和18脚之间可以通过电阻阻值大小调节液晶的对比度,本开发板默认使用4.7K阻值大小,如果4.7K和您的液晶显示不匹配,用户可以自己选择合适的阻值焊接上去即可。
2、RW为读写指示。
3、15脚需要接1,因为本开发板使用并行数据方式。
5.寄存器介绍在使用12864LCD前先必须了解以下功能器件才能进行编程。
12864内部功能器件及相关功能如下:1. 指令寄存器(IR)IR是用于寄存指令码,与数据寄存器数据相对应。
电子技术课程设计报告书课题名称 LCD12864液晶显示的设计姓 名学 号院、系、部 物理与电信工程系 专 业 电子信息工程指导教师2012年 06月 20日※※※※※※※※※ ※※ ※※ ※※ ※※※※※※※※※2009级电子信息工程单片机课程设计LCD12864液晶显示的设计1 设计目的(1)熟悉模拟电路的应用与集成电路的引脚排列。
(2)掌握单片机芯片80C5X系列的逻辑功能及使用方法。
(3)熟悉电路仿真软件Proteus的使用。
(4)了解点阵型LCD12864(不带字库)的组成及工作原理。
(5)熟悉KEIL软件的编程,加强C语言的能力。
2 设计思路(1)设计单片机最小系统电路。
(2)设计LCD12864液晶外围电路。
(3)设计LCD12864液晶与单片机的组成电路。
3 设计过程3.1方案论证图3.1.1 单片机与LCD液晶的工作原理框由于要实现点阵液晶的绘图等功能,而且对于51系列的单片机片内RAM 都不大,要实现读操作的话只能使用可以并行方式的液晶,(只有并行方式可读)因为如果不使用并行方式而采用在51系列单片机内部开辟一片128*64大小的缓存用于对液晶的刷新从而实现读的功能显然不现实。
本设计选用的12864是AMPIRE128X64,它的控制器是KS0138,采用并行方式与单片机通信。
对于单片机的选用,采用程序存储空间较大的STC89C58,它有32K的flash,对于实现简单的GUI设计足够。
图1是单片机与LCD液晶以及外围电路的总体框图。
3.2电路设计图3.2.1 单片机最小系统电路如图2所示,单片机的最小系统有复位电路和振荡电路组成,复位电路采用上电复位,振荡电路采用的内部方式,在XTAL1和XTAL2端外界石英晶体作定时元件,内部反相放大器自激振荡,产生时钟。
P0口出外接4.7K上拉电阻,因为P0口是漏极开路,必须要接上拉才能输出高电平。
5V直流稳压电源电路如图3所示,该电路由电源变压器、整流桥堆、滤波电容C6、C7、三端稳压集成电路LM7805、限流电阻器和电源指示发光二极管组成。
工作原理及过程:当接通电源,交流220V电压经变压器降压,整流桥堆整流,C6滤波及C7稳压,经三端稳压集成电路LM7805后,产生5V直流电压,作为单片机和LCD12864液晶的工作电源。
经限流电阻限流降压后将发光二极管点亮。
图3.2.2 5直流稳压电源电路12864液晶外围电路如图4所示,工作原理及过程: R/W E D/I分别为读写控制,使能控制,和命令数据选择控制端口,将这三个管脚分别连接到单片机,从而实现单片机对LCD12864的控制,并口数据D0-D7连接到单片机的P0口,实现相互通信。
图4 12864外围电路图3.2.3 电路总图电路总图连接如图5所示。
所有的管脚通过标好建立电气连接,由图可以看出LCD12864与单片机的数据通信是利用单片机的P0口,控制线连接到了单片机的P2口的前5个管脚,单片机通过这5个管脚与LCD12864通信,实现对LCD12864的控制。
4系统调试与仿真结果(1)按照图5在Proteus里连接电路。
(2)仿真结果①开机动画出现MCU51,然后画一个表框,然后依次画出正方形,圆形,矩形,三角形,和多边形,如图4-1所示。
接着对正方形和矩形进行填充,如图4-2所示。
接着对表框较小的进行填充,然后对表框较大的进行填充。
然后清屏,显示出“课程设计:简单GUI的设计”,如图4-3所示。
接着显示出一幅图片,然后图片左边部分上下滚动,然后右边部分上下滚动,最后整个屏幕一起滚动,如图4-4。
然后黑屏,简单GUI显示完成。
图4.1截图图4.2截图图4.3截图图4.4截图5主要仪器与设备仿真软件 Proteus 7.6集成电路 LM7805—1片电阻 100—2只,1.06K—2只,1k—l只,2k—4只,2.7k—3只,4.7KΩ排阻—1只,4.77kΩ—2只,39kΩ—l只。
可调电位器 2KΩ—1只,电容10nF—1只,100nF—2只,470nF—1只,510nF—1只,100 uF—1只,1mF—1只,。
其它发光二极管—1只, 12V直流电压源各一个,整流桥堆Ω—1只6设计体会与建议6.1设计体会通过这次对LCD液晶简单GUI的设计与制作,让我了解了设计电路的程序,也让我了解了关于LCD12864的基本原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。
但是最后的成品却不一定与仿真时完全一样,因为,在实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。
所以,在设计时尽可能应考虑两者的差异,从中找出最适合的设计方法。
此外,仿真时应注意相同元件的不同型号,往往存在差异性。
通过这次学习,让我对各种电路都有了大概的了解,所以说,心动不如行动,对于这些电路还是应该自己动手实际操作才会有深刻理解。
6.2对设计的建议我希望老师在我们动手制作之前应先告诉我们一些关于所做电路的参考资料、原理,以及如何检测电路的方法,提供一两天答疑的时间。
这样会有助于我们进一步的进入状态,完成设计。
参考文献[1] 梁明理邓人清等. 电子线路. 北京:高等教育出版社,2000年[2] 马忠梅籍顺心等编. 单片机的的C语言应用程序设计北京:北京航空航天大学出版社出版社,2001.1[3]张俊谟.单片机中级教程原理与应用[M].北京:北京航空航天大学出版社.2006:66-67[4]Carla Dente. Proteus技术应用. Ashgate Publishing, Limited 2005 年6月出版附件:源程序的描述:程序采用模块化编程,这样显得更加明了,而且便于移植和调试,部分源程序如下:#include "ku.h"#include "lcd12864.h"U8 min,max;extern unsigned char code ascii58[];U8 code XY[][2]={{ 103 ,20 },{ 103 ,50 },{ 123 ,50 },{ 113 ,40 },{ 110 ,35 },{ 103 ,20 }};void Delay_ms(U16 x){U16 i,j;for(i=x;i>0;i--)for(j=120;j>0;j--);}void Write_Command(U8 com){// check_busy(); //用了读不出来RS_COM;RW_W;lcd_data=com;lcden_strobe;}void Write_Date(U8 date){// check_busy();RS_DATA;RW_W;lcd_data=date;lcden_strobe;}U8 Rdata(void){U8 rdata;RS_DATA;RW_R;lcd_data=0xff; lcden=1;_nop_();rdata=lcd_data;lcden=0;lcd_data=0xff;lcden=1;_nop_();rdata=lcd_data;lcden=0;return rdata;}void Choice_RL(U8 a){switch(a){case 0:s1=0;s2=0;break;case 1:s1=0;s2=1;break;case 2:s1=1;s2=0;break;default:break;}}void Set_Write_Addr(U8 x,U8 y){Write_Command(page+x);Write_Command(lined+y);}void Clear_lcd(void){U8 i,j;for(i=0;i<8;i++){Choice_RL(1);for(j=0;j<64;j++){Set_Write_Addr(i,j);Write_Date(0);}Choice_RL(2);for(j=0;j<64;j++){Set_Write_Addr(i,j);Write_Date(0);} }Choice_RL(0);}void Black_lcd(void){U8 i,j;for(i=0;i<8;i++){Choice_RL(1);for(j=0;j<64;j++){Set_Write_Addr(i,j);Write_Date(0xff);} Choice_RL(2);for(j=0;j<64;j++){Set_Write_Addr(i,j);Write_Date(0xff);} }}void W_Ascii(U8 date){U8 i;RS_DATA;RW_W;date=(date-0x20)*5;for(i=0;i<5;i++)Write_Date(ascii58[date+i]);Write_Date(0);}void W_Str(U8 x,U8 y,U8 *ff){U8 i;RW_W;RS_DATA;Write_Command(page+x);Write_Command(lined+y);while(ff[i]!='\0'){W_Ascii(ff[i++]);}}void W_dot(U8 x,U8 y) //X横坐标,Y纵坐标{U8 pag,ybit,dat;if(x<64)Choice_RL(1);else{Choice_RL(2);x=x-64;}pag=y>>3;ybit=y&0x07;Write_Command(page+pag);Write_Command(lined+x);dat=Rdata();Write_Command(lined+x);Write_Date((1<<ybit)|dat);}void Draw_Any_Line( U8 StartX, U8 StartY, U8 EndX, U8 EndY) //从任意点到任意点的直线{int t, distance; /*根据屏幕大小改变变量类型(如改为int型)*/int x = 0 , y = 0 , delta_x, delta_y ;int incx, incy ;delta_x = EndX - StartX ;delta_y = EndY - StartY ;if( delta_x > 0 ){incx = 1;}else if( delta_x == 0 ){Draw_Columeline(StartY, EndY, StartX ) ;return ;}else{incx = -1 ;}if( delta_y > 0 ){incy = 1 ;}else if(delta_y == 0 ){Draw_Line( StartX, EndX, StartY ) ;return ;}else{incy = -1 ;}delta_x = incx*delta_x ;delta_y = incy*delta_y ;if( delta_x >=delta_y ){distance = delta_x ;}else{distance = delta_y ;}W_dot( StartX, StartY) ;/* Draw Line*/for( t = 0 ; t <= distance+1 ; t++ ){W_dot( StartX, StartY ) ;x += delta_x ;y += delta_y ;if( x > distance ){x -= distance ;StartX += incx ;}if( y > distance ){y -= distance ;StartY += incy ;}}}void Draw_Columeline(U8 y1,U8 y2,U8 x1) // y1 y2 表示从哪里到哪里X1表示横坐标{U8 i; //因为读函数还有问题,所有影响到纵向打点for(i=y1;i<y2+1;i++)W_dot(x1,i);}void Draw_Line(U8 x1,U8 x2,U8 y) //X1 X2 表示从哪里到哪里Y表示纵坐标{U8 i; //通过打点函数来划线for(i=x1;i<x2+1;i++)W_dot(i,y);}void draw_map(U8 x,U8 y, U8 *aa){U8 pag,i,j;pag=(y-1)>>3;if(x<=64){Choice_RL(1);for(i=0;i<pag;i++){Set_Write_Addr(i,0);for(j=0;j<x;j++)Write_Date(aa[j+i*x]);}}if(x>64){Choice_RL(1);for(i=0;i<pag;i++){Set_Write_Addr(i,0);for(j=0;j<x;j++)Write_Date(aa[j+i*x]);}Choice_RL(2);for(i=0;i<pag;i++){Set_Write_Addr(i,0);for(j=0;j<x-64;j++)Write_Date(aa[j+i*x+64]);}}}void LCD12864_Init(void){Write_Command(0x3f);Write_Command(page);Write_Command(lined);Write_Command(row);Choice_RL(0);}void plotC(int x,int y,int xc,int yc) {W_dot(xc+x,yc+y);W_dot(xc+x,yc-y);W_dot(xc-x,yc+y);W_dot(xc-x,yc-y);W_dot(xc+y,yc+x);W_dot(xc+y,yc-x);W_dot(xc-y,yc+x);W_dot(xc-y,yc-x);}void GUI_Circle(int xc,int yc,int r) {int x,y,d;y = r;d = 3 - (r + r);x = 0;while(x <= y){plotC(x,y,xc,yc);if(d < 0)d += (x + x + x + x) + 6;else{d+=((x - y) + (x - y) + (x - y) + (x - y)) + 10;y = y - 1;}x = x + 1;}}void GUI_Triangle(U8 x0, U8 y0, U8 x1, U8 y1, U8 x2, U8 y2) {Draw_Any_Line(x0,y0,x1,y1);Draw_Any_Line(x1,y1,x2,y2);Draw_Any_Line(x2,y2,x0,y0);}/*void compare_3(U8 x0, U8 x1, U8 x2){if(x0==x1==x2){min=max=x0;}else if(x0==x1){if(x0<x2) {min=x0;max=x2;}else {min=x2;max=x0;}}else if(x1==x2){if(x1<x0) {min=x0;max=x0;}else {min=x0;max=x0;}}else if(x0==x2){if(x0<x1) {min=x0;max=x1;}else {min=x1;max=x0;}}else{if(x0>x1){if(x0>x2){max=x0;if(x1>x2)min=x2;elsemin=x1;}else{max=x2;min=x1;}}else{if(x1>x2){max=x1;if(x0>x2)min=x2;elsemin=x0;}else{max=x2;min=x0;}}}} *//* void GUI_TriangleFill(U8 x0, U8 y0, U8 x1, U8 y1, U8 x2, U8 y2) {U8 xmin,xmax,ymin,ymax,y,i=0;compare_3(x0,x1,x2);xmin=min;xmax=max;compare_3(y0,y1,y2);ymin=min;ymax=max;for(y=ymax;y>=ymin;y--,i++){Draw_Line(xmin+i,xmax-i,y);}} */void GUI_Polygon(U8 N ,U8 (*ap)[2]){U8 i,a=0,b=0,c=0,d=0;for(i=0;i<N;){a=ap[i][0];b=ap[i][1];c=ap[++i][0];d=ap[i][1];Draw_Any_Line(a,b,c,d);}}void GUI_Rectangle(U16 x0, U16 y0, U16 x1, U16 y1) {Draw_Line(x0,x1,y0 );Draw_Line(x0,x1,y1 );Draw_Columeline(y0, y1,x0 );Draw_Columeline( y0, y1,x1);}void GUI_Square(U16 x0, U16 y0, U16 length){if(length==0) return;if( (x0+length) > GUI_LCM_XMAX ) return;if( (y0+length) > GUI_LCM_YMAX ) return;GUI_Rectangle(x0, y0, x0+length, y0+length);}void GUI_Rectangle_Full(U16 x0, U16 y0, U16 x1, U16 y1) {U8 y,t;if(x0>x1){t=x0;x0=x1;x1=t;}if(y0>y1){t=y0;y0=y1;y1=t;}for(y=y0;y<y1;y++){Draw_Line(x0,x1, y );}}void Write_HanZi(U8 x,U8 y,U8 (*ap)[16]){U8 i;/* if(rl==0)Choice_RL(1);elseChoice_RL(2);*/Set_Write_Addr(x,y);for(i=0;i<16;i++)Write_Date(ap[0][i]);Set_Write_Addr(x+1,y);for(i=0;i<16;i++)Write_Date(ap[1][i]);}主函数如下:#include "lcd12864.h"extern U8 code XY[][2];extern U8 code gImage_aa[];extern U8 code HANZI[][16];extern U8 code ascii58[];void main(void){U8 t,tab11[]="51MCU";while(1){LCD12864_Init();Clear_lcd(); Choice_RL(0);W_Str(6,28,tab11);Delay_ms(1000);GUI_Rectangle(0,0,124,62);Delay_ms(300);GUI_Rectangle(5,5,119,56);Delay_ms(600);GUI_Square(8,30,20);Delay_ms(300);GUI_Circle(43,40,10);Delay_ms(300);GUI_Rectangle(58,30,66,50);Delay_ms(300);GUI_Triangle(75,50,95,50,84,29);Delay_ms(300);GUI_Polygon(5,XY);Delay_ms(1000);GUI_Rectangle_Full(8,30,28,50);Delay_ms(1000);GUI_Rectangle_Full(58,30,66,50);Delay_ms(1000);GUI_Rectangle_Full(5,5,119,56);Delay_ms(1000);GUI_Rectangle_Full(0,0,124,62);Delay_ms(1000);Clear_lcd();Choice_RL(1);Write_HanZi(2,0, HANZI[0]);Write_HanZi(2,16,HANZI[2]);Write_HanZi(2,32,HANZI[4]);Write_HanZi(2,48,HANZI[6]);Write_HanZi(4,0, HANZI[10]);Write_HanZi(4,16,HANZI[12]);Write_HanZi(4,32,HANZI[14]);Write_HanZi(4,48,HANZI[16]);Choice_RL(2);Write_HanZi(2,0, HANZI[8]);Write_HanZi(4,0, HANZI[18]);Write_HanZi(4,16,HANZI[20]);Write_HanZi(4,32,HANZI[22]);Delay_ms(2000);Choice_RL(1);draw_map(128,64,gImage_aa);Delay_ms(2000);Choice_RL(1);for(t=63;t>0;t--){Write_Command(row+t);Delay_ms(20);} Choice_RL(2);for(t=63;t>0;t--){Write_Command(row+t);Delay_ms(20);} Choice_RL(0);for(t=63;t>0;t--){Write_Command(row+t);Delay_ms(20);} Black_lcd(); Delay_ms(1000);Clear_lcd(); Delay_ms(1000);}}。