首页 朱强论文_完美版080621

朱强论文_完美版080621

举报
开通vip

朱强论文_完美版080621朱强论文_完美版080621 设计题目 LCD汉字显示控制系统的设计 学生姓名 朱 强 学 号 20042432 专业班级 计算机科学与技术04级05班 指导教师 丁贤庆老师 LCD汉字显示控制系统的设计 摘要:本论文设计了一种基于PC机(上位机)与STC89C52RC单片机(下位 机)双机控制LCD的汉字显示系统。上位机程序可以编辑显示信息并保 存到数据库中,也可以通过添加,修改,删除,保存的方式实现对数据 库中的信息进行管理。上位机程序从数据库中调出所需要显示的内容, 利用VC定时器定时将各条信...

朱强论文_完美版080621
朱强论文_完美版080621 设计题目 LCD汉字显示控制系统的设计 学生姓名 朱 强 学 号 20042432 专业班级 计算机科学与技术04级05班 指导教师 丁贤庆老师 LCD汉字显示控制系统的设计 摘要:本论文设计了一种基于PC机(上位机)与STC89C52RC单片机(下位 机)双机控制LCD的汉字显示系统。上位机程序可以编辑显示信息并保 存到数据库中,也可以通过添加,修改,删除,保存的方式实现对数据 库中的信息进行管理。上位机程序从数据库中调出所需要显示的内容, 利用VC定时器定时将各条信息通过串行通信的方式发送给下位机。此 时下位机一个字节一个字节地接收从上位机发送过来的字符串并存储到 RAM中,通过LCD驱动程序在LCD上显示该字符串(包括汉字)。本 设计中的串行通信利用了Microsoft Visual C++的MSComm控件,数据 库程序设计采用了ADO访问操作数据库技术。 关键词:LCD MS12864A-2汉字显示;串行通信;STC89C52RC单片机; SQL Server2000; VC++6.0; 2 LCD汉字显示控制系统的设计 Abstract: A LCD display system of Chinese characters controlled by PC and STC89C52RC SCM (Single-chip Microcomputer) is designed in this dissertation.The computer procedures can edit the display information and save it to the database.It can also implement the database information management by the way of "Add","Modify","Delete" and "Save".The computer procedures access the contents what need to display from the database,using VC timer to send these contents to SCM circularly from time to time by the way of serial communication.At the moment,the SCM receive the character string byte to byte from PC and finally save it to the RAM of SCM.Then,every string(including Chinese characters) will display on the LCD through LCD-driver. The design of serial communication in this paper used the MSComm control component of the Microsoft Visual C++,and the database program design used ADO technology to access the database. Keywords:LCD MS12864A-2 Chinese Display; Serial Communication; STC89C52RC Single-chip Microcomputer; SQL Server2000; VC++6.0 3 LCD汉字显示控制系统的设计 目 录 中文摘要 .................................................................................................................. 2 英文摘要 .................................................................................................................. 3第一章 引 言 ....................................................................................................... 6 第二章 开发工具及基本原理介绍 ........................................................................ 7 2.1 硬件开发工具 ............................................................................................ 7 2.1.1 STC89C52RC单片机开发板 ............................................................. 7 2.1.2 MS12864A-2 LCD显示模块 ........................................................... 10 2.2 软件开发工具 .......................................................................................... 13 2.2.1 Keil uVision2编译调试软件 ...................................................... 13 2.2.2 STC单片机ISP下载编程软件 ...................................................... 14 2.2.3 Visual C++6.0开发软件 ............................................................. 15 2.2.4 SQL Server2000数据库 ............................................................... 16 第三章 LCD汉字显示控制系统的设计 ............................................................... 17 3.1系统硬件设计 ........................................................................................... 17 3.2系统软件设计 ........................................................................................... 18 3.2.1 下位机LCD驱动程序设计 ............................................................ 18 3.2.2 下位机接受上位机数据程序设计 ................................................. 26 3.2.3 上位机数据库程序设计 ................................................................ 29 3.2.4 上位机发送数据到下位机程序设计 ............................................. 33 第四章 结论 ......................................................................................................... 36 第五章 谢辞 ......................................................................................................... 37 [参考文献] .............................................................................................................. 40 附录 ........................................................................................................................ 41 4 LCD汉字显示控制系统的设计 图片列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 目录 图2.1 STC89C52RC单片机开发板 ……………………………...…………………8 图2.2 MS12864A-2液晶显示模块 ………………………………………………...10 图2.3写资料到RAM时序图 ……………………………………………………...11 图2.4读资料到RAM时序图………………………………………………………12 图2.5 Keil uVision2开发软件 ……………………………………………………...14 图2.6 STC单片机ISP下载编程软件……………………………………………...15 图2.7基于对话框的PC51_Comm程序及VC开发软件…………………………15 图2.8 SQL Server2000 PC51_Comm数据库……………………………………….16 图3.1 STC89C52RC与MS12864A-2连接图………………………………………18 图3.2 ST7920GB中文字型码表的一部分,两字节对应一个字型码……………...20 图3.3 LCD初始化流程图…………………………………………………….……..21 图3.4下位机串行通信程序流程图…………………………………………………26 图3.5信息列表的设计………………………………………………………………29 图7.1上位机串行通信程序…………..…………………………………………..…41 图7.2显示列表信息1…………………..………………………………………..….41 图7.3显示列表信息2…………………..……………………………………..…….42 图7.4显示列表信息3…………………..…………………………………..……….42 表2.1 MS12864A-2液晶模块引脚说明….………………………………….………11 表2.2用户指令基本指令集………………………………………………….……..12 5 LCD汉字显示控制系统的设计 第一章 引 言 近年来,平板显示技术迅猛发展,STN,LCD主要应用于模块用屏,普通的电话机,游戏机,传真机,汽车显示设备,电子表和电子词典,医疗保健,健美,工业仪器仪表等行业。在电子产品设计中,人机交互显示界面是必不可少的工作,目前一般使用的液晶显示器均为七段笔划式,只能显示数字和少量字符,功能往往受到很大局限,对于较为复杂的字符或图形则无能为力。而STN,LCD智能型内藏汉字库显示模块则是一种低功耗,低损耗,低价格的显示器件,它不但可以显示各种各样的Unicode字符,汉字和图形,同时具有可编程能力,且与单片机接口方便。基于以上优点,STN,LCD显示模块得到了广泛应用。 在本《LCD汉字显示控制系统的设计》设计中,我采用了深圳美视实业发展有限公司研发生产的STN类型MS12864A-2液晶显示模块,与STN类型液晶显示模块接口兼容的单片机种类非常多,比如我们熟悉的ATMEL公司的AVR单片机,Motolora单片机,华邦单片机,Intel8051单片机等等。我采用的是51系列单片机,芯片为宏晶科技产品STC89C52RC,STC89C52RC系列单片机由于其加密性强,无法解密,超强抗干扰,抗静电,高速,高可靠,低功耗超低价而在国内得到广泛应用。更为重要的是,其支持在系统可编程,无需编程器,无需仿真器,内部Flash擦写次数可达10万次以上,因此其高性能低成本成为我这次设计的首选。 本课题设计的是LCD汉字显示系统,其所需完成的目标是在LCD上动态显示汉字或字符。在本次课题设计中,我设计了一个LCD下位机驱动程序,该驱动程序能够静态的显示我设定的汉字或字符信息。同时,我还设计了一个PC上位机程序,该程序能够通过添加,删除,修改,保存等方式对数据库中的信息进行管理。同时,PC上位机和STC89系列单片机之间通过串行通信的方式将上位机数据库中的信息发送到下位机的RAM中存储起来,并由下位机驱动程序在LCD显示屏中显示出来。由于我上位机中设置了显示消息定时循环显示方式,因此可以将需要显示的信息定时循环的在LCD上显示出来。 在本次课题中,需要解决的重点问题就是下位机LCD驱动程序的设计,上位机数据库的连接,执行和数据操作,还有上位机与下位机之间的串行通信设计。 在接下来的报告中,我将会详细讲解以上重点问题的设计过程及细节,使得读者能够对我的整体设计过程一目了然。 6 LCD汉字显示控制系统的设计 第二章 开发工具及基本原理介绍 2.1 硬件开发工具 2.1.1 STC89C52RC单片机开发板 51-3开发板如图2.1所示,主要元件有电源开关,复位按钮,8位LED发光二极管,4位共阳一体化高亮数码管,ISP下载用插座,ZIF编程插座,芯片管脚引出座,实验编程晶振,2×2行列键盘和6个独立按键,集成电路AT24Cxx和AT93C46,蜂鸣器,LCD1602插座,USB插座,RS232插座。 由于与STC89C52RC芯片对应的芯片管脚引出脚的VCC,EA,XTAL1,XTAL2四个管脚悬空,所以如果芯片管脚要和MS12864A-2显示屏的电源VCC管脚连接,则需要借助LCD1602插座 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 接口的VCC接口。另一种接法是将显示屏VCC管脚焊接在USB电源上,但该 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 相较于前者,则显得复杂和灵活性不强。 其中USB插座用作实验板USB口取电源用,ISP下载用插座主要与并行的下载线配套使用,实现对STC89系列单片机的编程,实验所采取的编程晶振为11.0592MHz,为什么会采用这个奇怪的晶振呢,而不是用平常的12MHz晶振呢,因为11.0592MHz晶振频率在误差允许范围内,波特率设置的精确度最高。 2.1.1.1 STC89C52RC芯片简介 STC89C52RC工作电压为5.5V,3.4V(5V单片机);工作频率范围0,40MHz;用户程序空间8K;片上集成512字节RAM;32个通用I/0口,复位后P1/P2/P3/P4是准双向口/弱上拉,P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/0口用时,需加上拉电阻;EEPROM 2K可扩展;看门狗;共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用;4路外部中断,下降沿中断或低电平触发中断;一个通用异步串行口UART;ISP在系统可编程无需专用编程器/仿真器。 7 LCD汉字显示控制系统的设计 图2.1 STC89C52RC单片机开发板 2.1.1.2实验涉及到的STC89C52RC芯片特殊功能寄存器介绍 1.TCON 定时器/计数器控制寄存器 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 7 6 5 4 3 2 1 0 (1)TF1(TF0):定时器T1(T0)的溢出中断申请位。定时器T1(T0)被允许计 数以后,从初值开始加1计数,当产生溢出时置TF1=1,向CPU请求 中断,到CPU响应该中断后才由硬件清0,也可由查询程序清0。 (2)IE1(IE0):外部中断IE1(IE0)请求标志位。当CPU检测到在INT1(INT0) 管脚上出现低电平或脉冲下降沿的外部中断信号时,由硬件置位 IE1(IE0) , 1,请求中断,CPU响应该中断并运行中断服务程序后, 则IE1(IE0)位被硬件自动清0。 (3) IT1(IT0):外部中断INT1(INT0)请求控制位,由程序来置1或清0。设 置外部中断引脚INT1(INT0)是低电平触发还是下降沿触发。 (4)TR1(TR0):定时器/计数器T1(T0)启动标志位,置1为定时器启动计数。 2.TMOD 定时器/计数器工作方式寄存器(低4位为T0,高4位为T1) GATE C/T M1 M0 GATE C/T M1 M0 7 6 5 4 3 2 1 0 (1)GATE: GATE GATE=1定时计数器运行只受TCON中运行控制位TR控制 8 LCD汉字显示控制系统的设计 GATE=0,定时计数器运行受TR和外中断输入信号双重控制 (2)C/T: C/T C/T=1,计数方式,对外部事件脉冲计数,负跳变脉冲有效 C/T=0,定时方式,对片内机器周期脉冲计数,用作定时器 (3)M1M0: M1M0=00,方式0,13位计数器 M1M0 M1M0=01,方式1,16位计数器 M1M0=10,方式2,2个8位计数器,初值自动装入 M1M0=11,方式3,2个8位计数器,仅适用于T0 3.SCON 串行口控制寄存器 SM0 SM1 SM2 REN TB8 RB8 T1 R1 7 6 5 4 3 2 1 0 (1)REN:接收控制位。0为禁止接收,1为允许接收。 (2)RI和TI:串行口内部中断申请标志位。当串行口发送完一个字符后, 由内部硬件置TI,1,当串行口接受完一个字符后,由内部硬件置RI ,1。 (3)SM1SM0: SM1SM0=00,方式0,同步移位寄存器,Fosc/12 SM1SM0 SM1SM0=01,方式1,10位异步收发,由定时器控制 SM1SM0=10,方式2,11位异步收发,Fosc/32或Fosc/64 SM1SM0=11,方式3,11位异步收发,由定时器控制 (4)SM2:多机通信控制位。主要用于方式2和方式3。在方式0中,SM2 应为0.;在方式1中,若SM2,1,则只有收到有效停止位时才激活RI, 若没有收到有效停止位,则RI清0;在方式2或方式3中,若置SM2 ,1,则接收到的第9位数据为1时才激活RI并申请中断,利用SM2 的功能,可以制定主从式多机通信协议。 (5)TB8,RB8:TB8为发送数据的第9位装入TB8中;RB8为接收数据 第9位装入RB8中。 4.IE 中断允许寄存器 EA — ET2 ES ET1 EX1 ET0 EX0 7 6 5 4 3 2 1 0 (1)EA:中断总允许位。EA,1为CPU开中断;EA=0为CPU屏蔽所有中 断请求。 (2)ES:串行中断允许位。ES=1为允许串行口中断;ES=0为禁止串行中 9 LCD汉字显示控制系统的设计 断。 (3)ET1(ET0):ET1(ET0),1为允许T1(T0)溢出中断;ET1(ET0),0为禁止 T1(T0)溢出中断。 (4)EX1(EX0):EX1(EX0),1允许INT1(INT0)中断;EX1(EX0),0禁止 INT1(INT0)中断。 5.IP 中断源优先级设定寄存器 — — PT2 PS PT1 PX1 PT0 PX0 7 6 5 4 3 2 1 0 (1)PT2/PT1/PT0:分别为定时计数器T2,T1,T0中断优先控制位。 (2)PX1/PX0: 分别为外部中断INT1,INT0中断优先控制位。 (3)PS: 为串行中断优先控制位。置1为高优先级,清0为低优先级。 2.1.2 MS12864A-2 LCD显示模块 MS12864A-2 液晶显示模块是深圳美视实业发展有限公司研发生产的汉字图形点阵液晶显示模块,如图2.2所示。可显示汉字及图形,内置8192个汉字(16×16点阵),128个字符(8×16点阵),及64×256点阵显示RAM(GDRAM)。 图2.2 MS12864A-2液晶显示模块 2.1.2.1模块引脚说明 MS12864A-2内藏汉字库液晶显示模块引脚说明如表2.1所示。LCD_K和LCD_A可选。如果使用串口方式传输指令和数据,则只需要使用VSS,VDD,CS,SID,CLK引脚即可;如果使用并口方式传输指令和数据,则需要使用VSS,VDD, 10 LCD汉字显示控制系统的设计 RS,R/W,E,DB0,DB7即可。作者采用后一种方式,并且,作者将PSB硬件置1,不再需要软件设置。 表 2.1 MS12864A-2液晶模块引脚说明 引脚号 引脚名称 功能说明 1 LCD_K 背光源负极(LCD 0V) 2 LCD_A 背光源正极(LCD 5V) 3 VSS 模块电源地 4 VDD 模块电源正端 5 NC 悬空 6 RS(CS) 并行的指令/数据选择信号;串行的片选信号 7 R/W(SID) 并行的读/写选择信号;串行的数据口 8 E(CLK) 并行的使能信号;串行的同步时钟 9,16 DB0,DB7 数据0,数据7 17 PSB 并/串行接口选择;1为并行,0为串行 18 /RET 复位,低电平有效 19,20 VR,V0 驱动电压输入端,调节对比度,下拉0,10K欧电阻 2.1.2.2接口时序(8位并行连接时序图) 1.MCU(STC89C52RC)写资料到模块 MCU写资料到液晶模块的时序过程是这样的:将R/W引脚清0,如果RS置1则表示写数据,清0则表示写指令,然后将E使能信号置高,将8位数据或指令 ,DB7并口,延时两个NOP空指令以保证数据或指令完全写入DB0,DB7,写入DB0 这时E由高到低实现跳变,这样数据或指令写入模块就成功了。写资料时序图如图2.3所示。 图 2.3 写资料到RAM时序图 2.MCU(STC89C52RC)从模块读资料 MCU从液晶模块读资料的时序过程是这样的:将R/W引脚置1,如果RS置1则表示MCU从数据寄存器(DR)中读数据,清0则表示读出忙标志BF和地址 11 LCD汉字显示控制系统的设计 计数器AC的状态,然后将E使能信号置高,将8位数据读出到DB0,DB7并口,延时两个NOP空指令以保证数据完全读出到DB0,DB7,这时将E置反,这样数据就从模块中读出来了。读资料时序图如图2.4所示 图 2.4 读资料到RAM时序图 2.1.2.3 用户指令集简介(RE,0,基本指令集) 该用户指令表由指令/数据选择信号RS,读/写选择信号R/W和DB0,DB7八位并口数据信号来设置。使用时需要注意的是:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。2、“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。具体设置如表2.2所示。 表2.2 用户指令基本指令集 指令码 执 行指令 说明 RRDDDDDDDD时S W 7 6 5 4 3 2 1 0 间 4.将DDRAM填满“20H”,并6清除显示 0 0 0 0 0 0 0 0 0 1 且设定DDRAM的地址计数m器(AC)到“00H” s 设定DDRAM的地址计数器4.(AC)到“00H”,并且将游6地址归位 0 0 0 0 0 0 0 0 1 X 标移到开头原点位置;这个m指令并不改变DDRAM的内s 容 12 LCD汉字显示控制系统的设计 指定在资料的读取与写入进入点 I/720 0 0 0 0 0 0 1 S 时,设定游标移动方向及指设定 D us 定显示的移位 D=1:整体显示ON C=1:游显示状态开/720 0 0 0 0 0 1 D C B 标ON 关 us B=1:游标位置ON SR设定游标的移动与显示的移游标或显示移720 0 0 0 0 1 //X X 位控制位元;这个指令并不位控制 us C L 改变DDRAM的内容 0 DL=1 (必须设为1) D72功能设定 0 0 0 0 1 X RX X RE=1: 扩充指令集动作 L us E RE=0: 基本指令集动作 AAAAAAA设定DDRAM设定DDRAM地址到地址计720 0 1 CCCCCCC地址 数器(AC) us 6 5 4 3 2 1 0 读取忙碌标志(BF)可以确AAAAAAA读取忙碌标志B认内部动作是否完成,同时0u0 1 CCCCCCC(BF)和地址 F 可以读出地址计数器(AC)s 6 5 4 3 2 1 0 的值 写资料到DDDDDDDD写入资料到内部的RAM721 0 RAM 7 6 5 4 3 2 1 0 (DDRAM/CGRAM/IRAM) us 从内部RAM读取资料读出RAM的DDDDDDDD721 1 (DDRAM/CGRAM/IRAM/值 7 6 5 4 3 2 1 0 us GDRAM) 2.2 软件开发工具 2.2.1 Keil uVision2编译调试软件 Keil uVision2软件是51系列兼容单片机C语言软件开发系统,它集编辑,编译,仿真于一体,支持汇编和C语言的程序设计。使用接近于传统的C语言的语法来开发,与汇编相比,C语言在功能上,结构上,可读性,可维护性上有明显的优势,因而易学易用,而且大大提高了工作效率和项目开发周期。Keil uVision2开发软件如图2.5所示。 Keil uVision2环境配置:选择“Target 1” 右键“Options for Target 1”将Xtal(MHz)选项设为自己的单片机晶振,我的为11.0592MHz。同时将Memory Model设为Large片外存储,Code Rom Size设为Large模式,Operating设为None。因为我用的芯片为STC89C52RC,所以选择Intel的80/87C52,亦可根据自己的 13 LCD汉字显示控制系统的设计 芯片类型进行合理选择。 图2.5 Keil uVision2开发软件 2.2.2 STC单片机ISP下载编程软件 STC单片机ISP下载编程软件专用于STC89系列单片机下载烧写,作者在使用时MCU Type选择STC89C52RC类型,与我的单片机芯片类型匹配。COM口选择COM1,这个COM口如何选择,读者可以在我的电脑上右键点击“管理” 查看“设备管理器”的端口,如果通讯端口为COM1,则选择COM1,如果为COM2,则选择COM2。然后将最大下载波特率设置成115200b/s即可。STC单片机ISP下载编程软件如图2.6所示。 14 LCD汉字显示控制系统的设计 图2.6 STC单片机ISP下载编程软件 2.2.3 Visual C++6.0开发软件 Microsoft Visual C++6.0软件用来开发上位机程序,可新建一个基于对话框的MFC AppWizard(exe)程序,作者命名为PC51_Comm。然后在项目中编写上位机数据库程序,上位机与下位机串行通信程序。基于对话框的PC51_Comm程序及VC开发软件如图2.7所示。 图2.7 基于对话框的PC51_Comm程序及VC开发软件 15 LCD汉字显示控制系统的设计 2.2.4 SQL Server2000数据库 SQL Server2000数据库可建立一个名为PC51_Comm数据库,同时可在数据库中建立需要的用户列表。SQL Server2000数据库如图2.8所示。 图2.8 SQL Server2000 PC51_Comm数据库 16 LCD汉字显示控制系统的设计 第三章 LCD汉字显示控制系统的设计 3.1系统硬件设计 STC89C52RC芯片与MS12864A-2 LCD显示模块的连接图如下图3.1所示。在实际操作中,由于STC89C52RC芯片管脚对应的芯片管脚引出座的VCC引脚悬空,所以利用开发板自带的LCD1602标准接口的VCC引脚来代替,为了方便,也将VSS引脚用LCD1602标准接口的VSS引脚来代替。因此在接线的时候,只要将LCD显示模块的VSS和VDD引脚接到开发板上的LCD1602标准接口对应的VSS和VCC引脚上即可。将P0口作为指令和数据输入/输出接口连接到LCD D7引脚上。RS引脚连接P2_7引脚,R/W引脚连接P2_6引脚,显示模块的D0, E引脚连接P2_5引脚。LCD_K和LCD_A背光源负极和正极作为可选项连接到芯片电源地引脚和电源引脚上。NC悬空。PSB,/RST,VR,V0四个引脚悬空。 为什么要将PSB引脚悬空呢,PSB作为串/并行接口选择信号在程序设计中作用至关重要,要么对LCD显示模块用串行传输指令/数据方式写驱动程序,要么对LCD显示模块用并行传输指令/数据方式写驱动程序。作者提到,生产厂商在生产该款LCD显示模块时PSB信号引脚既可以由硬件置1或清0又可以由软件置1或清0。作者为了方便少搭接一根线,将LCD显示模块的R11电阻和其中间的跳变节点短接,即实现PSB置1,也就是利用并行传输指令/数据方式写驱动程序。当然,也可以将PSB引脚接到P2_4引脚上,利用软件置1或清0。 为什么要将VR和V0引脚悬空呢,VR和V0引脚均可调节显示屏亮度/对比度。因为作者根据厂商提供的用户资料,将显示模块的R8和R1短接了。为什么要短接呢,因为VR通过10K可调下拉电阻接地,原本显示模块在设计时是将电源VDD与下拉可调电阻连接,然后才接地,即偏压接线引脚通过电源与下拉电阻产生偏压。但短接之后,即不需要。 17 LCD汉字显示控制系统的设计 LCD_KSTC89C52RCLCD_A VSS VDD NCMS12864A-2RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 PSB /RST VR V0STC89C52RC与MS12864A-2连接图 备注:PSB可由硬件置1或清0,也可软件置1或清0,作者采用硬件置1(将R11和中间跳变节 点短接),即并行数据传输;LCD_K,LCD_A连接可选,作者将其悬空,即不出现背光; /RST,VR,V0作者均悬空;另外,MS12864A-2显示模块要将R1和R9短接。具体解释见论文 图3.1 STC89C52RC与MS12864A-2连接图 3.2系统软件设计 3.2.1 下位机LCD驱动程序设计 STN类型LCD显示模块文本显示RAM提供8个×4行的汉字空间,当写入文本显示RAM时,可以分别显示CGROM、HCGROM与CGRAM的字型;ST7920A可以显示三种字型 ,分别是半宽的HCGROM字型、CGRAM字型及中文CGROM字型。三种字型的选择,由在DDRAM中写入的编码选择,各种字型详细编码如下:显示半宽字型 :将一位字节写入DDRAM中,范围为02H-7FH的编码。显示CGRAM字型:将两字节编码写入DDRAM中,总共有0000H,0002H,0004H,0006H四种编码显示中文字形:将两字节编码写入DDRAMK ,范围为A1A0H-F7FFH(GB码)或A140H-D75FH(BIG5码)的编码。ST7920GB的中文字型码表的一部分如图3.2,详细字码表可参考液晶用户资料。 18 LCD汉字显示控制系统的设计 控制器接口信号中RS,R/W配合选择决定控制界面的4种模式: RS R/W 功能说明 0 0 MCU写指令到指令寄存器(IR) 0 1 读出忙标志BF和地址计数器AC的状态 1 0 MCU写数据到数据寄存器(DR) 1 1 MCU从数据寄存器(DR)中读数据 E信号为使能端,E不同状态代表功能如下: E状态 执行动作 结果 高——>低 I/0缓冲——>DR 配合/W进行写数据或指令 高 DR——>I/0缓冲 配合R 进行读数据或指令 低/低——>高 无动作 汉字显示坐标如下: X坐标 Line1 80H 81H 82H 83H 84H 85H 86H 87H Line2 90H 91H 92H 93H 94H 95H 96H 97H Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH 根据MCU写资料读资料时序图2.3和图2.4: (一)判断BF是否忙碌函数IsBusy()用到图2.4读资料时序图:即RS,R/W,01,E置高,读取DB7即BF标志位,然后RS,R/W,E均置反。 (二)写指令函数write_LCD_command()和写数据函数write_LCD_data()用到图2.3写资料时序图:RS,R/W,00为写指令,RS,R/W,10为写数据,将E置高,然后将指令字节或数据字节赋给LCD DB0,DB7数据接口,这时程序延时2个NOP空指令之后,E从高到低实现跳变,此时指令和数据写入LCD成功,最后将RS,R/W置反。 19 LCD汉字显示控制系统的设计 图3.2 ST7920GB中文字型码表的一部分,两字节对应一个字型码 20 LCD汉字显示控制系统的设计 LCD驱动程序核心代码的关键就是写数据和写指令,写数据和写指令的具体实现过程我在上面一段已经提到,那么LCD驱动程序还有一个至关重要的代码就是LCD的初始化工作,根据表2.2用户基本指令集LCD的初始化过程顺序为:下达功能设置指令;关显示屏指令;清除显示指令;光标移到开头原点地址归位指令;显示屏不移动,光标右移指令;开显示指令。LCD初始化流程图如图3.3所示。 开始 等待20ms,VCC电源完全上升至5V 下达功能设置指令0x30,不检测忙碌标志 等待5ms,下达功能设置指令0x30,不检测 忙碌标志 等待5ms,下达功能设置指令0x30,不检测 忙碌标志 下达功能设置指令0x30,检测忙碌标志 下达关显示屏指令0x08,检测忙碌标志 图3.3 LCD初始化流程图 下达清屏指令0x01,检测忙碌标志LCD驱动程序核心代码如下: (1) MS12864-A2液晶模块驱动程序头文件:LCDms12864a2.h,代码如下: 下达“光标移到开头原点”地址归位指令#ifndef __LCDms12864a2_H__ #define __LCDms12864a2_H__ 0x02,检测忙碌标志 //******************************************************************** // 类型定义 * 下达“显示屏不移动,光标右移”光标和//******************************************************************** typedef unsigned char BYTE; //* 显示移动控制指令0x06,检测忙碌标志 typedef unsigned int WORD; //* typedef bit BOOL; //* 下达“开显示屏”显示状态开/关指令//******************************************************************** 0x0e,检测忙碌标志 结束 21 LCD汉字显示控制系统的设计 //******************************************************************** // 引脚定义 * //******************************************************************** #define rs P2_7 //rs并口数据/指令选择 1=数据,0=指令 //* #define r_w P2_6 //r_w读写控制信号 1=读,0=写 //* #define enable P2_5 //使能引脚 //* #define dataport P0 //DB0~DB7 //* //******************************************************************** //******************************************************************** // 函数声明 * //******************************************************************** void Delay100us(const BYTE n); //延时100us *n * void Delay10ms(const BYTE n); //延时10ms *n * BOOL IsBusy(void); //检测BF是否忙碌 * void write_LCD_command(BYTE command,BOOL check_busy); //写指令 * void write_LCD_data(BYTE LCDdata); //写数据到DDRAM * 显示字符串*str * void LCDDisplayStringF(BYTE *str); // void Init_LCD(void); //显示模块初始化 * //******************************************************************** // 函数声明 * //******************************************************************** #endif //__LCDms12864a2_H__ (2)MS12864-A2液晶模块驱动程序函数定义: LCDms12864a2.c,代码如下: #include #include #include //******************************************************************** //延时 (100us * n) * //******************************************************************** void Delay100us(const BYTE n) //函数调用需要2个指令周期 { BYTE i,j; //for语句需要8个指令周期 //(本开发板使用11.0592M晶振,每个指令周期1.0851us) for (i = 0; i < n; i++) { j = 12; //赋值语句需要2个指令周期 while(j--); //while语句7个指令周期 } } 22 LCD汉字显示控制系统的设计 //******************************************************************** //延时 (10ms * n) * //******************************************************************** void Delay10ms(const BYTE n) //函数调用需要2个指令周期 { BYTE i; WORD j; //for语句需要8个指令周期, //(本开发板使用11.0592M晶振,每个指令周期1.0851微秒) for (i = 0; i < n; i++) { j = 1305; //赋值语句需要2个指令周期 while (j--); //while语句7个指令周期 } } //******************************************************************* //判断BF是否忙碌,忙=1,空闲=0 * //******************************************************************* BOOL IsBusy(void) { BOOL result; dataport = 0xff; rs = 0; r_w = 1; enable = 1; result = (BOOL)(dataport & 0x80); _nop_(); _nop_(); enable = 0; rs = 1; r_w = 0; return result; } 23 LCD汉字显示控制系统的设计 //******************************************************************** //将命令写入指令寄存器IR中 * //******************************************************************** void write_LCD_command(BYTE command,BOOL check_busy) { if(check_busy) { while(IsBusy()); } rs = 0; r_w = 0; enable = 1; dataport = command; _nop_(); _nop_(); enable = 0; rs = 1; r_w = 1; } //******************************************************************** //将数据写入DDRAM中 * //******************************************************************** void write_LCD_data(BYTE LCDdata) { while(IsBusy()); rs = 1; r_w = 0; enable = 1; dataport = LCDdata; _nop_(); _nop_(); enable = 0; 24 LCD汉字显示控制系统的设计 rs = 0; r_w = 1; } //******************************************************************** //字符串显示,从头开始显示,一直到字符串结束,最多32个汉字 *//******************************************************************** oid LCDDisplayStringF(BYTE *str) v { BYTE i; write_LCD_command(0x80,1); //第一行 for(i=0; i<64 && *str!='\0';) { write_LCD_data(*str++); i++; if(i == 16) write_LCD_command(0x90,1); //第二行 if(i == 32) write_LCD_command(0x88,1); //第三行 if(i == 48) write_LCD_command(0x98,1); //第四行 } return; } //******************************************************************** //LCD初始化 * //******************************************************************** void Init_LCD(void) { Delay10ms(2); write_LCD_command(0x30,0); //基本指令集动作,不检测忙碌标志 Delay100us(50); write_LCD_command(0x30,0); Delay100us(50); write_LCD_command(0x30,0); write_LCD_command(0x30,1); //基本指令集动作,检测忙碌标志 write_LCD_command(0x08,1); //关显示 write_LCD_command(0x01,1); //清屏 write_LCD_command(0x02,1); //关标移到开头原点 write_LCD_command(0x06,1); //显示屏不移动,光标右移 write_LCD_command(0x0e,1); //开显示,光标显示 } 25 LCD汉字显示控制系统的设计 3.2.2 下位机接受上位机数据程序设计 在串口初始化时,涉及到波特率的计算问题,在本设计中,我们利用定时计数器T1工作在模式2用作波特率发生器,SMOD,0不倍增,串口方式1的波特率由定时器T1的溢出率与SMOD值同时决定: 波特率BaudRate = (2^SMOD*Fosc)/(32*12*(256-初值)) 256,(2^SMOD * Fosc)/(BaudRate*32*12) 即TH1和TL1初值为: 下位机串行通信程序设计过程: 下位机串行通信程序首先进行串行通信初始化(串行通信初始化工作包括设定波特率是否倍增,设定串行中断为优先级别,用哪个定时计数器哪个工作模式作为波特率发生器,定时器初值设置,串行口控制寄存器SCON设置以及启动定时计数器等,其中波特率的设定值为9600b/s,与上位机串行通信程序波特率设定值保持一致)之后,通过串行中断程序接受开始标志符’(’不断判断上位机是否重新开始发送一组新的字符串,如果是,则清空全局字符串变量strDisplay[] 并一个字符一个字符的保存到strDisplay[]中,然后根据接受结束标志符’)’判断字符串接受结束,然后在LCD上显示新接受的字符串。如果判断上位机没有发送一组新的字符串,则下位机通过串行中断程序不断检测上位机有无新字符串发送。下位机串行通信程序设计流程图如图3.4所示。 开始 串行中断 否RI = 1?是 准备接收下一个字RI清0 符Letter=SBUF Letter=’(’?是否 清空strDisplay字符串Letter=’)’?否是 将字符Letter连接到RI_OK=1strDisplay字符串末尾 结束 图 3.4 下位机串行通信程序流程图 下位机串行通信程序流程图 26 LCD汉字显示控制系统的设计 串行通信程序和主程序 main.c 代码如下: #include #include #include BOOL RI_OK; //判断上位机字符串是否传送完 BYTE letter; //全局字符变量接收上位机字符 BYTE strDisplay[] =""; //全局字符串变量接收上位机字符串 //******************************************************************** //将一个字符letter连接到字符串str后面 * //******************************************************************** void strcat_char(BYTE *str,BYTE letter) { BYTE *sp; sp = str; while(*sp != '\0') { sp++; } *sp = letter; sp += 1; *sp = '\0'; } //******************************************************************** //串口中断函数 * //******************************************************************** void Uart_SVC(void) interrupt 4 //串口中断 { if (RI == 1) //接收完数据产生中断 { RI = 0; letter = SBUF; if(letter == '(') { strcpy(strDisplay,""); //清空字符串 return; } if(letter == ')') //判断字符串结束标志 { 27 LCD汉字显示控制系统的设计 RI_OK = 1; return; } strcat_char(strDisplay,letter); } } //******************************************************************** //串口初始化函数 * //******************************************************************** void UART_Init(void) { // PCON |= 0x80; //SMOD=1,波特率倍增 TH1 = 0xFA; TL1 = 0xFA PS = 1; //设置串行中断优先控制位 ET1 = 0; TMOD = 0x20; //把定时计数器1用作模式2做波特率发生器 TH1 = 0xFD; //SMOD=0,不倍增 TL1 = 0xFD; //波特率为9600b/s,晶振11.0592MHz SCON = 0x50; //0b01010000 方式1 ES = 1; //允许串行中断 ET1 = 1; //允许定时计数器1溢出中断 TR1 = 1; //启动定时计数器1 EA = 1; //STC89C52RC开放中断 } //******************************************************************** //主程序 * //******************************************************************** void main(void) { UART_Init(); //串口初始化函数 Init_LCD(); //LCD初始化 while(RI_OK) { Init_LCD(); LCDDisplayStringF(strDisplay); } } 28 LCD汉字显示控制系统的设计 3.2.3 上位机数据库程序设计 上位机数据库程序设计的目的就是能够将信息保存在数据库中,方便存储和读取,这样在每次设定显示信息的时候不用重复输入,只需要通过“添加”,“修改”,“删除”,“保存”按钮即可实现信息的管理。如果要显示指定的信息,只要将信息列表中的信息选定,点击“添加>>”按钮即可放入显示列表中进行显示,如果要取消某条信息的显示,则只需要点击“<<删除”按钮即可将该条记录删除并保存到信息列表中备份。 首先在SQL Server2000企业管理器中建立一个名为PC51_Comm的数据库,然后建立2个用户列表,分别为信息列表和显示列表,2个列表的属性完全一样,如图3.5所示。其中“内容”设置为主键,就是为了避免一个数据库列表中有两条相同内容的信息,长度控制在64个字符以内,是为了避免信息写入LCD产生溢出问题。而“日期”和“标题”的设定完全只为起到对内容信息标签和备注的作用,在实际下位机程序中并不会用到,因此整个数据库列表的设计看起来非常简单。 图3.5 信息列表的设计 建立好数据库用户列表以后,就可以利用VC6.0进行上位机数据库程序设计了,建立一个基于对话框的名为PC51_Comm的对话框程序,主要代码如下: (1)在PC51_Comm.cpp的InitInstance()函数中添加初始化COM库程序: //******************************************************************** //初始化COM库 * //******************************************************************** if(!AfxOleInit()) { AfxMessageBox("COMz库初始化出错!"); return FALSE; } 29 LCD汉字显示控制系统的设计 m_pConn.CreateInstance(__uuidof(Connection));//创建Connection对象实例 m_pCmd.CreateInstance(__uuidof(Command));//创建Command对象实例 (2) 在PC51_Comm.cpp中添加数据库连接,释放,执行函数: //******************************************************************** //数据库连接,释放,执行代码 * //******************************************************************** void CPC51_CommApp::ConnectDataBase() {//连接到数据源 try { /*无DNS连接方法。连接提供者SQLOLEDB为组件对象模型(COM)接口,服务器名为hbzqiang,数据库名为PC51_Comm;所使用用户名为sa,密码为空。*/ _bstr_t ConnectionString = "Provider = SQLOLEDB;Server=hbzqiang; DataBase=PC51_Comm;uid=sa;pwd="; /*设置 CursorLocation 使用由本地游标库提供的客户端游标。本地游标服务通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。AdUseClient 具有向后兼容性,也支持同义的 adUseClientBatch。*/ m_pConn->CursorLocation=adUseClient; /*打开到数据源的连接:ConnectionString为连接信息,第2个参数UserID和第3个参数Password为可选项,这里两个字符串均为空,因为连接信息中已给出。 adConnectUnspecified为同步打开连接。*/ m_pConn->Open(ConnectionString,"","",adConnectUnspecified); /*指示指定的Command对象当前所属的Connection对象。设置或返回包含了定义连接或Connection对象的字符串。*/ m_pCmd->ActiveConnection=m_pConn; // AfxMessageBox("连接数据库成功!"); } catch(_com_error& e) { CString error; error.Format("CPC51_CommApp::ConnectDataBase()中连接数据库出现异常!\ \r\n%s\r\n%s",e.ErrorMessage(),(char*)e.Description()); AfxMessageBox(_T(error)); return ; } } 30 LCD汉字显示控制系统的设计 void CPC51_CommApp::UnconnectDatabase() { m_pConn->Close();//关闭打开的对象 m_pConn.Release();//释放连接 } //定义一个返回记录集对象的SQL执行函数,该函数对ADO具体SQL执行操作//进行了封装,只需要引用执行语句字符串sql即可。 _RecordsetPtr CPC51_CommApp::ExecuteSQL(CString &sql) { _RecordsetPtr pSet =NULL;//定义并初始化一个记录集对象pSet try { //使用CommandText属性定义SQL语句可执行文本 m_pCmd->CommandText=_bstr_t(sql); //执行在CommandText属性中指定的查询,SQL语句和存储过程,将记 //录集保存到pSet临时变量中并返回 pSet=m_pCmd->Execute(NULL,NULL,0); return pSet; } catch(_com_error& e) { CString error; error.Format("CPC51_CommApp::ExecuteSQL执行语句异常!\ \r\n%s\r\n%s",e.ErrorMessage(),(char*)e.Description()); AfxMessageBox(_T(error)); return pSet=NULL; } } 紧接着就是对信息列表和显示列表两个ListControl控件进行初始化,将数据库信息列表和显示列表中的信息显示到各自对应的控件列表中,并将鼠标选定的列表控件中的信息显示到各EDIT编辑框中,便于对信息进行“添加”,“修改”,“删除”,“保存”管理。所有这些做完之后,就可以编写“添加”,“修改”,“删除”,“保存”函数,下面仅以“添加”函数为例,其他如“修改”,“删除”,“保存”函数与“添加”函数基本类似: (3) “添加”按钮功能函数代码如下: 首先读取各EDIT编辑框(日期,标题,内容)中的信息,如果编辑框中的内容信息和数据库中信息列表或显示列表中的某条信息完全一样,则添加失败,因为“内容”列名属性设置为主键,不可能添加相同内容的信息到数据库中。如果内容编辑框中的内容信息和数据库中的所有内容信息不一样,则可以添加该内 31 LCD汉字显示控制系统的设计 容信息到数据库中,添加成功。 //******************************************************************** //添加信息到数据库信息列表 * //******************************************************************** void CPC51_CommDlg::OnBTNAdd() { // TODO: Add your control notification handler code here //"添加" UpdateData(true); CString strSQL; _RecordsetPtr psetInfo,psetDisp; try { strSQL.Empty();//字符串strSQL清空 //格式化strSQL查询语句:字符串信息为查询数据库信息列表中是否有 //和编辑框中内容相同的记录 strSQL.Format("select * from 信息列表 where 内容='%s'",m_strContent); psetInfo=theApp.ExecuteSQL(strSQL); strSQL.Empty();//字符串strSQL清空 //格式化strSQL查询语句:字符串信息为查询数据库显示列表中是否有 和编辑框中内容相同的记录 // strSQL.Format("select * from 显示列表 where 内容='%s'",m_strContent); psetDisp=theApp.ExecuteSQL(strSQL); //如果信息列表和显示列表中查询有相同内容信息,即查询返回记录条数 //大于0,则添加失败 if(psetInfo->GetRecordCount()>0 || psetDisp->GetRecordCount()>0) { MessageBox(_T("不能添加相同内容到列表中"),_T("温馨提示!")); return; } else { strSQL.Empty(); //格式化strSQL查询语句:将各EDIT编辑框中的信息插入到数据库 //信息列表中 strSQL.Format("insert into 信息列表 values ('%s','%s','%s')",\ m_strDate,m_strTitle,m_strContent); //执行该strSQL语句 psetInfo=theApp.ExecuteSQL(strSQL); //更新名为InfoList List控件中的信息 m_InfoList.DeleteAllItems(); m_InfoList.SetRedraw(FALSE); 32 LCD汉字显示控制系统的设计 InitInfoListControl(); m_InfoList.SetRedraw(true); m_InfoList.Invalidate(); m_InfoList.UpdateWindow(); MessageBox(_T("添加成功!"),_T("温馨提示!")); } } catch(_com_error& e) { CString error; error.Format("添加信息到信息列表失败%s",e.ErrorMessage()); MessageBox(_T(error),_T("温馨提示!")); } //在InfoList List控件中插入新添加信息并设置文本颜色为红色 m_InfoList.InsertItem(0,m_strDate); m_InfoList.SetItemText(0,1,m_strTitle); m_InfoList.SetItemText(0,2,m_strContent); m_InfoList.SetTextColor(RGB(255,0,0)); //更新名为DispList List控件中的信息 m_DispList.DeleteAllItems(); m_DispList.SetRedraw(FALSE); InitDispListControl(); m_DispList.SetRedraw(true); m_DispList.Invalidate(); m_DispList.UpdateWindow(); UpdateData(false); } 3.2.4 上位机发送数据到下位机程序设计 上位机与下位机串行通信程序设计的目的就是上位机将数据库显示列表中的信息按照自己设定的时间定时循环发送到下位机的RAM中,其中,在发送数据的开头加上“(”作为接收开始标志,在发送数据的末尾加上“)”作为接收结束标志。核心代码如下: (1)在PC51_CommDlg.cpp文件中加入以下代码: 首先查询数据库显示列表中记录集信息条数,如果小于等于零,则表示显示列表中没有可显示的信息,此时程序返回。如果大于零,则将显示列表中第一条记录的内容信息字符串前后加上接受开始标志符’(’和接受结束标志符’)’,然后通过MSComm控件的SetOutput方法发送该字符串到下位机中,如此通过VC 33 LCD汉字显示控制系统的设计 定时器定时循环发送显示列表中的每一条记录的内容信息。 //******************************************************************** //定时控制,不断更新发送显示列表中信息到下位机 * //******************************************************************** void CPC51_CommDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default _RecordsetPtr pset; CString strSQL,temp,SendData; strSQL="select * from 显示列表"; pset=theApp.ExecuteSQL(strSQL);//将查询的信息记录集存放到pset变量中 m_DisplayCount = pset->GetRecordCount(); if(m_DisplayCount<=0) { MessageBox("显示列表没有内容可显示!"); return; } temp = m_DispList.GetItemText(m_TimerCount,2); SendData = "(" + temp + ")"; m_ctrlComm.SetOutput(COleVariant(SendData)); m_TimerCount++; if(m_TimerCount == m_DisplayCount) { m_TimerCount = 0; } CDialog::OnTimer(nIDEvent); } 其中m_TimerCount为定时循环计数全局变量,而m_DisplayCount为显示信息栏信息总数全局变量。 同时通过“显示”按钮控制显示信息的定时更新和定时时间的更新,代码如下: void CPC51_CommDlg::OnBTNDisplay() { // TODO: Add your control notification handler code here //"显示" UpdateData(TRUE);//读取编辑框IDC_EDIT_Times //设置定时时间,秒级计时 34 LCD汉字显示控制系统的设计 //m_intTimes为int型变量,值从IDC_EDIT_Times编辑框中获取 SetTimer(1,1000*m_intTimes,NULL); } 需要注意的是,在编写发送程序之前,还要对串口进行初始化操作。应用Visual C++开发串行通信程序通常使用如下方法:一是利用Windows API通信函数;二是利用Visual C++的标准通信函数_inp,_inpw,_outp,_outpw,_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm)。在这里,作者选用MSComm控件开发串口通信程序。 (2)初始化程序如下: //******************************************************************** //打开串口和设置串口参数 * //******************************************************************** BOOL CPC51_CommDlg::OnInitDialog() { if(m_ctrlComm.GetPortOpen()) {//如果串口打开,先关闭串口 m_ctrlComm.SetPortOpen(FALSE); } m_ctrlComm.SetCommPort(1);//选择com1 if(!m_ctrlComm.GetPortOpen()) { m_ctrlComm.SetPortOpen(TRUE);//打开串口 } else { AfxMessageBox("打开串口失败!"); } //波特率9600b/s,无校验,8个数据位,1个停止位 m_ctrlComm.SetSettings("9600,n,8,1"); m_ctrlComm.SetInputMode(1);//1:表示以二进制方式检取数据 m_ctrlComm.SetRThreshold(1); m_ctrlComm.SetSThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0 m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 } 35 LCD汉字显示控制系统的设计 第四章 结论 通过最终测试,数据库中的显示列表信息可以定时循环在LCD显示模块上显示,串行通信数据发送和接收都正常。而且,上位机中对数据库中的信息进行添加,修改,删除,保存的功能测试均正确。 ,既可以编辑固定的字符显示信息在LCD上 通过双机控制LCD汉字显示 显示,又可以通过上位机编辑信息,对信息进行管理,然后通过串行通信发送到下位机上经LCD驱动程序在LCD上显示出来,这样的优点是功能强大,既适合专业开发人员,又适合普通用户群,系统通用性非常好。因此易于推广和使用。 36 LCD汉字显示控制系统的设计 第五章 谢辞 从四月上旬到五月中下旬这接近两个月的时间可以说是我大学四年中过的最充实最有意义的一段时间。 四月上旬,当我选择做LCD汉字显示控制系统这个课题的时候,同学们纷纷劝我,还是别做硬件的好,第一是麻烦,不像做软件那样容易查找错误,第二是成本高,买开发板和显示屏要花费我近一个月的生活费。甚至我的指导老师都给我强调了做硬件有可能因为调试不出来结果而导致 毕业设计 机械毕业设计下载球磨机的毕业设计下载关于网络爬虫的毕业设计下载关于网络爬虫的毕业设计下载河南城建学院毕业设计论文下载 失败,影响自己的成绩之类的话。说实话,我听了这些,心里也犹豫的很,但我最终还是下定决心,自己买开发板和显示屏,哪怕最后的结果不甚理想甚至彻底失败,我也要做下去。支撑我这样决定的理由有两个:第一,我将来从事的工作有可能与嵌入式有关,而学习嵌入式的入门课程就是单片机,刚好我的毕业设计选题与单片机相关,这对我来说,是个入门机会;第二,单片机课程我大学期间没有选修过这门课,单片机对于我来说,非常陌生,在拿到毕业设计课题之前,我甚至都不知道单片机的概念是什么,更不知道单片机的芯片有哪几种,所以我就是想挑战一下我未知的东西,我就是要在短时间内掌握并熟练应用我以前从未知的一门知识~如果我这点都做不到,或做的不好,那么将来我面对一项新知识时,依然茫然。 当我下定决心做单片机方面的课题时,我的指导老师丁贤庆老师给予了我坚定的鼓励和支持。丁老师送给我一本8051单片机 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 作为入门资料给我,让我能够快速的了解8051的体系结构,指令和具体应用。 除此之外,我在拿到课题之后的前几个星期天天泡在图书馆,这期间,我通读了所有与8051单片机相关的资料,并做了大量笔记,几个星期后,我对8051系列单片机的体系结构和指令用法了然于胸。 随后,我在合肥步瑞琪电子商城买了一款51单片机和LCD汉字显示模块。我深知道,了解了书本单片机的理论知识并不代表自己就可以马上入手做毕业设计了,因此我将自己买的这款单片机对照其集成的一些元器件写了一些小程序来验证自己是否真正掌握了单片机的基本原理和体系结构。这些小程序包括流水灯,定时器闪灯,LED数码管显示,计数器,外部中断,电子音乐,矩阵键盘等等。这些小程序虽然功能简单,但我每次调试正确之后都能给我带来特别兴奋的感觉,这种感觉很类似于我刚开始入门学C语言那会第一次写“Hello World”程序一样——神奇~神奇引领着我对之更深厚的兴趣~ 37 LCD汉字显示控制系统的设计 当我把这些小程序都调试成功之后,我知道,我可以开始入手设计我的毕业设计课题了。我需要做的第一步就是写LCD驱动程序,第二步才是串口通信,第三步是数据库设计,第四步是PC机与单片机进行数据串行通信。 所谓“万事开头难”,一点不假,我老以为,我已经对LCD驱动程序的开发步骤够清楚了,而且图书馆所有与LCD有关的代码我都读过了,因此写起来应该是非常容易的事情。事实上,写LCD驱动程序的的确确是非常容易的事情,然而最后的问题是LCD上就是不显示任何字符,更不用说汉字了。问题出在哪里,我不知道,我抓破头都想不清楚。 在我最茫然无助的时候,我的指导老师丁老师亲自到我寝室来,帮我分析和调试,真的令我非常非常感激。虽然最后没有调试出结果出来,但我大致清楚,我的驱动程序应该不会出太大的问题,怎么办,问题有可能出在LCD显示模块上。因此五一过后,我就去找代理商,因为代理商当初给我的资料不全,刚好我那款型号的显示模块没有相应的用户开发资料。代理商是个好人,给了我一个深圳的厂商号码,告诉我和里面的一个技术工程师联系,询问到底是什么问题,这样我打电话过去问,才明白问题关键之所在:我买的这款显示屏是专门为一个大客户定制的,因此其中的一些具体使用细节没有反映在用户开发资料上,比如上面我提到的将显示模块背面R9电阻和R1电阻短接,后来我短接之后,下载一调试,果然成功了,能显示字符和汉字了。就是这么一个小问题,我冥思苦想了两个星期而没有任何结果,这给了我一个启示:尽信书本上的理论知识只会让自己形成严重的思维定势,书本上的知识都是理论上完美可行的,但在实践中,比如厂商并不会完全按照书本理论来设计显示模块,而是根据客户需要来设计,这个时候如果开发程序员不注意其中的细节,就不可能解决各种各样存在的小问题。还比如,显示模块写资料和写数据时,使能信号E由高向低跳变中间的延时,书本上随便给的一个延时程序,当我在调试时发现,如果这个延时时间过长,则资料和数据写入LCD会失败,或者即使写入了,字符和汉字也会出现闪烁现象。因此,实践是检验真理的唯一标准~ 单个的串口通信程序和数据库设计对我来说非常容易,我很快就调试成功了这些程序,然后当我要在PC机与单片机进行数据串行通信设计收尾阶段时,又碰到了一个问题,那就是PC机发送数据始终不在LCD显示模块上显示~到底是串行通信这块出现问题呢,还是显示屏又出现了问题呢,如果串行通信没问题,那显示屏为什么全是乱码呢,如果串行通信出了问题,那又怎么可能传输数 38 LCD汉字显示控制系统的设计 据呢,真是“行百里者半九十”,离成功越近,困难越大~ 就是这段时间,是我最难熬的一段时间,我甚至都想到了放弃,然而我的老师丁老师鼓励了我,支持我继续做下去,并亲自给我送来一本串行通信的资料,真的令我非常感激,那段时间,我经常梦里都迷迷糊糊的想着到底问题出在什么地方,后来有一天我突然想到,下位机程序的的确确是接收了数据,可是主程序没等数据接收完就显示了接收数据,当然LCD要么会不显示字符和汉字,要么会显示乱码。问题解决了:通过设定一个发送结束标志符来判断数据是否接收完,这样就可以在LCD上正确显示自己所需要的信息了。问题很小,完全是我设计时忽略的,但却让我耽搁了好长一段时间。因此这给我一个启示:程序设计是一门精细的艺术,不能有任何哪怕一丁点马虎,否则带来的Bug会在自己的定势思维下永远都查找不出来~因此仔细的设计每一项细节,对于一个程序员来说尤为重要。 截止5月22日,我的代码设计完全结束,并成功调试出了我想要的结果。当我把我的作品展示给我周围的人看时,我非常非常的快乐,我知道,我做的东西在同学中并不是最好的,但在我心中,在我四年的作品中,是最用心,也是最好的。这证明了我有在短时间内学习一门新知识并熟练应用该知识的能力,这使我对我将来的工作非常的有信心。同时,我还要感谢:真的非常非常感谢我的指导老师丁贤庆老师,丁老师在我设计期间,两次来我寝室,给予我帮助和指导,两次亲自给我送来参考资料,所有这些我都会铭记于心。没有老师的鼓励,我恐怕自己早打了退堂鼓,再次对丁老师和所有帮助过我的人表示衷心的感谢~ 39 LCD汉字显示控制系统的设计 [参考文献] [1] 刘文涛.MCS-51单片机培训教程(C51版)[M].北京:电子工业出版社,2005. [2] 严天峰.单片机应用系统设计与仿真调试[M].北京:北京航空航天大学出版, 2005. [3] 胡汉才.单片机原理及其接口技术(第2版)[M].北京:清华大学出版社, . 2004 [4] 马淑华.单片机原理与接口技术[M].北京:北京邮电大学出版社,2005. [5] 王幸之.AT89系列单片机原理与接口技术[M].北京:北京航空航天大学出版 社,2004. [6] 吴金戌.8051单片机实践与应用[M].北京:清华大学出版社,2002. [7] (无忧电子开发网-串行通 信专辑), 发布日期:2005-06-10, 来源:互联网 [8] 求是科技.单片机通信技术与工程实践[M].北京:人民邮电大学出版社, 2005. [9] 李朝青.PC机及单片机数据通信技术[M].北京:北京航空航天大学出版社, 2001. 40 LCD汉字显示控制系统的设计 附录: LCD汉字显示控制系统运行效果截图 图7.1 上位机串行通信程序 图 7.2 显示列表信息1 41 LCD汉字显示控制系统的设计 图 7.3 显示列表信息2 图 7.4 显示列表信息3 42
本文档为【朱强论文_完美版080621】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_569018
暂无简介~
格式:doc
大小:476KB
软件:Word
页数:0
分类:生活休闲
上传时间:2018-02-15
浏览量:8