TFT-LCD的指针式时钟设计毕业论文.doc_第1页
TFT-LCD的指针式时钟设计毕业论文.doc_第2页
TFT-LCD的指针式时钟设计毕业论文.doc_第3页
TFT-LCD的指针式时钟设计毕业论文.doc_第4页
TFT-LCD的指针式时钟设计毕业论文.doc_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

苏州科技学院本科生毕业设计(论文)TFT-LCD的指针式时钟设计毕业论文目 录第1章绪论11.1引言11.2选题背景1第2章指针式时钟显示设计硬件环境简介22.1 DMAVR-128开发板结构图22.2 ATmega128简介22.3 系统设计模块62.3.1 系统电源模块62.3.2 单片机及时钟和复位模块72.3.3 单片机的I/O 接口82.3.4 蜂鸣器发声模块82.3.5 DS1302 实时时钟模块92.3.6 TFT 高质量彩屏液晶显示模块92.3.7 ISP下载接口和JTAG 调试接口模块10第3章指针式时钟硬件模块设计113.1 设计要求113.2硬件设计方案113.3 关键模块设计113.3.1 DS1302实时时钟芯片113.3.2 TFT液晶显示模块15第4章系统软件设计174.1 软件环境介绍174.1.1 AVR Studio开发平台174.1.2 ICCAVR 平台174.2 DMAVR-128指针式日历时钟程序184.2.1 程序框图184.2.2 源程序184.3 DS1302实时时钟芯片驱动程序244.3.1 程序框图244.3.2 源程序244.4 TFT液晶读写相关函数及初始化函数等30第5章系统调试与注意事项545.1 调试注意事项545.1.1 开发板操作规范545.1.2 开发板供电及设置545.1.3 开发板测试545.1.4 ISP 工具使用545.1.5 JTAGICE 等仿真器工具使用545.1.6 外设安装555.2 设计成果展示55结 论56致 谢57参 考 文 献58附录A 译文59附录B 外文原文65II第1章 绪论1.1 引言随着人们生活水平和工作节奏的提高,传统的时钟已不能满足人们的需求。现代的电子时钟不仅需要数字电路技术,而且需要模拟电路技术和单片机技术。与机械式时钟相比已经具有更高的准确性和直观性,且元机械装置,具有更长的使用寿命,因此得到了广泛的使用。AVR单片机是近10年来发展起来的新型的、基于增强型RISC结构的单片机。AVR在运行速度,存储器空间,内部功能模块的集成化,以串行接口为主的外围扩展,适合使用高级语言编程。Tmega128是ATMEL公司megaAVR系列单片机中的一款。此单片机支持多种方式的程序下载与烧写,包括高压并口方式、ISP方式和JTAG下载方式。彩屏TFT型液晶一直在我们日常生活中也经常用到,比如我们常见的MP3、MP4和手机等,我们可以通过DMAVR-128完成对TFT液晶进行控制。实现一个功能强大的指针式时钟显示设计。1.2 选题背景在现代都市的快节奏影响下,人们对于电子时钟的选择多为数字式,阿拉伯数字的简洁直观,让时间显示一目了然,满足了绝大多数人的需求。在一些时间的测量方面,有着不可替代的作用。可是另一方面,闲暇之余,各种设计精美的指针式电子也满足了人们一定的需求,人们也倾向于将自己的手机或电脑待机或屏保设置成精美的指针式电子时钟。或者说有一些长辈,习惯于传统钟表,指针式时钟能很完美地满足他们的需求。AVR单片机是近10年来发展起来的新型的、基于增强型RISC结构的单片机。AVR在运行速度,存储器空间,内部功能模块的集成化,以串行接口为主的外围扩展,适合使用高级语言编程彩屏TFT型液晶一直在我们日常生活中也经常用到,比如我们常见的MP3、MP4和手机等,我们可以通过DMAVR-128完成对TFT液晶进行控制。实现一个功能强大的指针式时钟显示设计。第2章 指针式时钟显示设计硬件环境简介2.1 DMAVR-128开发板结构图下图为DMAVR-128型AVR单片机学习开发板的功能框图。该系统板主要包括外接电源输入接口、3.3V稳压模块、USB供电和USBISP接口、AVR单片机、DS1302模块、RS232接口、PS2接口、外围I/O接口、8位发光LED、蜂鸣器、18B20温度传感器、步进电机模块、红外模块、SD卡模块、矩阵键盘、独立键盘、数码管显示模块、1602液晶接口、12864液晶接口、TFT彩屏液晶接口、DAC模块等。实物原理模块图说明如下:图 21实物原理模块图2.2 ATmega128简介产品特点 高性能、低功耗的 AVR 8 位微处理器 先进的 RISC 结构 133 条指令 大多数可以在一个时钟周期内完成 32 x 8 通用工作寄存器 + 外设控制寄存器 全静态工作 工作于16 MHz 时性能高达16 MIPS 只需两个时钟周期的硬件乘法器 非易失性的程序和数据存储器 128K 字节的系统内可编程Flash寿命: 10,000 次写/ 擦除周期 具有独立锁定位、可选择的启动代码区通过片内的启动程序实现系统内编程真正的读- 修改- 写操作 4K字节的EEPROM寿命: 100,000 次写/ 擦除周期 4K 字节的内部SRAM 多达64K 字节的优化的外部存储器空间 可以对锁定位进行编程以实现软件加密 可以通过SPI 实现系统内编程 JTAG 接口( 与IEEE 1149.1 标准兼容) 遵循JTAG 标准的边界扫描功能 支持扩展的片内调试 通过JTAG 接口实现对Flash, EEPROM, 熔丝位和锁定位的编程 外设特点 两个具有独立的预分频器和比较器功能的8 位定时器/ 计数器 两个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器 具有独立预分频器的实时时钟计数器 两路8 位PWM 6路分辨率可编程(2 到16 位)的PWM 输出比较调制器 8路10 位ADC8 个单端通道7 个差分通道2 个具有可编程增益(1x, 10x, 或200x)的差分通道 面向字节的两线接口 两个可编程的串行USART 可工作于主机/ 从机模式的SPI 串行接口 具有独立片内振荡器的可编程看门狗定时器 片内模拟比较器 特殊的处理器特点 上电复位以及可编程的掉电检测 片内经过标定的RC 振荡器 片内/ 片外中断源 6种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式 可以通过软件进行选择的时钟频率 通过熔丝位可以选择ATmega103 兼容模式 全局上拉禁止功能 I/O 和封装 53个可编程I/O 口线 64引脚TQFP 与 64 引脚 MLF 封装、 工作电压 2.7 - 5.5V ATmega128L 4.5 - 5.5V ATmega128 速度等级 0 - 8 MHz ATmega128L 0 - 16 MHz ATmega128图 22 ATmega128 的引脚图 23 ATmega128方框图2.3 系统设计模块2.3.1 系统电源模块系统电源模块提供整个开发板的电源,该开发板支持USB接口和外接电源供电,使用USB供电显得尤其方便,一条USB线即可供电。开发板支持3.3V系统和5V系统,板上集成5V到3.3V的电压稳压芯片ASM1117-3,可以通过跳线自由选择,确定使用何种电压,对于低功耗场所使用提供了方便,有助于项目开发的使用。图 24 系统电源模块2.3.2 单片机及时钟和复位模块该系统板单片机的设计是以AVR单片机ATmega128的管脚设计的,因此所有与ATmeaga128A单片机管脚兼容的AVR单片机都可以适用于该板。该系统板初始配置给用户是ATmeaga128A单片机。该学习开发板的所有实验都是以ATmeaga128A为目标芯片,该单片机主要吸收了PIC单片机以及51单片机的优点,同时在结构上做了重大的改革,其主要特征如下:1)程序存储器为价格低廉、可擦写1万次以上、指令长度单元为16位的Flash ROM,而数据存储器为8位。因此它还是属于8位单片机。2)采用CMOS技术和RISC架构,实现了高速(50ns)、低功耗(uA级)、Sleep(休眠)功能。3)工作电压2.7V-5.5V。4)高度保密,采用可多次烧可写的Flash存储器,并且具有多重密码保护锁定(Lock)功能,可多次升级,并快速完成产品的商业化。5) 超功能精简指令,具有32个通用工作寄存器(相当于8051中的32个累加器),克服了单一累加器数据处理造成的瓶颈现象。6)128KB的超大Flash程序存储空间、4KB的内部RAM数据存储空间以及4KB的EEPROM非易失性数据存储器。7)53个可编程I/O口,输入输出可控,并内置上拉电阻。8)2个8位和2个16位定时/计数器,具有独立的预分频功能,除了可以实现普通的定式和计数功能外,还具有输入捕捉以及产生PWM输出等功能。9)程序写入器件时,可以使用并行写入(用编程器方式)或者串行写入(ISP或者JTAG方式)以及在应用下载方式(IAP方式),通过JTAG设备,可以在电路板上直接烧写和调试程序。10)片内集成晶体振荡器,可以通过熔丝位配置来选择。11)全双工且性能优良的异步串行USART接口2个,单独的波特率产生器。12)片内集成模拟比较器和10位8通道ADC转换器。13)低功耗的闲置和睡眠模式。14)掉电模式可用中断来唤醒。15)片内还集成了可以擦写10万次的EEPROM数据存储器,可以保存固定的参数,提高了系统的保密性。该系统板外接晶振采用7.3728MHZ作为系统时钟,方便与PC进行通信。复位模块采用电阻电容共同构成的,一个独立的复位按键可以提供手动复位功能。2.3.3 单片机的I/O 接口单片机的53个I/O口全部由插针引出,可以由用户自己定义使用,方便了用户的扩展。2.3.4 蜂鸣器发声模块蜂鸣器的控制是通过单片机I/O口控制实现的,主要是由一个PNP型三极管9012和蜂鸣器连接构成,并有一个发光二极管进行指示。图 25 蜂鸣器模块2.3.5 DS1302 实时时钟模块DS1302实时时钟芯片是美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能,主要特点是采用串行数据传输,采用普通32.768kHz晶振,工作电压为2.5V5.5V,DS1302内部有一个318的用于临时性存放数据的RAM寄存器。采用I/O口与DS1302连接,通过AVR单片机控制,实现内部数据的读取,开发板没有提供电池供电功能。实时时钟数据可以显示在数码管、液晶等显示设备上。图 26 DS1302模块2.3.6 TFT 高质量彩屏液晶显示模块彩屏采用1.8寸大小,分辨率为主屏128x160副屏96x64 大小的TFT彩屏,模组为TX05D99VM1AAA,显示控制核心为HD66772和HD66774S,该模组支持8/9/16/18 位数据总线,总线格式为80CPU 格式,在DMAVR-128 开发板中,接口固定使用8 位数据总线。通过单片机对TFT 的控制,可以在TFT 任意位置显示字符、汉字或者显示任意大小的图形(最大尺寸小于屏幕分辨率尺寸),还可以通过GUI 函数,在液晶屏幕上进行打点画线或者绘图。图 27 TFT-LCD显示模块2.3.7 ISP下载接口和JTAG 调试接口模块ISP下载接口和JTAG调试接口是程序下载和仿真的接口。ISP下载接口与USBISP/USBASP模块连接,可以进行程序下载,但是不具备仿真调试的功能。JTAG调试接口是根据AVR单片机的片内JTAG电路设计的调试接口,AVR单片机支持使用JTAGICE等仿真设备进行仿真,这些仿真可以完全或部分实现对目标芯片的电特性的查看,同时支持断点、单步、全速等运行方式,可以实时查看单片机内部寄存器的值,对于学习和开发系统工程的调试,具有非常方便快捷的效果图 28 ISP下载接口和JTAG 调试接口模块第3章 指针式时钟硬件模块设计3.1 设计要求1、系统硬件设计。系统选用时钟芯片DS1302、按键作为输入设备,单片机作为主控和处理设备,TFT-LCD液晶显示器作为输出设备。2、系统软件设计。包括时钟表盘、表针绘制、时钟走时部分、时钟数据读入、控制器处理和LCD显示等。3.2硬件设计方案图 31 硬件设计方案3.3 关键模块设计3.3.1 DS1302实时时钟芯片DS1302 实时时钟芯片是美国DALLAS 公司推出的具有涓细电流充电能力的低功耗实时时钟,它可以对年、月、日、周日、时、分、秒信息进行计时,且具有闰年补偿等多种功能,主要特点是采用串行数据传输,采用普通32.768kHz 晶振,工作电压为2.5V5.5V,DS1302 内部有一个318 的用于临时性存放数据的RAM 寄存器。引脚图:图 32 DS1302引脚图框图:图 33 DS1302 内部结构框图采用I/O 口与DS1302 连接,通过AVR 单片机控制,实现内部数据的读取,开发板没有提供电池供电功能。硬件原理如下图:图 34 DS1302硬件原理图上图即为DS1302 和ATmega128 单片机连接的电路图,DS1302 采用串行数据传输,SCLK 控制线、IO 口线、REST 口线分别与PE5、PE6、PE7 相连接。命令字节:命令字节如下图,每次数据传输是由命令字节开始。该MSB(比特7)必须是一个逻辑1。如果是0,写入DS1302将被禁用。位6指定时钟/日历如果逻辑0或RAM数据的数据,如果逻辑1 Bits 1通过5指定要输入指定的登记册或输出和LSB(位0)指定一个写操作(输入)如果逻辑0或读操作(输出)如果逻辑1命令字节总是输入开始与LSB(位0)。表格 31 DS1302命令字节寄存器地址/定义表格 32寄存器地址/定义数据传输概要:图 35单字节读图 36单字节写时序图:图 37读数据传输图 38写数据传输3.3.2 TFT液晶显示模块DMAVR-128板载了TFT液晶接口,液晶选用了TX05D99VM1AAA模组,该模组实际上是一款手机液晶屏,包含主屏和副屏2个屏幕,尺寸大小1.8,分辨率分别为128x160和96x64,最大支持26万色,用单片机控制也相对较简单。实物图如下:图 39 实物图分别是主屏和副屏的外观,该液晶模组特点如下:(1)工作电压2.73.3V(2)主屏分辨率128x3(R,G,B) x160,副屏分辨率96 x3(R,G,B)x48(3)色数260K(4)视角6点钟方向(5)驱动芯片HD66772(Drain) 和HD66774S(Gate)(6)总线类型支持8/9/16/18bit 总线(80 CPU series)(7)背光为发光LED在DMAVR-128上的TFT接口为固定8位数据线方式,连接原理图如下:图 310 连接原理图其中RS、RD、RW、EC、PWM和/RST管脚分别为数据/命令使能、写控制、读控制、片选控制、背光控制以及复位控制管脚,分别连接单片机的PF1、PG4、PF2、PF3、PG2和PD7。AD0AD7为数接口,接PA口,采用固定8位数据总线方式第4章 系统软件设计4.1 软件环境介绍4.1.1 AVR Studio开发平台ATMEL公司提供的AVR Studio开发平台是免费的汇编开发平台。该平台支持AVR汇编语言程序的编辑、编译、连接以及生成目标代码。同时,该软件平台还内嵌AVR GCC高级语言接口(C/C+语言开发,需另安装WinAVR编译器),内含AVR软件模拟器,其仿真调试平台还可配合各种类型的AVR仿真器,如实时在板仿真器ICE40、ICE50,实时在线仿真器JTAGICE、JTAGICE mk可实现系统的在线的硬件仿真和代码的下载。第三方公司推出的采用高级语言编程的开发平台包括:1、IAR公司提供的IAR Embedded Workbench for AVR2、HP Info Tech的CodeVision AVR3、IMAGE CRAFT出品的ICCAVR4、GUN GCC自由软件的GUN GCC AVR,即我们前面提到的WinAVR编译器5、BASIC AVR、FastAVR、BASCOM-AVR(都是基于BASIC语言)4.1.2 ICCAVR 平台 自ATMEL公司的AT90系列单片机诞生以来有很多第三方厂商为AT90系列开发了用于程序开发的C语言工具,ICCAVR就是ATMEL公司推荐的第三方C编译器之一。ICCAVR是一种符合ANSI标准的C语言来开发MCU(单片机)程序的一个工具,功能合适、使用方便、技术支持好,它主要有以下几个特点:1.ICCAVR是一个综合了编辑器和工程管理器的集成工作环境(IDE);2.源文件全部被组织到工程之中,文件的编辑和工程的构筑也在这个环境中完成,错误显示在状态窗口中,并且当你点击编译错误时,光标自动跳转到错误的那一行;3.该工程管理器还能直接产生 INTEL HEX格式文件的烧写文件(该格式的文件可被大多数编程器所支持,可以直接下载到芯片中使用)和符合 AVRStudio的调试文件(COFF格式)。4.ICCAVR是一个32位的程序,支持长文件名。5.ICCAVR是一个综合了编辑器和工程管理器的集成开发环境(IDE),是一个纯32位的程序,可在 Win 95、Win 98、Win ME、Win NT、Win 2000、Win XP和Win 7环境下运行。4.2 DMAVR-128指针式日历时钟程序4.2.1 程序框图图 41 主体程序框图绘制时钟界面从DS1302中读取时钟数据显示日期星期时分秒指针显示、清除时钟显示4.2.2 源程序/DMAVR-128的基于TFT彩屏液晶和DS1302时钟芯片的指针式日历时钟程序/指针相关坐标根据三角函数换算,所以应包含math.h头文件/初始设置为12小时制,下午时间/编译环境 ICCAVR 7.16A/系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms#include 绘制时钟界面 void GUIclock() GUIcircle(64,64,60,0x00ff);GUIfull(61,60,67,67,0xf800); /时钟中心GUIline(64,5,64,10,0x700); /12点钟方向GUIline(63,5,63,10,0x700); /12点钟方向GUIline(65,5,65,10,0x700); /12点钟方向GUIline(95,12,92,15,0x700); /1点钟方向GUIline(116,34,113,37,0x700); /2点钟方向GUIline(123,64,118,64,0x700); /3点钟方向GUIline(123,63,118,63,0x700); /3点钟方向GUIline(123,65,118,65,0x700); /3点钟方向 GUIline(116,94,113,91,0x700); /4点钟方向GUIline(95,116,92,113,0x700); /5点钟方向 GUIline(64,123,64,118,0x700); /6点钟方向GUIline(63,123,63,118,0x700); /6点钟方向GUIline(65,123,65,118,0x700); /6点钟方向 GUIline(34,116,37,113,0x700); /7点钟方向GUIline(12,93,15,90,0x700); /8点钟方向GUIline(5,64,10,64,0x700); /9点钟方向GUIline(5,63,10,63,0x700); /9点钟方向GUIline(5,65,10,65,0x700); /9点钟方向GUIline(12,34,15,37,0x700); /10点钟方向GUIline(34,12,37,15,0x700); /11点钟方向 从DS1302中读取时钟数据并处理void TimeGet() time_hour=(time_buf4&0x1F) 4)*10+(time_buf4 & 0x0F);/小时time_h=(time_buf4 4)&0x02;/判断是上午还是下午time_min=(time_buf5 4)*10+(time_buf5 & 0x0F);/分钟time_sec=(time_buf6 4)*10+(time_buf6 & 0x0F);/秒data_yearq=(time_buf0 4); /年数据的千位data_yearb=(time_buf0 & 0x0F); /年数据的百位data_years=(time_buf1 4); /年数据的十位data_yearg=(time_buf1 & 0x0F); /年数据的个位data_months=(time_buf2 4); /月数据的十位data_monthg=(time_buf2 & 0x0F);/月数据的个位data_days=(time_buf3 4);/日数据的十位data_dayg=(time_buf3 & 0x0F); /日数据的个位week=(time_buf7 & 0x0F);/星期数据 显示日期和星期void DisplayData() DisplayChar(data_yearq+0,0,9,0x0eee);DisplayChar(data_yearb+0,1,9,0x0eee);DisplayChar(data_years+0,2,9,0x0eee);DisplayChar(data_yearg+0,3,9,0x0eee);DisplayChar(/,4,9,0x0eee); / /符号DisplayChar(data_months+0,5,9,0x0eee);DisplayChar(data_monthg+0,6,9,0x0eee);DisplayChar(/,7,9,0x0eee); / /符号DisplayChar(data_days+0,8,9,0x0eee);DisplayChar(data_dayg+0,9,9,0x0eee);DisplayGB2312(6,5,9,0x3fef); /星DisplayGB2312(7,6,9,0x3fef); /期DisplayGB2312(week+7,7,9,0x3fef); /星期几 主函数int main(void) delay_nms(100); McuInit(); LCD_RD1; LCD_Init(); LCD_clear(0); ds1302_init(); /DS1302初始化 delay_nms(10); ds1302_write_time(); /向DS1302写初始数据,如年月和时间等 GUIclock(); /画时钟界面框 while(1) delay_nms(900);ds1302_read_time(); /读DS1302数据 GUIline(64,64,sxi,syi,0); /清除秒指针显示痕迹TimeGet(); if(time_h=0x02) DisplayGB2312(16,3,5,0x079ff); /下 else DisplayGB2312(15,3,5,0x79ff); /上 DisplayGB2312(17,4,5,0x79ff); /午DisplayData(); if(time_sec=00)hxi=64+cos(PI*0.5-PI*(time_hour)/6-PI*(time_min-1)/360)*30; /小时根据分钟的变化轨迹横坐标计算公式hyi=64-sin(PI*0.5-PI*(time_hour)/6-PI*(time_min-1)/360)*30; /小时根据分钟的变化轨迹纵坐标计算公式GUIline(64,64,hxi,hyi,0); /小时指针在小时更新后清除前一痕迹hxi=64+cos(PI*0.5-PI*(time_hour)/6-PI*time_min/360)*30; hyi=64-sin(PI*0.5-PI*(time_hour)/6-PI*time_min/360)*30;GUIline(64,64,hxi,hyi,0x2ee0); /小时指针在分钟更新后显示新的位置 else hxi=64+cos(PI*0.5-PI*(time_hour)/6-PI*time_min/360)*30; hyi=64-sin(PI*0.5-PI*(time_hour)/6-PI*time_min/360)*30;GUIline(64,64,hxi,hyi,0x2ee0); /小时指针在分钟不更新时显示原来位置 if(time_sec=00) /分钟指针在秒更新后清除前一痕迹mxi=64+cos(PI*0.5-PI*(time_min-1)/30)*40; myi=64-sin(PI*0.5-PI*(time_min-1)/30)*40;GUIline(64,64,mxi,myi,0); mxi=64+cos(PI*0.5-PI*time_min/30)*40; myi=64-sin(PI*0.5-PI*time_min/30)*40;GUIline(64,64,mxi,myi,0x2e0); /分钟指针在秒更新后显示新的位置 else mxi=64+cos(PI*0.5-PI*time_min/30)*40;/分钟的变化轨迹横坐标计算公式 myi=64-sin(PI*0.5-PI*time_min/30)*40;/分钟的变化轨迹纵坐标计算公式GUIline(64,64,mxi,myi,0x2e0); /分钟指针在秒不更新时显示原来的位置 sxi=64+cos(PI*0.5-PI*time_sec/30)*50;/秒指针的变化轨迹横坐标计算公式 syi=64-sin(PI*0.5-PI*time_sec/30)*50;/秒指针的变化轨迹纵坐标计算公式GUIline(64,64,sxi,syi,0xffe0); /显示秒指针位置 GUIfull(61,60,67,67,0xf800); /显示时钟中心 4.3 DS1302实时时钟芯片驱动程序图 42 DS1302子函数程序框图DS1302驱动向DS1302写入一字节向DS1302读出一字节向DS1302写入时钟数据从DS1302读出时钟数据DS1302初始化函数4.3.1 程序框图4.3.2 源程序/DMAVR-128的DS1302实时时钟芯片驱动程序,如果使用备用电池,只需执行一次写DS1302操作/编译环境 ICCAVR 7.16A/使用前请通过修改time_buf8来设置当前启动日期/当前设置2010-02-01 03:22 下午 周一/0xb0表示12小时制,下午,当前时间的小时数为03,具体位的意义参考DS1302的数据手册#include unsigned char time_buf8 = 0x20,0x10,0x02,0x01,0xa3,0x22,0x00,0x01; /12小时制,要写下午还是上午向DS1302写入一字节数据void ds1302_write_byte(unsigned char addr, unsigned char d) unsigned char i;RST_SET;/启动DS1302总线 /写入目标地址:addrIO_OUT;addr = addr & 0xFE; /最低位置零for (i = 0; i 1; /写入数据:dIO_OUT;for (i = 0; i 1;RST_CLR;/停止DS1302总线从DS1302读出一字节数据unsigned char ds1302_read_byte(unsigned char addr) unsigned char i;unsigned char temp;RST_SET; /启动DS1302总线 /写入目标地址:addrIO_OUT;addr = addr | 0x01; /最低位置高for (i = 0; i 1;/*输出数据:temp*/IO_IN;for (i = 0; i 1;if (IO_R) temp |= 0x80;else temp &= 0x7F;SCK_SET;SCK_CLR;RST_CLR;/停止DS1302总线return temp;向DS302写入时钟数据void ds1302_write_time(void) ds1302_write_byte(ds1302_control_add,0x00);/关闭写保护 ds1302_write_byte(ds1302_sec_add,0x80);/暂停 /ds1302_write_byte(ds1302_charger_add,0xa9);/涓流充电 ds1302_write_byte(ds1302_year_add,time_buf1);/年 ds1302_write_byte(ds1302_month_add,time_buf2);/月 ds1302_write_byte(ds1302_date_add,time_buf3);/日 ds1302_write_byte(ds1302_day_add,time_buf7);/周 ds1302_write_byte(ds1302_hr_add,time_buf4);/时 ds1302_write_byte(ds1302_min_add,time_buf5);/分ds1302_write_byte(ds1302_sec_add,time_buf6);/秒ds1302_write_byte(ds1302_day_add,time_buf7);/周 ds1302_write_byte(ds1302_control_add,0x80);/打开写保护 从DS302读出时钟数据void ds1302_read_time(void) time_buf1=ds1302_read_byte(ds1302_year_add);/年 time_buf2=ds1302_read_byte(ds1302_month_add);/月 time_buf3=ds1302_read_byte(ds1302_date_add);/日 time_buf4=ds1302_read_byte(ds1302_hr_add); /时 time_buf5=ds1302_read_byte(ds1302_min_add); /分 time_buf6=(ds1302_read_byte(ds1302_sec_add)&0x7F;/秒 time_buf7=ds1302_read_byte(ds1302_day_add); /周 DS302初始化函数void ds1302_init(void) RST_CLR;/RST脚置低SCK_CLR;/SCK脚置低RST_OUT;/RST脚设置为输出SCK_OUT;/SCK脚设置为输出4.4 TFT液晶读写相关函数及初始化函数等/TFT液晶读写相关函数及初始化函数等/相关头文件 TFT.h#include IO口初始化void McuInit()LCD_Data=0xFF; /各相关IO口初始化DDR_Data=0xFF;PORTF=0xFF;DDRF=0xFF;PORTG=0x0F; DDRG=0x0F;PORTD=0xFF;DDRD=0xFF;D_LE1; /关掉数码管,以免显示乱码,因为共用PA口 W_LE1; LCD_Data=0xFF; /关所有数码管 W_LE0; PORTB=0xFF;DDRB=0xFF;LCD_BL0;写寻址寄存器地址,厂家规定0x22void LCD_WR_REG(uchar index) LCD_RS0; /根据控制器datasheet,RS为0时,为写寄存器地址LCD_EC0;LCD_Data = 0x00;LCD_WR0;LCD_WR1;LCD_Data = index;LCD_WR0;LCD_WR1;LCD_EC1;LCD_RS0;读数据,从GRAM中读取,第一个字节无效,从第二个字节开始读取unsigned int LCD_RD_REG16(uchar index)unsigned int pd;LCD_RS0;LCD_EC0;delay_3us();LCD_Data = 0x00;delay_3us();LCD_WR0;delay_3us();LCD_WR1;delay_3us();LCD_Data = index;delay_3us();LCD_WR0;delay_3us();LCD_WR1;delay_3us();LCD_RS1;delay_3us();LCD_Data = 0xFF;delay_3us();LCD_RD0;delay_3us(); /DDR_IN; /数据输入delay_3us();LCD_RD1;pd = LCD_Data;delay_3us();LCD_Data = 0xFF;LCD_RD0;delay_3us();LCD_RD1;pd = pd + LCD_Data*256;LCD_EC1;LCD_RS0;return pd;写控制命令,index为寄存器地址,val为控制命令,16位长度void LCD_WR_CMD(uchar index,uint val)LCD_RS0;LCD_EC0;LCD_Data = 0x00;LCD_WR0;LCD_WR1;LCD_Data = index;LCD_WR0;LCD_WR1;LCD_EC1;LCD_RS0;LCD_RS1; /根据控制器datasheet,RS为1时,为写控制命令或者数据到GRAMLCD_EC0;LCD_Data = (uchar)(val8);LCD_WR0;LCD_WR1;LCD_EC1;LCD_RS0;LCD_RS1;LCD_EC0;LCD_Data = (uchar)val;LCD_WR0;LCD_WR1;LCD_EC1;LCD_RS0;向GRAM存储器写数据,用来显示,定义为16位指针调用void LCD_WR_Data(uint val)LCD_Data = (uchar)(val8);LCD_WR0;LCD_WR1;/LCD_RS1;LCD_Data = (uchar)val;LCD_WR0;LCD_WR1;向GRAM存储器写数据,用来显示,定义为8位指针调用void LCD_WR_DataP(uint val)LCD_Data = (uchar)val;LCD_WR0;LCD_WR1;void LCD_Init()LCD_RST0; /复位有效,至少2msdelay_nms(2);LCD_RST1; /复位结束delay_nms(2); LCD_WR_CMD(0x00,0x0001);/启动晶振,必须有至少10ms的延时,保证稳定 delay_nms(10); LCD_WR_CMD(0x03,0x0030); /设置数据扫描方向,由左至右,水平扫描 /LCD_WR_CMD(0x03,0x0230); /HWM=1为高速数据模式 LCD_WR_CMD(0x01,0x011D); /delay_us(1000); LCD_WR_CMD(0x0a,0x0106); /delay_us(1000); LCD_WR_CMD(0x07,0x0037); /非8位模式,开显示 LCD_WR_CMD(0x08,0x0707); /光栅周期数为7,若为0,则无显示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论