单片机控制的LCD汉字显示电路设计(独家完整版) - 图文

更新时间:2024-07-02 08:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机控制的LCD汉字显示电路设计

摘 要 近年来,随着电子行业的发展,单片机的应用越来越广泛,基于单片机的电子电路的设计也越来越多。所以,单片机在电子教学中越来越普遍。 本设计介绍的是以ATMEGA8单片机为核心的液晶显示屏控制系统。该设计详细阐述了其工作原理、基本功能框图、主要设计方法及工作流程。本设计提出了一种能实时控制显示内容的基于单片机的液晶显示屏控制系统设计方案,给出了该单片机的硬件电路和软件程序,最终显示出汉字的结果。具体方法是首先设计并焊接出一个AVR单片机开发板,基于此开发板设计出LCD模块显示电路。之后,编写LCD模块初始化程序和显示程序。最后下载程序到单片机,LCD显示出汉字。 关键词: Atmega8 控制 LCD12864 显示 I

Title The control circuit design of the dot-matrix liquid crystal display controlled by the microprocessor Abstract In recent years, with the development of the electronics industry, the application of the Microcontroller Unit is becoming more and more widely, also, there is more and more electronic circuit design based on the Microcontroller Unit. Therefore, the Microcontroller Unit using in the electronic teaching is becoming more common. This design introduces the liquid crystal display control system based on the ATMEGA8 microcontroller. This design elaborated on its working principle, the basic functional block diagram, main design methods and working process. This design puts forward to a design scheme based on the Microcontroller Unit, which can control the showing content of the LCD screen controlling system at the real time. The specific method is that, firstly we should design and weld into an AVR Microcontroller development board and then design a LCD module display circuit based on the development board. After that, write the LCD module initialization program and displaying program. At last, download the program to the MCU, and the LCD will show the Chinese characters. Keywords ATMEGA8 control LCD12864 displaying II

目次 摘 要 ................................................................ I Abstract ............................................................. II 目次 ................................................................ III 1概述 ................................................................. 1 1.1课题背景 ....................................................... 1 1.2设计要求 ....................................................... 1 1.3 LCD简介及发展 ................................................. 1 1.4 AVR单片机 ..................................................... 2 2方案论证 ............................................................. 2 2.1方案一 ......................................................... 2 2.2方案二 ......................................................... 3 2.3方案三 ......................................................... 3 3主要模块简介 ......................................................... 3 3.1 ATMEGA8简介 ................................................... 3 3.2 LCD12864模块简介 .............................................. 5 3.2.1 KXM12864主要技术参数和性能 ............................... 5 3.2.2 KXM12864外形尺寸图 ....................................... 5 3.2.3 KXM12864液晶显示指令系统 ................................. 6 3.2.4 12864液晶显示动态指标及术语 .............................. 7 4硬件设计 ............................................................. 9 4.1设计流程图及设计思路 ........................................... 9 4.2各模块电路设计 ................................................ 10 4.2.1电源电路 ................................................. 10 4.2.2 LCD12864模块控制电路 .................................... 11 4.2.3 RS232电平转换电路 ....................................... 12 4.2.4 时钟电路 ................................................ 13 4.3硬件焊接与调试 ................................................ 14 4.4方案扩展 ...................................................... 14 5软件设计 ............................................................ 16 5.1 LCD12864模块初始化流程 ....................................... 16 .................................................................. 16 5.2部分程序代码 .................................................. 17 5.2.1软件延时 ................................................. 17 5.2.2 端口输出函数 ............................................ 18 5.2.3 写数据函数 .............................................. 18 5.2.4 写指令函数 .............................................. 19 5.2.5 初始化函数 .............................................. 20 III

5.2.6 显示函数 ................................................ 20 5.3程序调试中的注意问题 .......................................... 23 6实物与实测效果展示 .................................................. 27 6.1实物展示 ...................................................... 27 6.2实测效果展示 .................................................. 28 结论 ................................................................. 29 感言 ................................................................. 30 致谢 ................................................................. 31 参考文献 ............................................................. 32 附录A ................................................................ 33 硬件原理图(基于protel99se) ..................................... 33 附录B ................................................................ 34 程序代码 .......................................................... 34 附录C ................................................................ 40 元器件规格清单 .................................................... 40 IV

1概述

自20世纪以来,电子行业发生着翻天覆地的变化。电子行业的发展推动着社会的发展,因此,世界各国也大力发展电子行业。其中,在电子行业中,显示器产业是其中尤为重要的产业之一。然而,在显示器产业中,LCD技术是最重要的技术之一。

众所周知,单片机像是电子行业中发挥着巨大作用的精灵。它的能耗小、价格低廉,在简单的电子实验方面的应用非常广泛,在教育教学中深受广大电子教育工作者的喜爱。

1.1课题背景

在电子行业中,LCD已被公认为是媒体时代的关键器件,它的低功耗、体积小、易于实现画面显示及优良的全色显示性能等特点,使其在现代社会中得到了广泛的应用。可以说,LCD是本世纪初最有活力的电子产品之一。

与此同时,单片机的应用领域也非常广泛,大到导弹的导航装置,飞机上各种仪表的控制,小到广泛使用的智能IC卡,比如学校中使用的校园一卡通等,这些都离不开单片机。因此,通过使用单片机可以使我们完成很多令我们意想不到的事情。所以,本着理论与实践相结合的原则,本设计以单片机为核心控制器件控制LCD显示模块,通过硬件和软件的共同配合实现在128×64点阵液晶屏上显示汉字、字符等的功能,本系统由ATMEGA8单片机和点阵式液晶显示屏模块构成。

1.2设计要求

系统硬件设计:系统选用ATMEGA8单片机作为主控和处理设备,LCD12864模块作为输出设备。

系统软件设计:微控制器处理和LCD模块显示部分的程序设计。

1.3 LCD简介及发展

液晶显示器是一种采用了液晶控制透光度技术来实现色彩的显示器。众所周知,即使长时间观看LCD显示屏幕也不会对眼睛造成伤害,这主要是因为LCD显示器没有辐射,画面图像很稳定。

LCD 可分为段位式LCD、字符式LCD 和点阵式LCD。其中,段位式LCD 和字符式LCD 只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD 不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可

1

以实现屏幕上下左右滚动、动画、分区开窗口、反转、闪烁等功能,用途十分广泛。

奥地利植物学家F·Reinetzer在一百多年前发现了液晶。然而,到20世纪60年代,液晶才逐渐被人类关注。

1961年, F·Heimeier发现了液晶的动态散射相变等一系列的液晶电光效应。由此,美国RCA公司成功研制了一系列数字、字符的显示器件以及液晶显示的钟表、驾驶台显示器等实用产品。

1968年,日本当时正在兴起开发电子产品的产业,将大规模集成电路与液晶相结合,开发了一系列电子产品。从此,日本电子产业蓬勃发展,这也是日本微电子产业闻名世界的起因。

现代液晶显示模块具有低电压、微功耗、易彩色化、被动显示等特点, 是主流的显示技术之一。

1.4 AVR单片机

1997年,ATMEL发挥自己的技术特长,研发出了全新配置,采用精简指令集的新型单片机,即AVR单片机。其中,ATMEGA8是ATMEL 公司在2002年第一季度推出的一款新型高档单片机。

与MCS-51单片机不同的是,AVR 单片机采用Harvard结构,在前一条指令执行的时候就取出下一条指令,而且它的程序存储器和数据存储器是分开组织和寻址的。AVR单片机内部有三种不同性能和用途的存储器Flash、EEPROM和RAM。

2方案论证

2.1方案一

根据本课题内容,本设计拟采用MCS-51单片机控制液晶显示器显示汉字。MCS-51型号的单片机我曾在单片机原理、接口及应用的必修课中学习过,对该型号单片机的结构和如何控制都比较熟悉。本次课题设计需要+5V电源为单片机及液晶显示器提供电压,所以,需要设计一个直流稳压电源来提供所需的+5V电压。结合模拟电子技术基础所学知识,我了解到,直流稳压电源又分为线性稳压电源和开关型稳压电源。然而,对于稳定性要求不高的电子电路,整流、滤波后的直流电压即可以作为供电电压。而且我们曾在模拟电子技术中学习过整流、滤波电路的理论知识,还曾做过一个基于整流、滤波电路的直流稳压电源的实物,所以电源电路设计

2

拟采用三端口稳压器7805及整流桥电路来搭建电路以获得+5V电压。本次设计要求采用点阵式液晶显示器,我想用LCD1602作为显示设备。

2.2方案二

当我查阅了有关资料,我就发现了另一型号的单片机,即AVR单片机。结合所学的有关51系列单片机的知识以及对AVR单片机资料的查阅,我了解到,相比之下,AVR单片机比51系列单片机具有更加优良的性能。最重要的是,AVR单片机能够更高效的执行程序代码。而且,我认为,既然已经学习过MCS-51系列的单片机,有了单片机的使用的基础,就应该举一反三,所以,我决定挑战性地使用AVR单片机来完成本次毕业设计。

ATmega8L单片机我曾在以前的开放性试验中接触过,了解到该型号单片机芯片内部集成了较大容量的存储器和丰富的硬件接口电路,适合于本次毕业设计。而且,AVR单片机的价格又与低档单片机的价格相差不大。所以考虑到以上几点,我决定对方案一进行改进,确定使用单片机ATmega8L。

相比而言,方案二在方案一的基础上做了很大的改进,方案二无论是在实现的难易程度,还是在性能的优越程度上都比方案一更佳。

2.3方案三

经过查阅有关点阵式液晶显示器的资料,我发现了另一类型的点阵式液晶显示器即LCD12864模块,该模块自带中文字库,如果使用该模块来完成本次设计将会更易控制,也会使程序更加精简。当LCD工作在并行工作状态时, LCD1602会占用了CPU的很多引脚,这会降低系统的性价比。而LCD12864模块不同,它仅使用几根数据线,就可以完成数据的通信。所以,我决定采用LCD12864模块即KXM12864作为本设计的显示设备。

3主要模块简介

3.1 ATMEGA8简介

Atmega8 的数据吞吐率高达 1MIPS/MHz,可以减缓系统在功耗和处理速度之间的矛盾。

芯片图:

3

图3.1 ATMEGA8芯片图

由上图可知,该芯片有PORTB、PORTC和PORTD三个I/O口。其中,PD0、PD1为串行口复用脚,PD2、PD3为外部中断输入复用引脚,PD4、PD5为定时器输入复用引脚。PC0~PC5为模数转换输入复用引脚,PC6为复位复用引脚。PB6、PB7为外部时钟信号输入复用引脚。AVCC为端口A与A/D转换器的电源,不用ADC时,应将其接VCC。AREF为模拟基准输入复用引脚,不使用,则悬空。

表一 ATmega8的端口引脚配置 DDRXn PORTXn 0 0 0 1 PUD(SFIOR中) X 0 I/O 输入 输入 上拉电阻 关闭 打开 说明 高阻态 被外部电路拉低时输出电流 0 1 1 1 0 1 1 X X 输入 输出 输出 关闭 关闭 关闭 高阻态 输出低电平(漏电流) 输出高电平(源电流) DDRX为端口方向寄存器,当DDRX的某一位置1时,相应端口的引脚作为输出使用。PORTX为端口数据寄存器,当引脚作为输出使用时,PORTX的数据由相应引脚输出。

4

3.2 LCD12864模块简介

3.2.1 KXM12864主要技术参数和性能

本设计采用带中文字库的图形点阵液晶显示器模块,即使用KXM12864作为显示设备。

该显示器模块是一种图形点阵式液晶显示器,能显示4行8列(16*16点阵)共32个汉字,也可以显示字符、图形等。

它主要由行驱动器和列驱动器组成,分辨率为128*64,指的是横向有128个点,纵向有64个点。

它含有国标一级、二级简体中文字库。内部有8192个汉字,所以,常用的汉字在该字库中均能找到。

它还含有16*8个ASCII码字符。

其电源电压宽为+3.0~+6.5V,即工作电压在此范围之间。

工作温度为-20℃ ~+70℃,当超过其工作温度,液晶模块则会反应很慢,或者显示错误。

3.2.2 KXM12864外形尺寸图

了解KXM12864的外形尺寸,可以在做产品时更好地规划设计产品的布局。

5

3.2.3 KXM12864液晶显示指令系统

根据该指令表,可以对该LCD显示模块进行初始化操作。其中,当RS=0,RW=1,功能设定控制字为30H,如果设置D、C、B均为1,则显示状态开关控制字为0FH,清除屏幕控制字为01H,模式设置控制字为06H。

当MCU向该模块写资料时,应当使RS=1,RW=0。这样,就可以向该模块写入指令和数据。之后,即可显示汉字。

6

3.2.4 12864液晶显示动态指标及术语

表二 并行接口模块说明:

管脚号

管脚名称 1 2 3 4

) 5

R/W(S

H/L

ID)

DR

E(SCL

6

K) 7 8 9 10 11 12 13 14 15 16 17 18 19 20

DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 PSB NC RESET NC BLA BLKK

H/L H/L H/L H/L H/L H/L H/L H/L H/L - H/L - VDD VSS

三态数据线 三态数据线 三态数据线 三态数据线 三态数据线 三态数据线 三态数据线 三态数据线

H:8位或4位并口方式,L:串口方式(见注释)

空脚 复位端

LCD驱动电压输出端 背光源正端(+5V) 背光源负端

H/L

使能信号

R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或

VSS VCC V0 RS(CS

H/L

RS=“L”,表示DB7——DB0为显示指令数据 R/W=“H”,E=“H”,数据被读到DB7——DB0

0V +5V -

电源地 电源正

对比度(亮度)调整

RS=“H”,表示DB7——DB0为显示数据

电平

管脚功能描述

*注释:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可

7

以将模块上的J8和“VCC”用焊锡短接。

图3.2.4(a) 8位并行连接时序图

图3.2.4 (b) RS、RW功能设定示意图

8

4硬件设计

4.1设计流程图及设计思路

LCD12864 晶振 ATMEGA8 SWITCHJUMP JUMP MAX232 变压器 整流器 7805 PC机

图4.1硬件电路框图

本设计的设计流程如上图所示,首先要设计出一个+5V的直流稳压电源为该电路提供+5V电压。之后,通过一个RS232电平转换电路来实现PC机电平到单片机电平的转换。最后,通过对ATMEGA8编写程序来控制LCD12864模块显示汉字。其中,该单片机的时钟信号是通过内部振荡方式获得。

9

4.2各模块电路设计

4.2.1电源电路

图4.2.1(a) 直流稳压电路原理

图4.2.1(b) 直流稳压电源电路图

本设计首先需要设计一个+5V的直流稳压电源。如上图所示,220V电源经过变压器降压后,又经过整流器整流,再经三端口稳压器7805稳压,产生+5V电压,给整个电路提供5v的直流电压。其中通过对焊接好的硬件用万用表进行测试,测得从变压器端经变压后的交流电压为+9.36V,再经整流桥电路整流得到方向不变、大小随时间变化的脉动电压,再经滤波电容C1滤去其交流分量,得到比较平滑的直流电压。其中,C1的值取得大一些,有利于减小输出端的波纹电压。之后,经三端口稳压器7805稳压后得到更加稳定的直流电压。最后,使用C2来防止发生意外跳变时,电压输出产生大的跳变,以此提高电源抗瞬间脉冲冲击干扰的能力。

10

5软件设计

5.1 LCD12864模块初始化流程

POWER ON 上电 延时>37ms RESET LOW→HIGH FUNCTION SET 功能设定 控制字 30H RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 1 X 0 X X 延时>100us FUNCTION SET 功能设定 控制字 30H RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 1 X 0 X X 延时>37us DISPLAY ON/OFF CONTROL 显示开/关 控制字0FH RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 1 D C B 延时>100us

16

DISPLAY CLEAR 清除屏幕 控制字:01H RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 0 1 延时>10ms ENTRY MODEL SET 进入模式设置 控制字:06H RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 1 I/D S INITIALIZATION END 初始化结束 图5.1 LCD12864初始化流程图

5.2部分程序代码

5.2.1软件延时

延时程序是本设计中很重要的一部分,因为延时时间的长短不仅能决定该LCD模块能否成功初始化,还决定了人眼能不能看到稳定的显示。在本设计中有两个延时程序,以满足不同延时时间的需要。而且,第二个延时程序的延时时间比第一个延时程序延时时间长。

void delay1(unsigned int t) {

unsigned int j;

17

for( ;t>0;t--)

for (j=19;j>0;j--); }

void delay2(unsigned int t) {

unsigned int j; for( ;t>0;t--)

for (j=6425;j>0;j--); }

5.2.2 端口输出函数

由于本设计中从ATMEGA8单片机中的I/O口输出数据时没有使用某个整体的I/O口,只是使用了其中某个I/O口的一部分。所以传送地址数据时,不能整体传送,只能逐位传送。而本设计中,又需多次使用数据传送。所以为了简便起见,则写了一个从I/O口输出8位数据的write函数,以供传送数据使用。

void write(unsigned char z) {

if ((z&0x01)==0x01)PORTC|=0x08;//0000,1000 PC3=1 else PORTC&=0xf7;//1111,0111 PC3=0

if ((z&0x02)==0x02)PORTC|=0x10;//0001,0000 PC4=1 else PORTC&=0xef;//1110,1111 PC4=0

if ((z&0x04)==0x04)PORTC|=0x20;//0010,0000 PC5=1 else PORTC&=0xdf;//1101,1111 PC5=0

if ((z&0x08)==0x08)PORTB|=0x01;//0000,0001 PB0=1 else PORTB&=0xfe;//1111,1110 PB0=0

if ((z&0x10)==0x10)PORTB|=0x02;//0000,0010 PB1=1 else PORTB&=0xfd;//1111,1101 PB1=0

if ((z&0x20)==0x20)PORTB|=0x04;//0000,0100 PB2=1 else PORTB&=0xfb;//1111,1011 PB2=0

if ((z&0x40)==0x40)PORTB|=0x08;//0000,1000 PB3=1 else PORTB&=0xf7;//1011,1111 PB3=0

if ((z&0x80)==0x80)PORTB|=0x10;//0001,0000 PB4=1 else PORTB&=0xef;//1110,1111 PB4=0 }

5.2.3 写数据函数

由3.2.4中的8位并行时序图及RS、RW功能设定示意图知,RS为高电平时,表示写数据。当RW为低电平时,表示MPU写资料到模块。当E为低电平时,延时一

18

会儿,向I/O口准备数据,到E为高电平时,没有变化。再当E为高电平后,延时一会儿,令E为低电平,则数据写入完全。最后使RW为高电平,RS为低电平,指令书写完成。

void write_12864dat(unsigned char a) {

PORTC|=0x01;//0000,0001 rs=1 PC0=1 写数据 PORTC&=0xfd;//1111,1101 rw=0 PC1=0 PORTC&=0xfb;//1111,1011 e=0 PC2=0 delay1(1); write(a);

PORTC|=0x04;//0000,0100 e=1 PC2=1 delay1(10);

PORTC&=0xfb;//1111,1011 e=0 PC2=0 delay1(2);

PORTC|=0x02;//0000,0010 rw=1 PC1=1 PORTC&=0xfe;//1111,1110 rs=0 PC0=0 }

5.2.4 写指令函数

由3.2.4中的8位并行时序图及RS、RW功能设定示意图知,RS为低电平时,表示写指令。当RW为低电平时,表示MPU写资料到模块。当E为低电平时,延时一会儿,向I/O口准备数据,到E为高电平时,没有变化。再当E为高电平后,延时一会儿,令E为低电平,则数据写入完全。最后使RW为高电平,RS为低电平,指令书写完成。

void write_12864com(unsigned char b) {

PORTC&=0xfe;//1111,1110 rs=0 PC0=0 写指令 PORTC&=0xfd;//1111,1101 rw=0 PC1=0 PORTC&=0xfb;//1111,1011 e=0 PC2=0 delay1(1); write(b);

PORTC|=0x04;//0000,0100 e=1 PC2=1 delay1(10);

PORTC&=0xfb;//1111,1011 e=0 PC2=0

19

delay1(2);

PORTC|=0x02;//0000,0010 rw=1 PC1=0 PORTC&=0xfe;//1111,1110 rs=0 PC0=0 }

5.2.5 初始化函数

要使LCD12864模块显示汉字,必须对该模块进行初始化。由图5.1初始化流程图可知,先打开电源,等待大于40ms,再进行复位操作。本设计是直接将复位端接高电平。之后写入控制字,进行功能设定。接着延时等待,再进行显示开关控制字设定,其中D=1、整体显示ON,C=1、游标ON,B=1、游标位置ON。之后,进行清屏设置。最后,进行模式选择设置,初始化过程结束。

void initinal(void) {

delay2(20);

write_12864com(0x30);//写控制字30H delay1(4);

write_12864com(0x30);//写控制字30H delay1(4);

write_12864com(0x0f);// DCB均为一 delay1(4);

write_12864com(0x01);//清屏设置01H delay2(20);

write_12864com(0x06);//模式设置06H delay1(10); }

5.2.6 显示函数

RAM在液晶中的地址为80H~9FH,地址指针自动加一,将汉字地址送入写指令和写数据函数,即可显示汉字。本显示函数功能是显示一首古诗《锄禾》。

20

void display(void) {

write_12864com(0x80);// RAM区首地址,第一行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);

write_12864dat(0xb3);// “锄” write_12864dat(0xfa); delay2(20);

write_12864dat(0xba);// “禾” write_12864dat(0xcc); delay2(20);

write_12864dat(0xc8);// “日” write_12864dat(0xd5); delay2(20);

write_12864dat(0xb5);// “当” write_12864dat(0xb1); delay2(20);

write_12864dat(0xce);// “午” write_12864dat(0xe7); delay2(20);

write_12864dat(0x2c);// “,” delay2(40);

write_12864com(0x90);//第二行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);

write_12864dat(0xba);// “汗” write_12864dat(0xba); delay2(20);

21

write_12864dat(0xb5);// “滴” write_12864dat(0xce); delay2(20);

write_12864dat(0xba);// “禾” write_12864dat(0xcc); delay2(30);

write_12864dat(0xcf);// “下” write_12864dat(0xc2); delay2(20);

write_12864dat(0xcd);// “土” write_12864dat(0xc1); delay2(20);

write_12864dat(0x2e);// “。” delay2(40);

write_12864com(0x88);//第三行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);

write_12864dat(0xcb);// “谁” write_12864dat(0xad); delay2(20);

write_12864dat(0xd6);// “知” write_12864dat(0xaa); delay2(20);

write_12864dat(0xc5);// “盘” write_12864dat(0xcc); delay2(20);

write_12864dat(0xd6);// “中” write_12864dat(0xd0); delay2(20);

22

write_12864dat(0xb2);// “餐” write_12864dat(0xcd); delay2(20);

write_12864dat(0x2c);// “,” delay2(40);

write_12864com(0x98);//第四行首地址 write_12864dat(0xb0);// “ ” write_12864dat(0xa0); delay2(20);

write_12864dat(0xc1);// “粒” write_12864dat(0xa3); delay2(20);

write_12864dat(0xc1);// “粒” write_12864dat(0xa3); delay2(20);

write_12864dat(0xbd);// “皆” write_12864dat(0xd4); delay2(20);

write_12864dat(0xd0);// “辛” write_12864dat(0xc1); delay2(20);

write_12864dat(0xbf);// “苦” write_12864dat(0xe0); delay2(20);

write_12864dat(0x2e);// “。” delay2(40); }

5.3程序调试中的注意问题

1、数据类型要正确,头文件要包含iom8v.h和macros.h。

23

2、延时函数的使用。在初始化及显示函数中,延时时间要适当长些,以正常稳定地显示汉字。所以,在编写程序时,我编写了两个延时函数,以供不同延时时间的需要。同时,在进行LCD显示时,我发现每个汉字显示时,同样要较长时间的延时间隔,以达到观察清晰的效果。

3、PORTB和PORTC均为输出,所以应将DDRX相应位设为1,即打开PORTB和PORTC端口。

4、逻辑运算符号不能出错,‘&’表示按位与的运算,‘&&’表示和运算。我在编写程序时,将write函数中的‘&’写成了‘&&’,导致程序编译时正确,但将程序写入芯片时,LCD却不能显示汉字。

5、值得提出的是,当硬件焊接完成,程序编写完成后,将程序下载到单片机上时,LCD并没有出现预期的结果,即并没有显示汉字。这时,当初步检查了程序和硬件焊接均无误后,继续下载程序,但仍然不显示汉字。所以,就用了一个测试函数来测试该单片机是否焊接正确。该函数为:

Void test (void) {

DDRB=0XFF; DDRC=0XFF;

PORTC|=0x08;//0000,1000 PC3=1 //PORTC&=0xf7;//1111,0111 PC3=0 PORTC|=0x10;//0001,0000 PC4=1 //PORTC&=0xef;//1110,1111 PC4=0 PORTC|=0x20;//0010,0000 PC5=1 //PORTC&=0xdf;//1101,1111 PC5=0 PORTB|=0x01;//0000,0001 PB0=1 //PORTB&=0xfe;//1111,1110 PB0=0 PORTB|=0x02;//0000,0010 PB1=1 //PORTB&=0xfd;//1111,1101 PB1=0 PORTB|=0x04;//0000,0100 PB2=1 //PORTB&=0xfb;//1111,1011 PB2=0 PORTB|=0x08;//0000,1000 PB3=1 //PORTB&=0xf7;//1011,1111 PB3=0 PORTB|=0x10;//0001,0000 PB4=1 //PORTB&=0xef;//1110,1111 PB4=0 }

执行该函数后,用万用表分别测试ATMEGA8的PC3、PC4、PC5、PB0、PB1、PB2、

24

PB3、PB4是否均为高电平;之后再修改上述函数将相应端口的位置为0,再用万用表分别测试ATMEGA8的PC3、PC4、PC5、PB0、PB1、PB2、PB3、PB4是否均为低电平。

通过测试,发现将ATMEGA8的第23引脚和第24引脚相连了,经过拨离后,执行该函数,并进行硬件检测,得出结果ATMEGA8焊接最终正常。

再次进行下载程序,但LCD仍然没有显示汉字。之后,又进行了对RS,RW,E引脚的检测。检测函数为:

Void test2(void)

{

DDRB=0XFF; DDRC=0XFF;

PORTC|=0x01;//0000,0001 rs=1 PC0=1 PORTC&=0xfd;//1111,1101 rw=0 PC1=0 PORTC&=0xfb;//1111,1011 e=0 PC2=0 PORTC&=0xfe;//1111,1110 rs=0 PC0=0 PORTC|=0x02;//0000,0010 rw=1 PC1=0 PORTC|=0x04;//0000,0100 e=1 PC2=1 }

检测方法同上,检测结果为焊接正确。

鉴于以上检测,则对initial函数进行检测。由于initial函数中先执行延时函数,之后执行了write_12864com函数,则进入write_12864com函数检测,而该函数在执行了RS=0,RW=0和E=0后,又执行了延时函数,上面已检测过RS、RW、E均无焊接错误,且延时函数无误,接着,执行write函数。于是进行write函数检测,检测函数为:

Void test3(void) {

DDRB=0XFF; DDRC=0XFF; Write_12864com(0x30); }

void write_12864com(unsigned char b) {

PORTC&=0xfe;//1111,1110 rs=0 PC0=0 PORTC&=0xfd;//1111,1101 rw=0 PC1=0 PORTC&=0xfb;//1111,1011 e=0 PC2=0

25

delay1(1); /*

PORTC|=0x04;//0000,0100 e=1 PC2=1 delay1(10);

PORTC&=0xfb;//1111,1011 e=0 PC2=0 delay1(2);

PORTC|=0x02;//0000,0010 rw=1 PC1=0 PORTC&=0xfe;//1111,1110 rs=0 PC0=0 */ }

如果上述函数正确执行,则使用万用表测得的结果应为:PC0=0、PC1=0、PC2=0、PC3=0、PC4=0、PC5=0、PB0=0、PB1=1、PB2=1、PB3=0、PB4=0。然而,发现测得的结果与预期结果不同,所以发现了问题。经仔细检查程序,发现将write函数中的‘&’写成了‘&&’,导致程序编译时正确,但将程序写入芯片时,LCD却不能显示汉字。经过改正后,重新向ATMEGA8中下载程序,结果LCD显示出汉字,程序调试成功。

26

6实物与实测效果展示

6.1实物展示

图6.1(a) 硬件实物图

图6.1(b) AVR开发板实物图

27

6.2实测效果展示

图6.2 显示汉字

28

结论

本设计主要是设计一个微处理器控制的点阵式液晶显示器的控制电路。所以,经过认真分析和结合以前所学知识,我采用ATMEGA8作为MPU来控制KXM12864模块显示汉字。在本次设计中,经过多次调试与检错,最终实现了显示汉字的功能。

本设计要实现的功能并不复杂。简而言之,就是使用一个单片机来控制LCD液晶模块显示汉字。然而,我认为本设计较为复杂之处就是硬件电路的焊接。其中最重要的就是ATMEGA8芯片的焊接,由于该芯片是贴片式的,以前接触较少,所以焊接时发生了短路及虚焊等错误。其次就是LCD模块的20个引脚的焊接,由于这些引脚相邻间隔小,导致焊接出现短路情况。然而,经过改正,焊接正常。之后,就是AVR开发板的其它电路元件的焊接,由于之前做过焊接的实验,所以,这部分焊接较熟练。最后,就是软件设计,该部分采用C语言设计,由于实现功能较为简单,因此,设计时也较易完成。

客观地说,本设计较为容易,虽然实现了最基本的显示汉字的功能,但并没有更多的展示出单片机对LCD模块控制的效果。这样,本设计给人的感觉较为单一,不能丰富多彩的展示单片机对LCD模块控制的优势。所以,为了更多地展示出单片机的强大功能,可以给单片机增加输入设备如按键等,增加文字和字符的显示效果,如滚动、闪烁等。这样可以根据按键按下的键来显示相应的效果。同时,还需要编写相应的程序来实现这些效果。

29

感言

当我的硬件焊接完成,同时软件调试成功,当将程序下载到单片机上,LCD模块显示出汉字时,我觉得很有成就感。因为,终于凭借着自己的努力,我完成了本次毕业设计的实物制作部分。虽然,这个过程中出现了这样或那样的问题,但是经过认真分析和改正都顺利地解决了。

毕业设计接近尾声,我感触很多。回想当初,当刚看到毕业设计题目时,我有一些迷茫,不知从何处开始做起。但是,当询问了指导老师后,我对该题目有了初步的认识。之后,就结合以前所学知识,对该设计进行认真分析。最后确定使用ATMEGA8单片机作为微控制器来控制KXM12864模块显示汉字来诠释本课题。

当我真正开始硬件设计图的设计时,发现我对Protel99se 软件的使用已经生疏。所以,我又重新查看了有关该软件使用的资料。之后,发现本设计就是对各科知识的综合应用,其中主要使用了模拟电子技术和单片机原理方面的知识。当电路图设计出之后,就是对电路板的焊接。虽然,在以前的课程中都做过焊接的实验,但是由于动手能力不强,对于硬件焊接,仍然比较困难。但在老师的帮助下,我最终完成了硬件的焊接工作。接着就是编写程序,由于要实现的功能较为简单,所以,这一部分很快就完成了。

但是当我将程序下载到单片机时,则没有出现预期的结果。所以就开始对硬件和软件进行调试,最终发现设计的硬件和软件方面均存在问题。改正后,则出现了正确的结果。因此,我认为,其实按部就班地做设计并不困难,困难的是当没有出现预期结果时怎样找到用来发现问题、分析问题和解决问题的方法。比如,在程序编写中测试函数的编写和测试,这就是我用来发现问题的方法。经过本设计,我更加明白了发现问题、分析问题和解决问题重要性。同时,经过本设计,提高了我的动手能力和编程能力,使我对软件和硬件的结合有了更进一步的理解。还有,这次毕业设计,锻炼了我的耐心,使我明白了当设计没有达到预期结果时,应该沉着、冷静地检查、分析、调试,不能急躁。只有这样,才能最快速地发现和解决问题、完成设计。所以,综上所述,我从本次毕业设计中受益匪浅。

30

致谢

毕业设计完成了,我感触很多。首先,感谢我的毕业设计的指导老师的指导。在本次设计中,指导老师给予了我很大的帮助。从硬件的焊接到软件的调试。首先,是AVR单片机开发板的焊接,在该开发板设计过程中,老师给予我们很多指导。从芯片的选择到具体的电路的设计,还有开发板的元件和电路布局等,老师都给予了我们很多建议。

同时,我也感谢我的同学,在本次设计中,由于我和几位同学使用的单片机相同,所以在单片机开发板上有些不懂的问题,我就问同学,他们都认真给我解答。

当然,对于本次毕业设计的顺利完成,我还要感谢我敬爱的母校,感谢学校能给我们提供做设计的实验室,能让我们更好地完成设计。

要想完成一个毕业设计,需要大学四年的知识的综合应用。比如,本次毕业设计用到了模拟电子技术、数字电子技术、电路分析、单片机原理、C语言程序设计、Protel软件的使用等方面的专业知识。这些知识的获得都来源于我的这些专业课程的老师们。所以,我很感谢我敬爱的老师们对我们的辛勤的培养。正是因为有了老师们的辛勤培养,才有了我现在所掌握的专业知识,才可以使我能够顺利完成本次毕业设计。

不仅如此,老师们在教会我们知识的同时,还以身作则地教会了我们对待学问的态度。老师们的言传身教使我们懂得了更多的学习和做人方面的道理。这些不仅督促着我在以后的学习中,更加努力地学习专业知识,还成为了我以后人生道路上的指路明灯,指引着我将来能更好、更稳地前行。所以,在此,我想我敬爱的老师们表达我深深的敬意。

31

参考文献

[1] 肖看,李群芳.单片机原理、接口及应用[M].北京:清华大学出版社,2010.9. [2] 沈文,Eagle lee,詹卫前.AVR单片机C语言开发入门指导[M].北京:清华大学出版社,2003.

[3] 童诗白,华成英.模拟电子技术基础[M].北京:高等教育出版社,2006.5. [4] 杨志毅.直流稳压电源中电容器的作用[J].河南科技,1988年11期.

[5] 王聪敏,李少娟等.直流稳压电源的设计[J].西安邮电学院学报,2011年11月. [6] 李维諟,郭强,周云仙.液晶显示应用手册[M].北京:电子工业出版社,2002. [7] 谷树忠, 闫胜利.Protel 2004实用教程:原理图与PCB设计[M]. 北京:电子工业出版社,2005.

[8] 郭强.点阵式液晶显示器[J].电子技术应用,1989年12期. [9] 李长林.AVR单片机应用设计[M].北京:电子工业出版社,2005.9.

[10] 金钟夫.AVR ATmega128单片机C程序设计与实践[M]. 北京:北京航空航天大学出版社,2008.

[11] 丁化成.AVR单片机应用设计[M].北京:北京航空航天大学出版社,2002.5. [12] 刘永智, 杨开愚等.液晶显示技术[M]. 成都:电子科技大学出版社,2000. [13] 周明德.微机原理和应用计算机系统[M].北京:清华大学出版社,2007.

32

附录A

硬件原理图(基于protel99se)

33

附录B

程序代码

#include #include

void delay1(unsigned int t) {

unsigned int j; for( ;t>0;t--) for (j=19;j>0;j--);} void delay2(unsigned int t) {

unsigned int j; for( ;t>0;t--) for (j=6425;j>0;j--); }

void write(unsigned char z) {

if ((z&0x01)==0x01)PORTC|=0x08;//0000,1000 else PORTC&=0xf7;//1111,0111 if ((z&0x02)==0x02)PORTC|=0x10; else PORTC&=0xef;//1110,1111

if ((z&0x04)==0x04)PORTC|=0x20;//0010,0000 else PORTC&=0xdf;//1101,1111 if ((z&0x08)==0x08)PORTB|=0x01; else PORTB&=0xfe;//1111,1110

if ((z&0x10)==0x10)PORTB|=0x02;//0000,0010 else PORTB&=0xfd;//1111,1101, if ((z&0x20)==0x20)PORTB|=0x04; else PORTB&=0xfb;//1111,1011,

34

if ((z&0x40)==0x40)PORTB|=0x08;//,0100,0000 else PORTB&=0xf7;//1011,1111, if ((z&0x80)==0x80)PORTB|=0x10; else PORTB&=0xef;//1110,1111, }

void write_12864dat(unsigned char a) {

PORTC|=0x01;//0000,0001,rs=1 PORTC&=0xfd;//1111,1101,rw=0 PORTC&=0xfb;//1111,1011,e=0 delay1(1); write(a);

PORTC|=0x04;//0000,0100,e=1 delay1(10);

PORTC&=0xfb;//1111,1011,e=0 delay1(2);

PORTC|=0x02;//0000,0010,rw=1 PORTC&=0xfe;//1111,1110,rs=0 }

void write_12864com(unsigned char b) {

PORTC&=0xfe;//1111,1110,rs=0 PORTC&=0xfd;//1111,1101,rw=0 PORTC&=0xfb;//1111,1011,e=0 delay1(1); write(b);

PORTC|=0x04;//0000,0100,e=1 delay1(10);

PORTC&=0xfb;//1111,1011,e=0 delay1(2);

35

本文来源:https://www.bwwdw.com/article/rmz.html

Top