点阵液晶显示实验报告

更新时间:2024-01-19 08:45:01 阅读量: 教育文库 文档下载

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

单片机实验

课程名称:点阵液晶汉字显示实验 授课班级:10自动化三班 任课教师:文远熔 计划学时:32学时

实验组员:张腾耀 梁钦 赵福亮 秦菱蔚 郑欢 王聪慧

摘 要

本文介绍了PROTEUS与Keil联调开发51系列单片机应用系统的方法以及基于PROTEUS环境下的12864液晶显示的仿真设计。将Keil C开发的程序用Proteus设计的仿真电路中交互运行调试的方法,设计12864的液晶显示汉字图像。在基于PROTEUS环境下的12864液晶显示的仿真设计中,使用51芯片控制,然后显示在12864显示屏上,最多可显示4行每行8个汉字,并且可以通过按键随时改变12864显示屏上的内容。通过Proteus环境下的温度报警器的仿真实验证明,在PROTEUS环境下可以完成单片机系统的硬件设计和软件调试,测试系统的性能,在实际应用中可以降低设计成本,缩短开发周期,提高效率。

关键词:Proteus;仿真;单片机;12864

第 2 页 共 27 页

目录

第一章 绪论

1.1实验任务和要求???????????????????????..1

1.2 基于Proteus的12864显示的研究???????????????.1 . 1.3 实验方案及原理??????????????????????..1

第二章 点阵液晶汉字显示的硬件部分

2.1程序流程图?????????????????????????.2 2.2硬件电路图???????????????????????. 2.3芯片12864的简介?????????????????????

第三章 点阵液晶汉字显示的软件部分

3.1 Keil简介??????????????????????????. 3.2 Proteus简介????????????????????????. 3.3 Proteus与Keil软件联合仿真的建立??????????????.

第四章 结论

4.1实验总结??????????????????????????.

附录1:点阵液晶汉字显示的源程序

第 3 页 共 27 页

第一章 绪论

1.1 实验任务和要求

用LCD128x64点阵液晶显示器显示指定汉字,最多可以显示4行、8个/行汉字,通过键盘可以随时改变显示的内容。准备汉字字库不少于50个汉字。

1.2 基于Proteus的12864显示的研究

Proteus是基于SPICE3F5仿真引擎的混合电路仿真软件,不仅能够仿真模拟、数字电路以及模数混合电路,更具特色的是PROTEUS能够仿真基于单片机的电子系统。PROTEUS不但完全支持MCS-51及其派生系列单片机的设计系统,另外也能仿真基于AVR和PIC系列的单片机系统。PROTEUS软件可提供的模拟和数字、交流和直流等元器件库多达30多个,共计数千种元器件。此外,对于元件库中没有的器件,使用者也可依照需要自己创 建。在软件调试方面,PROTEUS自身只带汇编编译器,不支持C语言,但可以与Keil C51集成开发环境连接,将用汇编和C语言编写的程序编译好之后,可以立即进行软、硬件结合的系统仿真,像使用仿真器一样来调试程序[1]。

我们使用Proteus软件从元器件的选取到连线直至电路的调试、分析和软件的编译都是在计算机中完成,即所有的工作先在虚拟环境中进行。因此,在原理图的设计阶段就可以对设计进行评估,验证所设计电路是否达到设计要求的技术指标,还可以通过改变元器件参数使整个电路性能达到最优化,以节省设计时间与经费,提高设计效率与质量。

1.3 实验方案及原理

12864点阵液晶显示模块由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。要显示某个图形或汉字将相应的点阵信息写入到相应的存储单元中,并处理好显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。我们使用的液晶显示模块由两片列驱动器构成,也就是说12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择,如选择做半屏,则选择01,右半屏则选择10.每一屏又分为4页,每页4列。显示汉字则只需写出相应的地址然后查表即可显示出。

第 4 页 共 27 页

第二章 点阵液晶汉字显示的硬件部分

2.1程序流程图

开始 初始化 延时 开左半屏 显示左半屏上部分显示左半屏下部分开右半屏 显示右半屏上部分显示右半屏下部分

2.2硬件电路图

第 5 页 共 27 页

设置按键和数量 初始化 有键按下 除抖动 确认按键 读入按键内容,屏蔽其他按键返回

2.3芯片12864的简介

12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。 管脚号 1 2 3 4

管脚名称 VSS VDD V0 D/I(RS)

LEVER 0

电源地

管脚功能描述

+5.0V 电源电压 - H/L

液晶显示器驱动电压

D/I=“H”,表示DB7∽DB0为显示数据 D/I=“L”,表示DB7∽DB0为显示指令数据

5 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W=“L”,E=“H→L”数据被写到IR或DR

第 6 页 共 27 页

6 E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0 R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0

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

DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 CS1 CS2 RET VOUT LED+ LED-

H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L

数据线 数据线 数据线 数据线 数据线 数据线 数据线 数据线

H:选择芯片(右半屏)信号 H:选择芯片(左半屏)信号 复位信号,低电平复位

-10V LCD驱动负电压 - -

LED背光板电源 LED背光板电源

表1:12864LCD的引脚说明

在使用12864LCD前先必须了解以下功能器件才能进行编 1. 指令寄存器(IR)

IR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR。

2.数据寄存器(DR)

DR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。

3.忙标志:BF

BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。

利用STATUS READ指令,可以将BF读到DB7总线,从检验模块之工作状态。

4.显示控制触发器DFF

第 7 页 共 27 页

此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY OFF),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。 DDF的状态是指令DISPLAY ON/OFF和RST信号控制的。

5.XY地址计数器

XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。

X地址计数器是没有记数功能的,只能用指令设置。

Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。

6.显示数据RAM(DDRAM)

DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。

7.Z地址计数器

Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。

Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。

第 8 页 共 27 页

第三章 点阵液晶汉字显示的软件部分

3.1 Keil简介 Keil

[11]

是由美国Keil Software公司出品的单片机开发工具,它是目前最流行的单

片机开发工具之一,该软件平台主要包括:C51交叉编译器、A51宏汇编器、BL51连接/重定位器、LIB51库管理器、OH51 Intel HEX格式文件转换器、RTX-51实时操作系统以单片机软件仿真Dscope 51,它将项目管理、源代码编译、程序调试等集成到一个功能强大的Windows 32平台中,支持51汇编、PLM和C语言的混合编程,功能强大、界面友好、易学易用。Proteus是由英国Labcenter公司开发的EDA工具软件,它同其他EDA工具软件一样,能进行原理图编辑、PCB自动及手动布线和电路仿真,而它的特点就在于其强大的仿真功能,不仅可以仿真模拟、数字电路,还可以仿真可编程器件,如单片机、PLD等

使用独立的Keil仿真器时,注意事项 :

1.仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。

2.仿真器上的复位按钮只复位仿真芯片,不复位目标系统。

3.仿真芯片的31脚(EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的EA引脚接至低电平)的目标系统中使用。 Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

3.2 Proteus简介

Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,是一个电子设计的教学平台、实验平台和创新平台,涵盖了电工电子实验室、电子技术实验室、单片机应用实验室等的全部功能。它是一种组合了高级原理布图、混合模式SPICE仿真、PCB设计以及自动布线进行完整的电子设计的软件。采用Proteus仿真软件进行虚拟单片机实验,可以仿真单片机及其外围器件电路,可用来仿真51系列、AVR、PIC等常用的MCU及其外围电路,具有比较明显的优势,如涉及到的实验实习内容全面、硬件投入少、学生可以自行实验、实验过程

第 9 页 共 27 页

[6]

中损耗小、与工程实践最为接近等。它提供了30多个元件库,数千种元件,涉及到数字和模拟、交流和直流等,并且有丰富的仪表资源。

3.3Proteus与Keil软件联合仿真的建立

Proteus软件与Keil uVision3软件之间可有相互独立和相互联合两种方式进行单片机系统的虚拟仿真。如用Proteus软件独立进行虚拟仿真,就是用Keil uVision3软件的编辑控制程序,在Keil uVision3软件的Option for Target“Target1”选项卡Output中选择Create HEX File选项,然后进行编译,生成*.HEX文件如图3-1。然后,将该文件转到Proteus的ISIS模块中,在所仿真的电路中打开单片机的编辑对话框Edit Component如图3-2,在此窗口中的Program File栏中,选择通过编译生成的*.HEX文件,并在Clock Frequency栏中设置单片机的晶振频率,点击OK完成Edit Component窗口的设置。最后,点击Proteus软件的仿真启动按钮实现电路的仿真。

第 10 页 共 27 页

Proteus软件与Keil uVision3软件之间的联合虚拟仿真,指Keil uVision3软

件将Proteus软件打开的单片机系统看成一个虚拟的硬件电路,使用Keil uVision3软件对程序进行编译、调试时自动连接Proteus软件中的虚拟单片机系统,虚拟单片机系统的状态随Keil uVision3软件对程序调试实时变化。这样,可实现用Proteus软件与Keil uVision3软件联合虚拟硬件仿真。要实现联合虚拟硬件仿真就必须对Proteus软件与KeiluVision3软件进行如下设置:

1.安装好Proteus软件和Keil uVision3软件后,安装压缩包中的vdmagdi.exe文件,此时在路径为Keil\\c51\\bin的文件夹里有VDM51.DLL文件。

2.将压缩包中的Prospice.dll文件复制到Proteus7.1根目录的BIN文件夹中,并将原来的文件覆盖。

3.在Proteus软件中打开要仿真的单片机系统原理图,并在Debug菜单中选择Use remote debug monitor。

4.在Keil uVision3软件中打开要进行联合仿真的项目和程序,点击Project并 在Option for Target“Target1”选项卡Debug中选择Use Proteus VSM Simulator。然后,点击Setting按钮进入Host IP和端口Port的设置,如果在同一台计算机上进行联合仿真,则Host IP地址为127.0.0.1,端口设置为8000。如果两台计算机通过互联网

第 11 页 共 27 页

进行联合仿真,则Host IP地址为这台计算机的网上IP地址,端口也为8000,这样,就可以实现一台计算机的Keil uVision3软件平台通过互联网去连接远程的另一台计算机,并远程控制另一台计算机的Proteus软件实现虚拟仿真。按上述的步骤进行设置后,Proteus软件和Keil uVision3软件之间即可进行联合仿真。

第 12 页 共 27 页

第四章 结论

4.1 实验心得体会

通过这次综合实验,我们小组有很多的心得体会,有些关于单片机的,更多的是有关于人与人之间关系方面的。从开始接触题目到系统的实现,再到设计说明书的完成,每走一步对我来说都是新的尝试与挑战。这次课程设计经历颇多,受益颇多让我巩固了学过的知识,获得了很多新的知识虽然开始的时候可以说是举步维艰,但是当自己真正的用心去做的时候才发现事情本身也并没有想象中的那么难。我现在是切实感受到了用心。我相信我会一直坚守这个信念去指引我接下来的人生道路。

本设计利用Proteus与KEIL C51对单片机点阵液晶汉字显示进行了仿真设计.在

方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且我们熟练掌握了有关器件的性能及测试方法。从设计结果可以看出,利用Proteus进行单片机系统的仿真设计可以极大地简化单片机程序在目标硬件上的调试工作,程序修改、编译后很快能看到效果,大幅度节省制作电路板的时间,非常适合于设计开发,对于提高产品的开发效率、降低开发成本等有重要意义。

感谢老师的辅导,让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。

第 13 页 共 27 页

附录1:点阵液晶汉字显示的源程序

#include #define uchar unsigned char #define uint unsigned int

sbit CS1=P2^3; //LCD右屏幕 sbit CS2=P2^4; //LCD左屏幕

sbit RS=P2^0; //LCD数据、指令寄存器 sbit RW=P2^1; //LCD读、写操作 sbit E=P2^2;

sbit key_up=P3^6;

uchar select,flag;

/*======================自定义汉字字库=================*/ uchar code hanzi[]={ /*-- 文字0: 预 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0xF9,0xFE,0x08,0x20,0x50,0x40,0x21,0xFC,0x11,0x04,0xFD,0x24,0x25,0x24, 0x29,0x24,0x21,0x24,0x21,0x24,0x21,0x44,0x20,0x50,0x20,0x88,0xA1,0x04,0x42,0x02

/*-- 文字1: 祝 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x20,0x00,0x13,0xFC,0x12,0x04,0xFA,0x04,0x0A,0x04,0x12,0x04,0x13,0xFC,0x38,0x90, 0x54,0x90,0x94,0x90,0x10,0x90,0x11,0x12,0x11,0x12,0x12,0x12,0x14,0x0E,0x18,0x00

/*-- 文字2: 文 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x08,0x08,0x08,0x08,0x78,0x88,0x09,0x0E,0x08,0x88,0x78,0x08,0x08,0x08,0x08,0x00, 0x40,0x40,0x40,0x20,0x20,0x11,0x0A,0x04,0x0A,0x11,0x10,0x20,0x60,0x20,0x20,0x00,

/*-- 文字3: 老 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0xC4,0xC4,0x44,0x64,0x54,0x4E,0x44,0x40,0x00, 0x08,0x08,0x04,0x04,0x02,0x3E,0x49,0x48,0x44,0x44,0x42,0x42,0x40,0x70,0x00,0x00,

/*-- 文字4: 师 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0xFC,0x00,0x00,0xFF,0x00,0xF2,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xF2,0x00, 第 14 页 共 27 页

//LCD使能信号,下降沿有效

0x40,0x27,0x10,0x0E,0x01,0x00,0x0F,0x00,0x00,0x00,0xFF,0x00,0x04,0x08,0x07,0x00,

/*-- 文字5: 春 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x02,0x00,0xFF,0xFE,0x08,0x20, 0x10,0x10,0x2F,0xE8,0xC8,0x26,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0

/*-- 文字6: 节 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x08,0x20,0x00,0x00,0x7F,0xF8,0x02,0x08, 0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x50,0x02,0x20,0x02,0x00,0x02,0x00,0x02,0x00

/*-- 文字7: 快 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x70,0x00,0xFF,0x08,0xB0,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0xF8,0x80,0x80,0x00, 0x00,0x00,0xFF,0x00,0x80,0x40,0x30,0x0E,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,

/*-- 文字8: 乐 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x40,0xFC,0x44,0x44,0x44,0x46,0xFA,0x42,0x43,0x43,0x42,0x40,0x00,0x00, 0x00,0x20,0x18,0x0C,0x07,0x12,0x20,0x40,0x3F,0x00,0x00,0x02,0x0C,0x38,0x10,0x00,

/*-- 文字9: 组 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x20,0x38,0xA7,0x62,0x18,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00, 0x00,0x22,0x23,0x22,0x12,0x12,0x20,0x3F,0x22,0x22,0x22,0x22,0x3F,0x20,0x20,0x00,

/*-- 文字10: 员 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x00,0xE0,0x2F,0x29,0x29,0xA9,0x29,0x29,0x29,0x2F,0xE0,0x00,0x00,0x00, 0x00,0x00,0x80,0x8F,0x40,0x20,0x18,0x07,0x08,0x10,0x20,0xE0,0x4F,0x00,0x00,0x00,

/*-- 文字11: --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*-- 文字12: 张 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 第 15 页 共 27 页

/*

自定义延时子函数 */

void delayms(uchar z) {

int x,y; for(x=z;x>0;x--) for(y=300;y>0;y--); } /*

判断LCD忙信号状态 */ void buys() {

int dat; RW=1; RS=0; do {

P0=0x00; E=1; dat=P0; E=0;

dat=0x80 & dat; } while(!(dat==0x00)); } /*

LCD写指令函数 */

void w_com(uchar com) {

buys(); RW=0; RS=0; E=1; P0=com; E=0;

第 21 页 共 27 页

} /*

LCD写数据函数 */

void w_date(uchar date) {

buys(); RW=0; RS=1; E=1; P0=date; E=0; } /*

LCD选屏函数 */

void select_screen(uchar screen) {

switch(screen) {

case 0: //选择全屏 CS1=0;

CS2=0; break;

case 1: //选择左屏 CS1=0;

CS2=1; break;

case 2: //选择右屏 CS1=1;

CS2=0; break;

case 3: //选择黑屏 CS1=1;

CS2=1;

break; 第 22 页 共 27 页

} } /*

LCD清屏函数:清屏从第一页的第一列开始,总共8页,64列 */

void clear_screen(screen) {

int x,y;

select_screen(screen); //screen:0-选择全屏,1-选择左半屏,2-选择右半屏 for(x=0xb8;x<0xc0;x++) //从0xb8-0xbf,共8页 {

w_com(x);

w_com(0x40); //列的初始地址是0x40 for(y=0;y<64;y++) {

w_date(0x00); } } } /*

LCD显示汉字字库函数 */

void lcd_display_hanzi(uchar screen,uchar page,uchar col,uint mun)

{ //screen:选择屏幕参数,page:选择页参数0-3,col:选择列参数0-3,mun:显示第几个汉字的参数 int a; mun=mun*32; select_screen(screen); w_com(0xb8+(page*2)); w_com(0x40+(col*16)); for ( a=0;a<16;a++) {

w_date(hanzi[mun++]); }

第 23 页 共 27 页

w_com(0xb8+(page*2)+1); w_com(0x40+(col*16)); for ( a=0;a<16;a++) {

w_date(hanzi[mun++]); } } /*

LCD初始化函数 */

void lcd_init() {

w_com(0x3f); //LCD开显示

w_com(0xc0); //LCD行初始地址,共64行 w_com(0xb8); //LCD页初始地址,共8页 w_com(0x40); //LCD列初始地址,共64列 }

void init() {

EA=1;

EX0=1; IT0=1;

lcd_init(); //LCD初始化

//开CPU总中断

clear_screen(0); //LCD清屏幕 }

void lcd_display_0() {

if(flag==1) {flag=0;clear_screen(0);}

lcd_display_hanzi(1,0,0,0); lcd_display_hanzi(1,0,1,45);

lcd_display_hanzi(1,0,2,1); lcd_display_hanzi(1,0,3,2);

lcd_display_hanzi(2,0,0,3);、

第 24 页 共 27 页

lcd_display_hanzi(1,1,2,4); lcd_display_hanzi(1,1,3,5); lcd_display_hanzi(2,1,0,6); lcd_display_hanzi(2,1,1,7);

lcd_display_hanzi(1,2,2,8);

lcd_display_hanzi(1,3,2,10); lcd_display_hanzi(1,3,3,11); lcd_display_hanzi(2,3,0,6); lcd_display_hanzi(1,2,3,9); lcd_display_hanzi(2,2,0,6); lcd_display_hanzi(2,2,1,7);

lcd_display_hanzi(2,3,1,7); lcd_display_hanzi(1,3,3,17); }

void lcd_display_1() {

if(flag==1) {flag=0;clear_screen(0);}

lcd_display_hanzi(1,0,0,0);

lcd_display_hanzi(1,0,1,45);

lcd_display_hanzi(1,1,1,1); lcd_display_hanzi(1,1,2,2);

lcd_display_hanzi(1,2,1,46);

lcd_display_hanzi(1,2,2,47); lcd_display_hanzi(1,2,3,48); lcd_display_hanzi(2,2,0,49);

lcd_display_hanzi(1,3,3,50); lcd_display_hanzi(2,3,0,48); lcd_display_hanzi(2,3,2,51); lcd_display_hanzi(2,3,2,52); }

void lcd_display_2() 第 25 页 共 27 页

lcd_display_hanzi(1,1,3,3);

{

if(flag==1) {flag=0;clear_screen(0);} lcd_display_hanzi(1,0,0,12);

lcd_display_hanzi(1,1,1,17);

lcd_display_hanzi(1,1,2,18); lcd_display_hanzi(1,1,3,19); lcd_display_hanzi(2,1,1,15);

lcd_display_hanzi(1,2,1,15); lcd_display_hanzi(1,2,2,22); lcd_display_hanzi(2,1,2,16); lcd_display_hanzi(1,0,1,13); lcd_display_hanzi(1,0,2,45);

lcd_display_hanzi(1,2,3,22);

lcd_display_hanzi(2,2,1,20); lcd_display_hanzi(2,2,2,21);

lcd_display_hanzi(1,3,1,23);

lcd_display_hanzi(1,3,2,24); lcd_display_hanzi(1,3,3,25); lcd_display_hanzi(2,3,1,26);

}

void lcd_display_3() {

if(flag==1) {flag=0;clear_screen(0);} lcd_display_hanzi(1,0,0,29);

lcd_display_hanzi(1,0,1,30); lcd_display_hanzi(1,0,2,31); lcd_display_hanzi(1,0,3,32);

lcd_display_hanzi(1,1,3,34); lcd_display_hanzi(2,0,0,33); lcd_display_hanzi(2,3,2,27);

lcd_display_hanzi(2,1,0,35);

lcd_display_hanzi(2,1,1,36); lcd_display_hanzi(2,1,2,37); lcd_display_hanzi(2,1,3,28);

第 26 页 共 27 页

lcd_display_hanzi(1,2,0,38);

lcd_display_hanzi(1,2,1,39);

lcd_display_hanzi(1,2,2,40); lcd_display_hanzi(1,2,3,41); lcd_display_hanzi(2,2,0,42);

lcd_display_hanzi(2,2,1,43); lcd_display_hanzi(2,2,2,44);

}

void main(void) { init(); while(1) {

switch(select) } }

void EX0_ISR() interrupt 0 { flag=1; if(key_up==0) select++; else select--; select%=4; }

{

case 0:lcd_display_0();break;

case 1:lcd_display_1();break; case 2:lcd_display_2();break; case 3:lcd_display_3();break;

}

第 27 页 共 27 页

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

Top