2.4寸LCD屏多功能显示_第1页
2.4寸LCD屏多功能显示_第2页
2.4寸LCD屏多功能显示_第3页
2.4寸LCD屏多功能显示_第4页
2.4寸LCD屏多功能显示_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

武汉工程大学继续教育学院毕业设计论文题目基于51单片机的TFT屏多功能显示设计专业 机电一体化工程班级 11级03班 姓名 张明波 指导教师 熊 杰 2014年11月15日目 录一、设计要求与方案设计3(一)设计要求3(二)电路设计3二、相关软件的介绍4(一)字体取模软件4(二)图片取模软件5(三)KEIL软件的使用6三、硬件电路设计与实现10(一)电路整体设计框图与整体原理图10(二)STC主控制器模块11(三)DS1302实时时钟模块12(四)DHT11温、湿度测量模块13(五)TFT彩屏显示模块14(六)移动电源模块15(七)译码器、按键、蜂鸣器模块15四、程序设计思路与实现16(一)TFT驱动层16(二)API层18(三)DHT11温湿度检测22(四)DS1302实时时钟25(五)按键检测27(六)应用层29结论37致谢38参考文献38-百度云盘有具体资料-/s/1o6IAy7K-基于51单片机的TFT屏多功能显示设计作者:张明波摘 要: MCS-51作为入门式的8位单片机,还是应用广泛的一种。国产的宏晶STC单片机以其低功耗、廉价、稳定性能,占据着国内51单片机较大市场。STC12C5A60S2更是资源丰富。基于STC12C5A60S2的TFT屏显示设计,通过调用API绘制GUI界面,完成汉字显示、ASCII显示、图像显示。以及通过DS1302实时时钟,DHT11温湿度测量,按键设置、蜂鸣器提醒。完成最基本的智能家居室内温度、湿度监控、时钟显示。关键词:MCS-51 API DS1302实时时钟 DHT11温湿度测量 智能家居一、设计要求与方案设计(一)设计要求(1)完成TFT屏绘图的图形API;(2)能显示日期、时间;(3)能显示温度、湿度;(4)通过按键可以设定时间,以及温度警戒提醒;(二)电路设计综上所述要求,电路设计方案是:采用STC12C5A60S2作为主控芯片;DS1302提供时钟;DHT11作为温、湿度采集的传感器;TFT彩屏作为显示;移动电源供电;通过74HC138译码器扩展主控芯片的I/O口提供蜂鸣器、按键的运作;串行口作为通信端口和下载程序。二、相关软件的介绍(一)字体取模软件1、双击图标,进入图1.1界面:图2. 12、点击参数设置文字输入区字体选择字体。选择所需字体、字号,如图2.2:图2. 23、其他选项。勾选横向取模、字节倒序、保留、任何时候都加0。4、在文字输入区输入相应文字后,按键盘的Ctrl+Enter键完成编辑,如图2.3:图2. 35、点击取模格式,选择C51格式,然后在点击点阵生成区,即可出现相应的文本,如图2.4:图2. 46、复制文本到你的字体数组中。(二)图片取模软件1、双击图标,进入图2.5界面:图2. 52、打开图片文件。3、配置参数C语言数组水平扫描16为真彩色x*x像素保存,如图2.6图2. 64、将文件里的内容复制到你的函数文件(三)KEIL软件的使用1、双击图标,进入如图2.7界面:图2. 72、点击ProjectNew uvision project,在你指的的地方新建一个文件夹,并在其中再建立一个名为OBJ的文件夹,将项目文件建立在里面,如下图2.8:图2. 83、然后再在里面新建DIVER、GUI、SYS、USER、DS1302、DHT11、DELAY、KEY文件夹,把相应的文件复制到其中。4、进入界面选择STC12C5A60S2,点击OK,不要选择添加启动代码,如图2.9。图2. 95、如图2.10所示,在Target1上点击右键选择选择Manage Components 图2. 10 图2. 116、如图所示编辑修改,如图2.11:7、然后再向相应的Groups里面添加源文件,点击Add Files,完成添加后点击OK,如图2.12、2.13: 图2. 12 图2. 138、点击进入配置界面,如图2.14:图2. 149、标签Target中设置Memory Model为Large:variables in XDATACode Rom Size为Large:64K program标签Output中勾选Creat HEX File10、在标签C51中的Include Paths中添加如下文件夹,只要文件夹中含有所需的头文件,都要在此次指明路径!,如图2.15 图2. 15 图2. 1611、编译后头文件将出现在相应的分组文件夹中,如图2.16:三、硬件电路设计与实现(一)电路整体设计框图与整体原理图系统框图系统原理图(二)STC主控制器模块图3. 1STC12C5A60S2单片机是STC生产的单时钟/机器周期(1T)的单片机,指令代码完全兼容传统8051但是速度快812倍。1、工作电压:5.5V3.5V(5V单片机)。2、工作频率范围:035MHz。3、程序存储空间:60K;片上集成1280字节SRAM。4、通用I/O口40个,复位后为准双向口/弱上拉(普通8051传统I/O口)。每个I/O口驱动能力均可达20mA,但整个芯片最大不要超过120mA。5、ISP(在系统可编程)/IAP(在应用可编程),无需专用的编程器,可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成下载。6、时钟源:外部高精度晶体/时钟,内部R/C振荡器。7、共4个16位定时器:两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器。8、3个时钟输出口、7路外部中断I/O口、2路PWM、8路10位精度A/D转换。9、同用全双工异步串行口(UART)。10、工作温度范围:-4085(工业级)、075(商业级)。11、封装:LQFP-48,LQFP-44,PDIP-40。本项目采用PDIP-40。为了让程序运行更快,采用了24MHz的晶振。(三)DS1302实时时钟模块图3. 2DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线(1) RES(复位),(2)I/O(数据线),(3)SCLK(串行时钟)。时钟/RAM 的读/写数据以一个字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW。电路的搭建采用32.768KHz的晶振、两个30pf瓷片电容构成晶振电路,以3V纽扣电池来提供备用电,这样即使主电源掉电,时钟仍然可以在DS1302计时,下次上电后仍可以显示正确时间。(四)DHT11温、湿度测量模块图3. 3DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与8位单片机相连接。每个DHT11传感器都在极为精确地湿度校验室中进行校准。校准系数以程序的形式存储在OTP内存中,传感器内部在检测信号的处理过程中需要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号的传输距离可达20米以上。产品为4针单排引脚封装,连接方便。DHT11参数表型号测量范围测湿精度测温精度分辨力封装DHT1120-90%RH 0-505%RH214针单排直插建议连线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。DHT11的供电电压为35.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。SDA用于微处理器与DHT11之间通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据=8bit检验值。测量分辨率:8bit温度、8bit湿度。DHT11引脚功能表Pin名称注释1VCC供电3-5.5V2SDA串行数据,单总线3NC空脚,悬空4GND接电源负极(五)TFT彩屏显示模块图3. 4TFT-LCD液晶显示屏是薄膜晶体管型液晶显示屏,也就是“真彩”(TFT)。TFT液晶为每个像素都设有一个半导体开关,每个像素都可以通过点脉冲直接控制,因而每个节点都相对独立,并可以连续控制,不仅提高了显示屏的反应速度,同时可以精确控制显示色阶,所以TFT液晶的色彩更真。TFT液晶显示屏的特点是亮度好、对比度高、层次感强、颜色鲜艳,但也存在着比较耗电和成本较高的不足。TFT液晶技术加快了手机彩屏的发展。彩屏手机中基本上都支持65536色,还有26万.130万显示,有的甚至支持1600万色显示,这时TFT的高对比度,色彩丰富的优势就非常重要了。液晶显示器由液晶面板和背光板两大部分组成:液晶面板(液晶盒)包括偏振片、玻璃基板、彩色滤色膜、电极、液晶及定向层。背光模组由冷阴极荧光灯(CCFL)、导光板(光波导)、扩散板和棱镜片组成,其作用是件光源均匀地传送到液晶面板。此设计采用普中科技提供的2.4寸TFT彩屏模块,以并行16位通信,240X320分辨率,以4个LED并联作为背光灯。引脚功能: TFT屏引脚功能表引脚功能引脚功能REST复位CS片选RD读信号P1低8位数据端WR写信号P2高8位数据端RS数据/命令选择TFT模块的坐标系,如图3.5: 图3. 5 图3. 6采用16位二进制数来表示一个彩色点,格式为5-6-5,如图3.6:(六)移动电源模块图3. 7为了让项目在后期可以便于扩展,特意使用AMS1117-5V-3.3V稳压芯片,是的该线路板可以提供5V和3.3V两种电压。并且使用DC-005电源座,可以使用移动电源供电,不必依附于笔记本电脑工作。(七)译码器、按键、蜂鸣器模块 图3. 8 图3. 9 图3. 10为节省I/O口,通过74HC138译码器来扩展I/O口,以提供独立按键、蜂鸣器I/O口,以及后期项目扩展。四、程序设计思路与实现本项目采用模块化编程,分成不同的模块来完成程序的编制。项目程序文件目录如下,所包含的头文件未展开。项目相关文件程序的编制遵循分层的思想,分为TFT屏驱动层、TFT屏API层、TFT屏应用层驱动层:完成最基本的屏幕命令输入、数据读出。API层:完成函数接口,绘制各种图形,以及字符、数字、汉字的显示。应用层:调用API函数,完成整体项目的输出。(一)TFT驱动层驱动层属于最底层的函数,连接了底层硬件,提供底层最基本的函数。这些函数囊括了发送命令、发送数据、写数据设置扫描区域、已经界面的刷新。由DIVER.h进行变量、函数的声明。头文件内容如下:#ifndef _DIVER_H_#define _DIVER_H_#define Bus_16 /16位数据模式#define LCD_DataPortH P2 /高8位数据口#define LCD_DataPortL P1 /低8位数据口sbit LCD_REST = P06; /RST 引脚定义sbit LCD_RD = P07; /RD 引脚定义sbit LCD_WR = P36; /WR 引脚定义sbit LCD_RS = P33; /RS 引脚定义sbit LCD_CS = P37; /CS 引脚定义#define LCD_SIZE_X240#define LCD_SIZE_Y320/*定义常用颜色的颜色码*/#define RED 0xf800 /红#define YELLOW 0xffe0 /黄#define GREEN 0x07e0 /绿#define CYAN 0x07ff /青#define BLUE 0x001f /蓝#define PURPLE 0xf81f /紫#define BLACK 0x0000 /黑#define WHITE 0xffff /白#define GRAY 0x7bef /灰void LCD_Init(void); /屏幕初始化void LCD_Write_COM(char VL); /发送命令void LCD_Write_Para(char VL); /发送数据void LCD_Writ_Bus(char VH,char VL);/并行数据写入函数void LCD_Write_DATA(uint dat);/发送数据void Pant(uint dat);/清屏程序void Set_XY(uint x1,uint y1,uint x2,uint y2); /设置扫描起始、终止点void Set_Point(uchar x,uint y); /单点像素void delayms(int count);#endifDIVER.c完成函数的定义。TFT屏的驱动IC采用三星的S6D04H0,根据三星公司提供的数据手册编程。其基本的命令如下:指令代码指令代码NOP00h显示关闭28h软件复位01h显示开启29h读取显示状态09h列地址设置2Ah读取电源模式0Ah行地址设置2Bh休眠10h存储器写2Ch唤醒11h存储器读2Eh正常显示模式12h电源控制F3h(二)API层API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API层的函数通过GUI.h头文件定义:#ifndef _GUI_H_#define _GUI_H_extern uchar size;extern uint Bk_Color;extern uint For_Color;uchar SIZE(uchar num);/设置显示字符的尺寸void Set_Color(uint for_color, uint back_color); /设置颜色/*/*画图API*/*/uint RGB(uchar R,uchar G,uchar B);/RGB颜色混合void GUI_Clear(uchar x1, uint y1, uchar x2, uint y2);/清区域void GUI_Point(uchar x,uint y);/画点void GUI_HL(uchar x, uint y, uchar length);/画横线void GUI_RL(uchar x, uint y, uint high);/画竖线void GUI_L(uint x1,uint y1,uint x2,uint y2);/画直线void GUI_Box(uchar sx,uint sy,uchar ex,uint ey);/画实心矩形void GUI_rectangle( uchar sx,uint sy,uchar ex,uint ey);/画空心矩形void GUI_Circle(uchar xc,uint yc,uchar r,uchar fill);/画圆函数void Co_s(uchar x_axis, uchar y_axis, uchar style, uchar amplitude, uchar phase, float step);/绘制正弦曲线void Draw_CS(uchar x_axis, uchar y_axis, uchar style);/绘制坐标轴void Line_graph(uchar x, uint y, uchar min, uint max, uchar step); /绘制随机线图/*/*显示字符*/*/void GUI_DisPic(uchar x, uint y, uchar length, uint high,const uchar *pic);/显示图片(图标)void GUI_DisChar(uchar x, uint y, uchar ch);/显示英文或数字字符void GUI_DisStr(uchar x, uint y,uchar code *s);/显示英文字符串void PutGB18(uchar x, uint y, uchar c2); /显示单个汉字void PutGB18Str(uchar x, uint y, uchar *q);/显示汉字串void PutGB24(uchar x, uint y, uchar c2);void PutGB24Str(uchar x, uint y, uchar *p);/*/*显示数字*/*/void GUI_sprintf_chartobit(uchar x, uint y, uchar dat);/无符号字符型数以二进制形式显示void GUI_sprintf_nu(uchar x, uint y,uchar nu);/显示1位16进制数void GUI_sprintf_chartohex(uchar x, uint y, uchar dat);/无符号字符型数以十六进制形式显示void GUI_sprintf_chartodec(uchar x, uint y, uchar dat);/无符号字符型数以十进制形式显示void GUI_DisTime(uchar x,uint y,uchar dat);/显示两位时间void GUI_wrul(uchar x, uint y, unsigned long num);/以十进制形式显示无符号长整型数void GUI_wrlval(uchar x, uint y,ulong num,uchar bits,uchar dp);/以十进制形式显示浮点数#endif各函数的说明格式如下:“-部分函数名称并未及时更改-”函数原型功能说明参数说明调用举例1、SIZE函数原型uchar SIZE(uchar num);功能说明设置字符、汉字的显示尺寸参数说明num指定显示字符、汉字的尺寸调用举例SIZE(1);2、Set_Color函数原型void Set_Color(uint for_color, uint back_color);功能说明设置显示字符、汉字、图像等的背景色和前景色参数说明for_color用于指定前景色、back_color指定背景色调用说明/举例画图形要指定前景色、刷新要指定背景色3、RGB函数原型uint RGB(uchar R,uchar G,uchar B);功能说明分别写入R、G、B的参数,返回RGB值参数说明R:红色 G:绿色 B:蓝色调用举例RGB(0,255,0);/绿色4、GUI_Clear函数原型void GUI_Clear(uchar x1, uint y1, uchar x2, uint y2);功能说明清除指定区域为背景色参数说明(x1,y1)起始对角点、(x2,y2)结束对角点调用举例GUI_Clear(20,20,60,60);5、GUI_Point函数原型void GUI_Point(uchar x,uint y);功能说明画点参数说明点的(x,y)坐标调用举例GUI_Point(25,45)6、GUI_HL函数原型void GUI_HL(uchar x, uint y, uchar length);功能说明画水平直线参数说明(x,y)起点坐标,length为长度调用举例GUI_HL(35,45,50);7、GUI_RL函数原型void GUI_RL(uchar x, uint y, uint high);功能说明画竖直直线参数说明(x,y)起点坐标,high为高度调用举例GUI_RL(20,30,45);8、GUI_L函数原型void GUI_L(uint x1,uint y1,uint x2,uint y2);功能说明画直线参数说明(x1,y1)为起点坐标,(x2,y2)为终点坐标调用举例GUI_L(25,35,45,67);9、GUI_Box函数原型void GUI_Box(uchar sx,uint sy,uchar ex,uint ey);功能说明画实心矩形参数说明(sx,sy)为对角线起点坐标,(ex,ey)为对角线终点坐标调用举例GUI_L(25,35,45,67);10、GUI_Rec函数原型void GUI_Rec ( uchar sx,uint sy,uchar ex,uint ey);功能说明画矩形参数说明(sx,sy)为对角线起点坐标,(ex,ey)为对角线终点坐标调用举例GUI_L(25,35,45,67);11、GUI_Circle函数原型void GUI_Circle(uchar xc,uint yc,uchar r,uchar fill);功能说明画圆形参数说明(xc,yc)为圆心坐标,r为半径,fill=0不填充,fill=1填充圆调用举例GUI_Circle(50,50,25,1);12、Co_s函数原型void Co_s(uchar x_axis, uchar y_axis, uchar style, uchar amplitude, uchar phase, float step);功能说明绘制正弦曲线参数说明(x_axis,y_axis)为坐标轴圆心位置, style为坐标轴的样式, amplitude为幅值,phase为相位差, step为循环的步距调用举例Co_s(20, 160, 0, 50, 0,0.02);13、Draw_CS函数原型void Draw_CS(uchar x_axis, uchar y_axis, uchar style);功能说明绘制坐标轴的函数参数说明(x_axis,y_axis)为坐标轴圆心位置, style为坐标轴的样式调用举例Draw_CS (20, 160, 0);14、Line_Graph函数原型void Line_graph(uchar x, uint y, uchar min, uint max, uchar step);功能说明绘制随机线参数说明(x, y)随机线的起点,应该在坐标轴上, min为随机数的最小值, max为随机数的最大值, step步距(单位:像素)调用举例Line_graph(10, 300, 50, 300, 2);15、GUI_DisPic函数原型void GUI_DisPic(uchar x, uint y, uchar length, uint high,const uchar *pic);功能说明显示图片参数说明(x,y)显示的位置,(length,high)为图片像素,*pic为图片数组的指针调用举例注意像素要与图片匹配16、GUI_DisChar函数原型void GUI_DisChar(uchar x, uint y, uchar ch);功能说明显示字母,数字参数说明(x,y)为显示字符的位置,ch为需要显示的字符(带单引号)调用举例GUI_DisChar(35,45,A);17、GUI_DisStr函数原型void GUI_DisStr(uchar x, uint y,uchar code *s);功能说明显示字符串参数说明(x,y)为字符串显示的位置,*s为字符串调用举例GUI_DisStr(35,45,”zhang ming bo”);18、PutGB18函数原型void PutGB18(uchar x, uint y, uchar c2);功能说明显示单个汉字参数说明(x,y)为显示位置,c2为汉字调用举例PutGB18(25,33,”张”);19、PutGB18Str函数原型void PutGB18Str(uchar x, uint y, uchar *q);功能说明显示一串汉字参数说明(x,y)为显示位置,*q为汉字串调用举例PutGB18Str(24,35,”张明波”);20、GUI_DisBin函数原型void GUI_DisBin(uchar x, uint y, uchar dat);功能说明显示二进制数(8位)参数说明(x,y)显示的位置,dat需显示的数据调用举例GUI_DisBin(65,45,233);21、GUI_DisHex函数原型void GUI_DisHex (uchar x, uint y, uchar dat);功能说明显示十六进制数(2位)参数说明(x,y)显示的位置,dat需显示的数据调用举例GUI_DisHex (65,45,233);22、GUI_DisDec函数原型void GUI_DisDec (uchar x, uint y, uchar dat);功能说明显示十进制数(1000以内的数)参数说明(x,y)显示的位置,dat需显示的数据调用举例GUI_DisDec (65,45,233);23、GUI_LonDec函数原型void GUI_LonDec(uchar x, uint y, unsigned long num);功能说明显示长整型十进制数参数说明(x,y)显示的位置,num需显示的数据调用举例GUI_LonDec (65,45,19999);24、GUI_FloatDec函数原型void GUI_FloatDec (uchar x, uint y,unsigned long num,uchar bits,uchar dp);功能说明显示浮点型十进制数参数说明(x,y)显示的位置,num需显示的数据,bits显示的位数,小数点的位置调用举例GUI_LonDec (65,45,199.99,5,2);(三)DHT11温湿度检测通讯过程如图所示:总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18ms,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号,主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一位数据都以50us低电平时隙开始,高电平的长短决定了数据位是0还是1,格式如下图所示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一位数据传输完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。DHT11.c源文件如下#include #include #include uchar flag,temp,dat;uchar RH,RL,TH,TL,CK;uchar RH_temp,RL_temp,TH_temp,TL_temp,CK_temp;uchar Rec(void)uchar i;for(i=0;i8;i+) flag=2;while(!DHT)&flag+);Delay25_us(); /25,27,29都可以temp=0;if(DHT)temp=1;flag=2;while(DHT)&flag+);if(flag=1) /超时则跳出for循环break;dat=1;dat|=temp; return(dat);void RH_Start(void)DHT=0;Delay20_ms(); /主机拉低18ms DHT=1;Delay40us(); /总线由上拉电阻拉高 主机延时40us/主机设为输入 判断从机响应信号 /判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DHT) flag=2; while(!DHT)&flag+); /判断低电平响应信号是否结束flag=2;while(DHT)&flag+); /判断从机是否发出高电平信号,发出则进入接收状态RH_temp=Rec();RL_temp=Rec();TH_temp=Rec();TL_temp=Rec();CK_temp=Rec();if(CK_temp=(RH_temp+RL_temp+TH_temp+TL_temp) /检验数据是否正确RH=RH_temp;RL=RL_temp;TH=TH_temp;TL=TL_temp;CK=CK_temp;else /如果不符合检验,则按此输出RH=1;RL=2;TH=3;TL=4;CK=5;(四)DS1302实时时钟编程过程中操作的地址如下:寄存器地址秒分时日月周年读地址0x800x820x840x860x880x8a0x8c写地址0x810x830x850x870x890x8b0x8d读写数据要注意一下几点:1、数据的读写都从低位开始。2、数据的读写要在下降沿来操作。3、DS1302中的数据都是以BCD码来操作的,所以显示时要进行BCD码-十进制数转换4、0x8e为指令的地址DS1302.c文件如下:#include #include #includeuchar Set_Time7=14,9,21,7,18,59,40; /年月日周时分秒uchar W_AD7=0x8c,0x88,0x86,0x8a,0x84,0x82,0x80; / 相应读操作的地址码uchar R_AD7=0x8d,0x89,0x87,0x8b,0x85,0x83,0x81; /相应写操作的地址码uchar D7;void DS1302_WB(uchar dat) /在时序图中时钟上升沿操作/注意!无论是读/写都是从低位开始uchar i ;for(i=0;i= 1 ;uchar DS1302_RB() /在时序图中时钟下降沿读操作uchar i ,temp=0 ;for(i=0;i=1;SCL = 0 ;if(DAT)temp|=0x80;RST=0; /RST为低电平是,呈现高阻抗状态,为禁止数据操作return temp;void DS1302_WW(uchar add,uchar dat)RST = 0;RST = 1;DS1302_WB(add);DS1302_WB(dat);SCL = 0;/不可在此让时钟低电平,不然不可以改变时间RST = 0;uchar DS1302_RW(uchar add)uint dat;RST = 0;RST = 1;DS1302_WB(add); /先写操作字,然后读取相应的值dat=DS1302_RB();SCL = 0;RST = 0 ;return(dat);void Init_DS1302(void) /初始化设定是时间,下次启动时无需初始化,uchar i,tmp;for(i=0;iBCD转换Set_Timei=Set_Timei%10;Set_Timei=Set_Timei+tmp*16;DS1302_WW(0x8E,0x00);/取消写保护for(i=0;i7;i+)DS1302_WW(W_ADi,Set_Timei) ;DS1302_WW(0x8e,0x80); /写保护void Read_Time(void) /读取时间到数组D中uchar i;for(i=0;i7;i+)Di=DS1302_RW(R_ADi) ;for(i=0;i7;i+)Di=(Di/16)*10+Di%16; (五)按键检测为了节省I/O口,本实验使用了74HC138译码器以扩展I/O口,译码器的接口定义如下:sbit CC= P04;sbit BB= P05;sbit AA= P46;sbit KEY = P45;按键的检测函数如下:void Check_Key(void)P4SW=0x70; /设置P4口的4、5、6脚为I/O口AA=0;BB=0;CC=0; /-UP-if(!KEY)delay200us(); /软件按键防抖延时if(!KEY)mark=UP;conut_up=OK;while(!KEY);AA=0;BB=0;CC=1; /-RIGHT-if(!KEY)delay200us();if(!KEY)mark=RIGHT;conut_right=OK;while(!KEY);AA=0;BB=1;CC=0; /-OK-if(!KEY)delay200us();if(!KEY)mark=OK;conut_ok=OK;while(!KEY);AA=0;BB=1;CC=1; /-LEFT-if(!KEY)delay200us();if(!KEY)mark=LEFT;conut_left=OK;while(!KEY);AA=1;BB=0;CC=0; /-DOWN-if(!KEY)delay200us();if(!KEY)mark=DOWN;conut_down=OK;while(!KEY);(六)应用层应用层完成API函数的调用,也是整个软件部分的主函数。MAIN.c源文件定义如下:/*/* TFT彩屏多功能显示例程 */*/#include #include #include #include #include #include #include #include #include #include uchar i,reg7; /i为普通循环变量 reg暂存SetTime里的值,并改变SetTime里的值uchar count; /该变量暂存时间寄存器里的值uint kk; /为定时循环检测变量 其值超过255void main(void)EA=1;ET0=1;AUXR |=

温馨提示

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

评论

0/150

提交评论