版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
绪论在体育场、超市、商业应用、银行、证券、码头、商场、车站、邮政、电信等不同地方。LED显示屏随处可见。随着科技的不断发展,LED显示屏逐渐向多元化方向发展,制造成本越来越低。但在实际应用中,特别是当大量显示内容需要实时更新时,用户通过上位机与单片机连接来修改软件中的显示内容,既繁琐又不方便。近年来,由于无线数据传输技术的快速发展,蓝牙技术作为一种短距离无线通信技术得到了广泛的应用。与传统有线电缆连接相比,具有便携性强、适用范围广、安全性高、适用范围广的特点。因此,针对蓝牙的优势,设计了一种LED显示屏,不仅可以显示汉字和图案,还可以通过手机蓝牙改变LED显示屏的日期和时间,不仅可以避免成本较高的主机软件和控制卡,还可以使其操作更加简单。1.1研究现状和发展趋势1.1.1LED显示屏的研究现状随着我国发光二极管显示技术的稳步发展,LED显示的行业越来越多。不同行业的发展需求,推动着LED显示技术的发展。LED显示技术的生产主要集中在华东和华南地区,近年来,华北地区逐步也逐步开展LED显示的生产。由于我国LED显示屏技术逐渐成熟先进、价格更加低廉,开始了LED显示屏的对外出口,仅2014年LED显示屏出口量就达到55亿。光明的市场前景促使LED显示屏不断加强技术创新。控制和使用LED显示屏有两种方式。一种方式是电脑控制LED显示屏,实时反映播放画面或传递的一些信息。另一种方式是LED显示屏不需要其他工具,而是根据自身存储一些的信息或视频进行播放,以满足客户的需求。随着信息技术的发展,LED显示屏的控制有了不同的变化。一种是无线控制LED显示屏的便捷方式,前提是播放信息或视频时需要较强的WIFI信号,避免信号中断对信息传输的影响。另一种方式是通过LED显示屏连接互联网来控制LED显示屏,但是成本高,信号接收稳定,一般不会有信号中断。根据显示模式,LED显示器主要有三种类型。第一种是图形显示系统,只在LED显示屏上显示图形和文字,属于最基本的LED显示系统,一般用于会议室的标题显示。二是图像显示屏系统。与第一种相比,这种显示屏具有灰度,使显示的图像更加生动自然。第三种是视频显示系统,与前两种相比,它的技术含量有了很大的提高。它可以接受视频信号,显示的图像色彩丰富。是全彩LED显示屏。从LED显示屏的显示方式可以看出,LED显示屏的技术在不断创新,在原有的基础上增加了更多的元素,画面感、色彩感、动感越来越好。1.2.2LED显示屏的发展趋势在科研方面,我国的LED显示技术虽然在不断发展,但仍然存在很多不足。比如LED显示技术中的高亮度纯蓝、纯绿LED技术在国内还处于空白期。因此,要加大对LED显示屏的科研投入,提高LED显示屏技术在国内的竞争力。在控制技术创新上,LED显示屏不仅需要技术升级和创新,还需要有相应的产业链,才能同步发展,消除技术更新不及时带来的一些问题。从LED显示控制技术来看,LED显示还需要一些网线、WiFi或蓝牙来控制,以及一些客户需要的其他技术控制,需要不断的创新和发展,才能让LED显示更灵活的使用。在智能方面,随着互联网时代的到来,LED显示屏已经不再满足于通过一些简单的后台操作或者存储信息的自动播放来传递消息。反而对LED显示屏提出了更加智能化的要求,这就要求LED显示器的技术研发向智能化、简洁化方向发展,让人们更方便快捷地使用LED显示器。1.2蓝牙LED通信背景蓝牙技术是一种短距离无线数据通信,在10米半径内,可以实现点对点或点到多点的无线数据和语音传输。安卓手机通过蓝牙通讯设备接入微网,可以随时随地与蓝牙模块进行通讯。蓝牙设备通信的原理是在相对较短的距离内发送和接收无线电信号,设备通过蓝牙芯片可以找到其他蓝牙设备。当两台连接成功时便可以通过蓝牙进行数据通信。1.2.1Android蓝牙基本架构蓝牙广泛应用于各种消费类电子产品和一些手持设备(如手机、平板电脑等),并提供短距离、低成本的无线数据通信。蓝牙由许多协议组成,其中最重要的是模拟串口协议、服务发现协议和适配协议。蓝牙协议中的软硬件接口作为主控接口,可以访问不同的设备。大部分手机都会自带蓝牙,利用蓝牙与LED显示屏进行通信,使系统简便,节省成本。1.2.2蓝牙虚拟串口RFCOMM协议是比较简单的传输协议,用来模拟有线链路。它使用基于欧洲电信标准化组织TS7.10的串行端口模拟协议,并基于适配协议模拟串行端口,为构建在串行接口上的应用程序提供接口环境。正是因为蓝牙技术的这个优势,使得本系统中的手机和蓝牙模块能够很好的进行通信。1.3LED显示屏研究的意义LED显示屏的发展历史悠久,整个行业也在朝着多元化方向发展,传统的LED的显示屏在其形态和功能上已经不能再满足当今快速发展的智能化时代,通过一些简单的后台操作或自动播放存储的信息来传达信息已经不能满足人们的需求。因此,如何将LED显示技术朝着智能化、简洁化、便携化的方向发展,成为一个亟待解决的问题。随着互联网、物联网、大数据、人工智能等技术的发展,越来越多的可穿戴设备被开发和应用。智能手环、智能手表、智能t恤等可穿戴设备不断涌现。近年来,中国可穿戴设备市场持续增长。随着人与物联网交互技术的发展,可穿戴设备将成为一把智能钥匙,连接人与物,实现人与智能设备的对接、交互和控制。近年来,显示器与可穿戴技术相结合的可穿戴LED显示器为LED显示产业的发展提供了突破。可穿戴式LED显示屏基于发热低、节能、寿命长的特点而设计,为商家广告提供便利,使广告更新颖;在安全防护领域,如LED救生衣、LED安全防护服、LED发光警示服、LED荧光轻装背包、LED腰带等产品层出不穷。1.4LED显示屏研究目标和内容本文在传统LED显示屏显示汉字和图案的基础上,通过手机蓝牙更改LED显示屏日期和时间。它是为了解决传统LED显示屏在更改时间及日期上需连接至计算机或间接通过计算机修改,给普通用户带来不便。本文对软硬件模块进行了详细介绍及分析设计,C语言编写程序并运行后烧录进硬件系统,根据电路原理图焊接实物并调试成功。主要研究内容如下:在硬件系统设计中,对STC89C52功能及优点进行了介绍,硬件系统分为单片机最小系统、16*16LED点阵模块、蓝牙模块以及按键电路模块,对各个模块进行介绍及各个模块实现的具体功能进行详细阐述。软件系统设计分为Keil程序开发环境和字模软件的系统程序设计,主程序、按键扫描电路和时钟电路的软件流程图设计,编写、运行程序。2硬件系统设计安卓手机作为上位机,对显示内容进行编辑和存储,通过蓝牙通信模块将显示内容和控制指令传输给单片机系统。单片机根据上位机传送的内容和指令对LED点阵显示屏进行解码和扩展,使显示屏显示相应的内容,并通过按键模块改变显示内容。主控制器包括单片机最小系统、电源模块、时钟电路模块、LED点阵屏模块、蓝牙模块、按键电路组成,其结构框图如图2-1所示:2.1单片机及其他器件介绍本设计采用单片机STC89C52控制显示屏。89C52单片机主要由几个基本部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、I/O口(P0~P3口)、串口、定时器/计数器、中断系统、特殊功能寄存器(SFR)。它具有51系列单片机的共同特点。它有40个引脚,包括4个8位I/O端口:P0、P1、P2、P3,共32个引脚;电源Vcc引脚、电源GND引脚、外部晶体振荡器引脚XTAL1和XTAL2以及控制信号引脚RST、ALE、/PSEN和/EA。输入/输出端口:P0、P1、P2和P3。每个P端口有8位,其中P0端口为准双向端口。当用作输出端口时,必须先将1写入该端口。P0端口没有内部上拉电阻,所以在操作P0端口时,需要在其外部电路中加入上拉电阻。P3港有第二个功能。P2端口可用于访问16位地址的外部程序存储器和外部数据存储器。P2端口发送高位8位地址,P0端口提供低位8位地址,P0端口分时提供8位数据总线。控制信号引脚:RST、ALE、/PSEN和/EA。RST是单片机的复位引脚,外部硬件电路可以实现单片机的复位操作。ALE是数据锁存使能信号引脚,在高电平有效。单片机访问外部存储器时,ALE输出信号作为控制信号锁存低位8位地址。/PSEN是程序存储许可输出信号端子,主要用于片外存储器的操作。/EA是外部程序存储器的地址权限输入/固化编程电压输入,主要用于访问外部ROM。在实际应用中,该引脚保持高电平。晶振连接引脚:XTAL1和XTAL2。当需要连接振荡晶体时,晶体振荡器连接在两个引脚之间。如果需要外部时钟电路,XTAL1输入外部时钟脉冲,XTAL2引脚悬空。电源引脚:Vcc是连接到+5V电压源的电源端,GND是连接到电源地的接地端。单片机引脚图如下图2-2所示:74HC595是一款8位芯片,具有串行输入和并行输出。8位并行输出为三态输出,传输延迟短,支持高速串行连接。随着串行输入时钟信号SCK的上升延迟,数据从串行数据端口输入到内部8位移位缓存器,原始移位缓存器的最后一位从串行数据输出端输出,可以方便地实现级联。并行输出缓冲器的数据读取时钟信号LCK具有上升延迟,并且八位并行输出缓冲器将读取八位移位缓冲器上的数据线输出端的输出。74HC138是一款3线8线解码器。输入端的数据从000变为111,八个输出端对应的输出端输出低电平,其他输出端输出高电平,完成变量解码。使能端的两片74HC138可以组成4线和16线解码器。DS1302是一款高性能、低功耗、RAM的实时时钟电路。可以计时年、月、日、周、时、分、秒,具有闰年补偿功能。工作电压为2.0V~5.5V,DS1302的主要特点是采用串行数据传输,可以为断电保护电源提供可编程充电功能,关闭充电功能。芯片组成的电路通过串行接口与单片机通信,与单片机的接口连接简单地通过同步串行通信实现。控制和传输数据只需要三根线,而DS1302芯片为此设计提供了时间数据。2.2STC89C52单片机最小系统STC89C52单片机最小系统电路由复位电路、时钟电路和电源电路。单片机最小系统原理图如下图2-3所示(1)VCC和GND为单片机的电源引脚,为单片机提供电源。(2)复位电路可以保证单片机在工作出现不稳定或程序跑飞、死循环现象时等的象,使单片机重新初始化。复位的方式有手动按键复位和上电自动复位功能。系统上电复位按键接口采集到两个高端信号后进行手动复位,就是非自动的按键复位;系统检测到的电压由低电平上升到高电平的一段时间后,在这段时间过后,系统通过电阻与接地之间形成一条通路,然后自动把高电平进行拉低,使得单片机从高电位变为低电位,从而就是给单片机自动进行上电复位。(3)时钟电路由晶振Y1、瓷片电容C1和C2组成,为单片机提供工作的时序脉冲,可稳定频率并对振荡频率有微调作用。给控制芯片正常工作的时钟信号,使得整个控制系统能正常工作,由于要保证控制系统能正常工作,提高工作效率,通常用11.0592MHZ晶振和30PF的电容进行组合,电容可以帮助晶振起振,使得数字控制器上电以后可以正常工作。(4)JD1为单片机的下载接口。2.3电源电路设计本系统选择5V直流电源作为系统总电源,为整个系统供电,电路简单、稳定。DC为电源的DC插座,可以直接接USB电源线,一端插在DC插座上,另外一端可以插在充电宝、手机充电器等等。LED为红色LED灯,作为系统的指示灯,电阻为1K电阻,起到限流作用,保护LED灯,以防电流过大烧坏LED灯。SW为自锁开关,开关按下后,红灯亮,此时系统电源5V直流输出。开关再次按下后,红灯灭,此时系统电源无5V电源输出。2.4DS1302时钟电路设计在本电路中,选择32.768KHZ晶振为DS1302提供时钟源,3V纽扣电池保证了DS1302掉电不丢失时间数据,电阻均为上拉电阻,使得DS1302工作更稳定。其电路原理图如下图2-4所示。2.316x16LED点阵屏模块电路设计显示屏的16×16点阵由4个8×8点阵模块组成,第一和第二个8×8点阵行信号接口连接在一起,显示字体上部;第三行信号接口连接第四个8×8点阵显示字体下部,形成16×16点阵显示屏。LED显示屏有16排,每个74HC595可以控制8排显示屏,所以需要两个74HC595的芯片。74HC595将时钟控制信号串联在一起,前一个74HC595的Q7引脚连接到下一个74hc595的数据输入端DS,使得并行输出脉冲有效时,所有列信号同时发出。两个74HC138解码器级联驱动16×16显示屏的列。两个74HC138解码器的16个输出端口连接到对应的16×16LED汉字显示屏的每一列,单片机的端口P2.0、P2.1、P2.2、P2.3、P2.4由软件程序控制,实现LED显示屏的列驱动。列驱动器芯片和行驱动器芯片被同时控制。当给出74HC595的锁存信号时,行驱动芯片的输出引脚输出要显示的一行数据,然后显示该行中的汉字。按照这个操作顺序,从第一行到最后一行依次循环实现行扫描,可以显示整个屏幕上的汉字。字体通常由专门的软件生成,也可以手动编译,获得的字体可以存储在单片机中。要改变LED点阵显示的内容,只需改变单片机读取的字体即可。16x16LED点阵屏模块原理图如图2-6如下:2.6LY蓝牙模块电路设计手机上的蓝牙模块(主设备)首先搜索周围可以搜索的蓝牙设备(从设备),然后进行匹配。匹配后可以在手机输入主。手机通过蓝牙APP向蓝牙模块发送日期和时间,主控制器接收蓝牙模块的信息,转换成点阵信息,刷新LED点阵显示面板。蓝牙模块接口电路图如下图2-7所示。2.7按键电路设计按键电路实现的是不同的按键下,LED显示内容不同。在本设计中,一共涉及了四种类型的按键。按下K1按钮,显示屏将显示“欢迎使用”字幕,如无中断,字幕将一直循环;按下K2按钮后,显示屏将显示日期,如无中断,将一直循环;按下K3按钮后,显示屏显示时间,如无中断,字体一直循环。任意时间按下K4按钮,系统将刷屏,并定格于初始图案。在本系统中,按键作为系统的输入,起到了人机交互的枢纽作用。其电路原理图如下图2-8所示。3软件系统的设计3.1系统程序设计3.1.1Keil程序开发环境本设计中单片机开发环境是Keil,Keil是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境,将这些部分组合在一起。其中Keil有以下特点:(1)Keil软件同时支持WINXP和WIN7等多种操作系统,提供了丰富的库函数和功能强大的开发工具。(2)Keil可以完成从编辑、编译、到连接、调试的一套开发流程。Keil软件界面如下图3-1所示:3.1.2字模软件设计LED显示屏是点阵显示方式,所以显示汉字的时候需要提取汉字字模。汉字的点阵字模是从点阵字库文件中提取出来的。在本设计中用PctoLCD2002来提取字模代码,如输入“加油”字样,其结果如图3-2所示:3.3软件流程图设计主程序的程序框图如图3-3所示:系统在LED显示屏的初始化时间实现了“心形”模式、“欢迎使用”汉字、年、月、具体时间。汉字代码预先存储在单片机的程序存储器中,程序运行后的代码将以数组的形式存储在程序的初始化中。编程主要体现模块化,每个功能用独立的子功能编写,然后主功能调用子程序实现相应的功能,其中子功能包括按键扫描功能和时钟功能。程序首先初始化所有的宏定义和全局变量,以及ROM中存储的数据,然后初始化字体提取和DS1302,按照DS1302的工作顺序读取实时时钟,并发送到LED显示屏显示。如果按下K4键,LED显示屏初始化显示“心形”图案;按下K3键时,LED显示屏上显示的“欢迎使用”内容向左移动;如果按下K2键,发光二极管显示屏显示日期和月份;如果按下K4键,将显示具体时间。3.3.1按键扫描电路的程序设计按键扫描电路的时序图如图3-4所示。键盘扫描程序主要在程序执行的中间,主要功能是连续扫描键盘。如果按下一个键,程序将转到执行判断键值,并执行相应的程序。本程序段主要判断密钥的键值。当按下K1-K4键时,全局变量A的值分别赋值为1-4,这样在执行特定的键值时,可以实时查询全局变量的变化,可以中断当前的显示状态,执行被按下键的状态显示3.3.2实时时钟电路的程序设计读取时钟是按照DS1302的时序图,对时钟进行读取的,并将读取的时间或者日历做数值转换处理,转换成十进制数,调用对应的字模代码,并送给LED显示屏显示。时钟读取的程序框图如图3-5所示:3.4程序编程调试运行程序后,程序没有出错,运行结果如3-6所示:4实物制作与调试4.1焊接元件焊接步骤为在认真检查电路和确保电路原理正确后,对原理图中的元器件型号、参数、个数进行清点,用万用表检测电阻、二极管、三极管、电容,参数正确,按照焊接准则“注意正负,认准型号,一个模块依次焊接,先小件后大件,焊一件测一件,测通路检短路”进行焊接,焊接完成后,再一次与原理图对照,确认无误。元件焊接如图4‐1所示:4.2系统调试系统调试分为APP安装和硬件电路调试两部分内容。4.2.1APP安装根据蓝牙串口模块下载蓝牙串口助手APP,蓝牙串口助手是一款基于RFCOMM蓝牙串口服务的传输软件,通过该软件可以连接蓝牙串口模块进行通信,实现手机串口连接。类似计算机的串口调试助手,是电子工程师的开发利器。该软件的功能有:发现和连接蓝牙串口模块;接收和发送数据;可选择ASCI工码显示或HEX十六进制显示;发送十六进制数据;将串口接收到的数据保存成txt文件;对发送和接收的字节进行计数;按设置的时间间隔发送数据。4.2.2硬件电路调试调试过程如下:首先给设备供电,然后打开手机APP的蓝牙串口控制界面,点击按钮“进入蓝牙串口助手”,点击“连接设备”,若手机界面显示为“已连接到:JDY-31-SPP”,则手机上显示蓝牙连接成功,则表示蓝牙通信成功。则可在输入框中输入内容,例如输入:“*2021051912025503#”,表示的内容为“2021年05月19日12时02分55秒周03”。调试结果如图4-3所示:4.2.3功能本系统由STC89C52单片机、DS1302时钟、16*16点阵屏模块、蓝牙模块、按键及电源组成。通过运用STC89C52单片机控制LED滚动广告屏显示中文及日期、时间。1.接通电源后,LED显示屏将自动刷屏一次,并最终定格与一个心形图案。2.按下K1按钮,显示屏将显示“欢迎使用”字幕,如无中断,字幕将一直循环。3.按下K2按钮后,显示屏将显示日期,如无中断,将一直循环。4.按下K3按钮后,显示屏显示时间,如无中断,字体一直循环。任意时间按下K4按钮,系统将刷屏,并定格于初始图案。5结论该系统在传统LED显示屏显示汉字及图案的基础上,增加了手机蓝牙控制LED显示屏,修改显示屏的日期及时间。目的是为了解决传统LED点阵显示屏需要连接电脑或由电脑间接改装,给普通用户带来的不便。在本次设计中,根据传统LED显示屏显示内容的不便的角度进行分析,从如何设计才能使其使用简便的角度出发,查阅相关的文献资料后,确定了总体设计设计思路。然后完成软硬件系统的模块设计和编程,烧录之后,通过焊接并调试实物。附录附录1:主程序代码#include"main.h"#include<intrins.h>#include"ds1302.h"#include"delay.h"unsignedlongtime_2ms=0;sbitled=P2^7;//接口定义sbitkey4=P2^6;sbitkey3=P2^5;sbitkey2=P2^4;sbitkey1=P2^3;#defineDisplay_Num_Word1 //液晶能显示的汉字个数unsignedcharDisplay_Buffer[2];//显示缓存unsignedcharDisplay_Swap_Buffer[Display_Num_Word][32]={0};//显示缓存 //显示缓冲区bitShift_Bit=0; //位标志bitFlag_Shift=0; //更新标志unsignedcharTimer0_Count=0; //计数unsignedchartemp=0x80; //中间变量unsignedcharShift_Count=0;unsignedcharDisplay_Word_Count=0;//显示计数#defineNum_Of_Word4 //汉字数量unsignedcharxdataWord[Num_Of_Word][32]={0xff};unsignedcharcodeXueXiao[4][32]={0xFF,0xFF,0x03,0xFB,0xFA,0xB6,0xD5,0xEB,0xEF,0xD7,0xDB,0xBA,0x7E,0xFD,0xFB,0xF7,0x7F,0x7F,0x7F,0x03,0xFB,0xF7,0xBF,0xBF,0xBF,0x5F,0x5F,0xEF,0xEF,0xF7,0xFB,0xFD,/*"欢",0*/0xFF,0xDF,0xEC,0xED,0xFD,0xFD,0x0D,0xED,0xED,0xED,0xEC,0xED,0xEF,0xD7,0xB8,0xFF,0xFF,0x7F,0xC3,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0x4B,0xD7,0xDF,0xDF,0xDF,0x01,0xFF,/*"迎",1*/0xEF,0xEF,0xE0,0xDF,0xDF,0x98,0x9B,0x5B,0xD8,0xDF,0xDD,0xDE,0xDF,0xDE,0xDD,0xD3,0xBF,0xBF,0x01,0xBF,0xBF,0x03,0xBB,0xBB,0x03,0xBF,0xBF,0xBF,0x7F,0xBF,0xCF,0xF1,/*"使",2*/0xFF,0xC0,0xDE,0xDE,0xDE,0xC0,0xDE,0xDE,0xDE,0xC0,0xDE,0xDE,0xDE,0xBE,0xBE,0x7F,0xFF,0x07,0xF7,0xF7,0xF7,0x07,0xF7,0xF7,0xF7,0x07,0xF7,0xF7,0xF7,0xF7,0xD7,0xEF,/*"用",3*/};unsignedcharcodeNum0[16]={0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"0",0*/};unsignedcharcodeNum1[16]={0xFF,0xFF,0xFF,0xEF,0x8F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF,/*"1",0*/};unsignedcharcodeNum2[16]={0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xFB,0xFB,0xF7,0xEF,0xDF,0xBD,0x81,0xFF,0xFF,/*"2",1*/};unsignedcharcodeNum3[16]={0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xFB,0xE7,0xFB,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"3",2*/};unsignedcharcodeNum4[16]={0xFF,0xFF,0xFF,0xFB,0xF3,0xEB,0xDB,0xDB,0xBB,0xBB,0x81,0xFB,0xFB,0xE1,0xFF,0xFF,/*"4",3*/};unsignedcharcodeNum5[16]={0xFF,0xFF,0xFF,0x81,0xBF,0xBF,0xBF,0xA7,0x9B,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"5",5*/};unsignedcharcodeNum6[16]={0xFF,0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"6",6*/};unsignedcharcodeNum7[16]={0xFF,0xFF,0xFF,0x81,0xBB,0xBB,0xF7,0xF7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,/*"7",7*/};unsignedcharcodeNum8[16]={0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,/*"8",8*/};unsignedcharcodeNum9[16]={0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF,/*"9",9*/};unsignedcharcodeMaoHao[16]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,/*":",0*/};unsignedcharcodeGang[16]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"-",0*/};unsignedcharcodexinxing[1][32]= //心形{0xFF,0xFF,0xFF,0xE1,0xC0,0x80,0x80,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0x03,0x01,0x01,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF,//心形};voidDisplayXin(unsignedchardat[][32]);xdataunsignedcharfirstin=0; //首次接收到标志xdataunsignedchartab[20]; //串口数据暂存xdataunsignedcharCount=0; //串口接收计数xdataunsignedcharuartbusy=0; //串口判忙unsignedcharxdatatime_buf2[17];//更新时间变量unsignedcharSetFlag=0; //时间设置标志unsignedlongtime_20ms=0;//系统时间计数bitReadTimeFlag=0;//定义读时间标志unsignedcharkeyFlag=0;//按键标志unsignedi2;unsignedcharrekey;unsignedchartiquNum(unsignedcharNum,i);voidUART_Init(void);voidmain(){ unsignedchari; Init_Timer0(); //初始化定时器 UART_Init(); //初始化串口 Ds1302_Init(); //初始化时钟//Ds1302_Write_Time(); Ds1302_Read_Time();//读取时间参数 for(i2=0;i2<16;i2++) { Word[0][i2]=tiquNum(time_buf1[4]%100/10,i2); //提取时间时 Word[0][i2+16]=tiquNum(time_buf1[4]%10,i2); Word[1][i2]=MaoHao[i2]; //冒号 Word[1][i2+16]=tiquNum(time_buf1[5]/10,i2);//提取时间分 Word[2][i2]=tiquNum(time_buf1[5]%10,i2); Word[2][i2+16]=MaoHao[i2];//冒号 Word[3][i2]=tiquNum(time_buf1[6]/10,i2); //提取时间秒 Word[3][i2+16]=tiquNum(time_buf1[6]%10,i2); } Clear_Display(); while(1) { if(SetFlag==1)//如果接收到串口信息则更新时钟 { for(i=0;i<8;i++) { time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数1和5整合成15 } Ds1302_Write_Time();//接收更新的时间然后写入ds1302 SetFlag=0;//时钟信息更新后标志位清零 } if((key1==0)||(key2==0)||(key3==0)||(key4==0))//检测到按键按下 { if(rekey==0)//防止重复按下 { DelayMs(10); if(key1==0)//确认按键按下 { rekey=1; //防止重复 keyFlag=1; Shift_Bit=0; //初始化所有显示参数 Flag_Shift=0; //标志清零 Timer0_Count=0;//定时计数清零//**Allnotescanbedeletedandmodified**// Shift_Count=0;//计数清零 Display_Word_Count=0; //显示字数清零 Clear_Display();//清屏 } elseif(key2==0) { rekey=1;//防止重复 keyFlag=2; Shift_Bit=0; //初始化所有显示参数 Flag_Shift=0; //标志清零 Timer0_Count=0;//定时计数清零 temp=0x80; //初始化中间变量 Shift_Count=0; //计数清零 Display_Word_Count=0; //显示字数清零 Clear_Display(); //清屏 } elseif(key3==0) { rekey=1;//防止重复 keyFlag=3; Shift_Bit=0; //初始化所有显示参数 Flag_Shift=0; //标志清零 Timer0_Count=0;//定时计数清零 temp=0x80; //初始化中间变量 Shift_Count=0;//计数清零 Display_Word_Count=0; //显示字数清零 Clear_Display();//清屏 } elseif(key4==0) { rekey=1; //防止重复 keyFlag=0; Shift_Bit=0; //初始化所有显示参数 Flag_Shift=0; //标志清零 Timer0_Count=0;//定时计数清零 temp=0x80; //初始化中间变量 Shift_Count=0; //计数清零 Display_Word_Count=0; //显示字数清零 Clear_Display(); //清屏 } ReadTimeFlag=1;//读取时间 } } else {rekey=0;} //防止重复按下 if(ReadTimeFlag==1)//定时读取ds1302定时时间到则标志位置1,处理过时间参数标志位清零 { ReadTimeFlag=0;//标志位清零 Ds1302_Read_Time();//读取时间参数 if(keyFlag==1) { for(i2=0;i2<16;i2++) { Word[0][i2]=tiquNum(time_buf1[4]%100/10,i2); //时 Word[0][i2+16]=tiquNum(time_buf1[4]%10,i2); Word[1][i2]=MaoHao[i2]; //: Word[1][i2+16]=tiquNum(time_buf1[5]/10,i2);//分 Word[2][i2]=tiquNum(time_buf1[5]%10,i2); Word[2][i2+16]=MaoHao[i2]; Word[3][i2]=tiquNum(time_buf1[6]/10,i2); //秒 Word[3][i2+16]=tiquNum(time_buf1[6]%10,i2); } } elseif(keyFlag==2) { for(i2=0;i2<16;i2++) { Word[0][i2]=tiquNum(time_buf1[1]%100/10,i2); //年 Word[0][i2+16]=tiquNum(time_buf1[1]%10,i2); Word[1][i2]=Gang[i2]; Word[1][i2+16]=tiquNum(time_buf1[2]%100/10,i2);//月 Word[2][i2]=tiquNum(time_buf1[2]%10,i2); Word[2][i2+16]=Gang[i2]; Word[3][i2]=tiquNum(time_buf1[3]%100/10,i2);//日 Word[3][i2+16]=tiquNum(time_buf1[3]%10,i2); } } elseif(keyFlag==3) { for(i2=0;i2<16;i2++) { Word[0][i2]= XueXiao[0][i2]; //显示欢迎使用 Word[0][i2+16]= XueXiao[0][i2+16]; Word[1][i2]= XueXiao[1][i2]; Word[1][i2+16]= XueXiao[1][i2+16]; Word[2][i2]= XueXiao[2][i2]; Word[2][i2+16]= XueXiao[2][i2+16]; Word[3][i2]= XueXiao[3][i2]; Word[3][i2+16]= XueXiao[3][i2+16]; } } } if(keyFlag!=0) { Display(Display_Swap_Buffer);//显示提取的数据 if(Flag_Shift==1) { Flag_Shift=0; Display_Word_Count=Shift_Count/16; //计算当前显示第几个字 Calc_Shift(); Shift_Count++; if(Shift_Count==(Num_Of_Word+1)*16) //移动次数 { Shift_Count=0; //达到移动单位数从新计数 } } } else { DisplayXin(xinxing); //显示心形 } }}unsignedchartiquNum(unsignedcharNum,i) //提取自摸{ switch(Num) { case0:return(Num0[i]);break;//自摸0一下类似 case1:return(Num1[i]);break; case2:return(Num2[i]);break; case3:return(Num3[i]);break; case4:return(Num4[i]);break; case5:return(Num5[i]);break; case6:return(Num6[i]);break; case7:return(Num7[i]);break; case8:return(Num8[i]);break; case9:return(Num9[i]);break; default:break; } return(0);}//****************************************************//初始化定时器0//****************************************************voidInit_Timer0(){//**Allnotescanbedeletedandmodified**//TMOD|=0x10; //T0,工作模式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; //开启定时器 ET0=1; //开启定时器中断 EA=1; //开启总中断 }//****************************************************//中断函数//****************************************************voidTimer0()interrupt1{ TH0=(65536-5000)/256; TL0=(65536-5000)%256; TF0=0; Timer0_Count++; if(Timer0_Count>=10) //计数约50ms5ms一次10次 { Timer0_Count=0; //重新计数 Flag_Shift=1; //标志位置位 }}//************************************************************//num为字数dat[][32]为字模的名称//*************************************************************voidDisplayXin(unsignedchardat[][32]) { unsignedchari,j; for(i=0;i<16;i++) { LEDARRAY_G=1; //更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。 Display_Buffer[0]=dat[0][i]; //填充要显示的数据 Display_Buffer[1]=dat[0][i+16]; Send(Display_Buffer[1]);//发送显示数据 Send(Display_Buffer[0]); LEDARRAY_LAT=1; //锁存数据 _nop_(); LEDARRAY_LAT=0; _nop_(); Scan_Line(i); //选择第i行 LEDARRAY_G=0; for(j=0;j<100;j++); //延时一段时间,让LED亮起来。 } }//************************************************************//计算移动数据,存在在缓冲器//************************************************************voidCalc_Shift(){ unsignedchari; for(i=0;i<16;i++) { if((Display_Swap_Buffer[0][16+i]&0x80)==0) //前8位 移位 { Display_Swap_Buffer[0][i]=(Display_Swap_Buffer[0][i]<<1)&0xfe; //最低位清零 } else { Display_Swap_Buffer[0][i]=(Display_Swap_Buffer[0][i]<<1)|0x01; //最低位置一 } if(Shift_Count%16<8&&Display_Word_Count<Num_Of_Word) { Shift_Bit=Word[Display_Word_Count][i]&temp; } elseif(Shift_Count%16<16&&Display_Word_Count<Num_Of_Word) { Shift_Bit=Word[Display_Word_Count][16+i]&temp; } else { Shift_Bit=1; //把字移出缓冲区 } if(Shift_Bit==0) //后8位移位 { Display_Swap_Buffer[0][16+i]=(Display_Swap_Buffer[0][16+i]<<1)&0xfe; //最低位清零 } else { Shift_Bit= 1; Display_Swap_Buffer[0][16+i]=(Display_Swap_Buffer[0][16+i]<<1)|0x01; //最低位置一 } } temp=(temp>>1)&0x7f; if(temp==0x00) { temp=0x80; ReadTimeFlag=1; led=!led; }}//************************************************************//清空缓冲区//************************************************************voidClear_Display(){ unsignedchari,j; for(j=0;j<Display_Num_Word;j++) { for(i=0;i<32;i++) { Display_Swap_Buffer[j][i]=0xff; //0=显示1=不显示 } }}//************************************************************//num为字数dat[][32]为字模的名称//*************************************************************voidDisplay(unsignedchardat[][32]) { unsignedchari,j; for(i=0;i<16;i++) { LEDARRAY_G=1; //更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。 Display_Buffer[0]=dat[0][i]; Display_Buffer[1]=dat[0][i+16];//**Allnotescanbedeletedandmodified**// LEDARRAY_LAT=1; //锁存数据 _nop_(); LEDARRAY_LAT=0; _nop_(); Scan_Line(i); //选择第i行 LEDARRAY_G=0; for(j=0;j<100;j++); //延时一段时间,让LED亮起来。 } }//****************************************************//扫描某一行//****************************************************voidScan_Line(unsignedcharm) //行扫描{ switch(m) { case0: LEDARRAY_D=0;LEDARRAY_C=0;LEDARRAY_B=0;LEDARRAY_A=0; break; case1: LEDARRAY_D=0;LEDARRAY_C=0;LEDARRAY_B=0;LEDARRAY_A=1; break; case2: LEDARRAY_D=0;LEDARRAY_C=0;LEDARRAY_B=1;LEDARRAY_A=0; break; case3: LEDARRAY_D=0;LEDARRAY_C=0;LEDARRAY_B=1;LEDARRAY_A=1; break; case4: LEDARRAY_D=0;LEDARRAY_C=1;LEDARRAY_B=0;LEDARRAY_A=0; break; case5: LEDARRAY_D=0;LEDARRAY_C=1;LEDARRAY_B=0;LEDARRAY_A=1; break; case6: LEDARRAY_D=0;LEDARRAY_C=1;LEDARRAY_B=1;LEDARRAY_A=0; break; case7: LEDARRAY_D=0;LEDARRAY_C=1;LEDARRAY_B=1;LEDARRAY_A=1; break; case8: LEDARRAY_D=1;LEDARRAY_C=0;LEDARRAY_B=0;LEDARRAY_A=0; break; case9: LEDARRAY_D=1;LEDARRAY_C=0;LEDARRAY_B=0;LEDARRAY_A=1; break; case10: LEDARRAY_D=1;LEDARRAY_C=0;LEDARRAY_B=1;LEDARRAY_A=0; break; case11: LEDARRAY_D=1;LEDARRAY_C=0;LEDARRAY_B=1;LEDARRAY_A=1; break; case12: LEDARRAY_D=1;LEDARRAY_C=1;LEDARRAY_B=0;LEDARRAY_A=0; break; case13: LEDARRAY_D=1;LEDARRAY_C=1;LEDARRAY_B=0;LEDARRAY_A=1; break; case14: LEDARRAY_D=1;LEDARRAY_C=1;LEDARRAY_B=1;LEDARRAY_A=0; break; case15: LEDARRAY_D=1;LEDARRAY_C=1;LEDARRAY_B=1;LEDARRAY_A=1; break; default:break; }}//****************************************************//发送数据//****************************************************voidSend(unsignedchardat){ unsignedchari; charj=0; LEDARRAY_CLK=0; _nop_(); LEDARRAY_LAT=0; _nop_(); for(i=0;i<8;i++) { if(dat&0x01) { LEDARRAY_DI=1; //置位根据模块资料来 } else { LEDARRAY_DI=0; } LEDARRAY_CLK=1; //上升沿发送数据 _nop_(); LEDARRAY_CLK=0; _nop_(); d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 投资策略出纳岗位招聘合同
- 毛坯房买卖二手房合同样本
- 砌筑工程三方施工合同
- 航空服务兼职地勤协议
- 创意园区施工合同
- 网络布线施工合同
- 仓储设施管桩施工合同
- 飞机场航站楼钢架雨棚安装协议
- 美食城租赁联营合作协议
- 场地检测合同范例
- 2024年天然气管道施工环保劳务合同范本3篇
- 防范非法金融宣传
- 重症监护室抢救制度
- 统编版(2024)七年级上册道德与法治第四单元学情调研测试卷(含答案)
- 小学语文骨干教师专题讲座《自由阅读-开启快乐的读书之门》
- C语言程序设计-001-国开机考复习资料
- 华为经营管理-华为激励机制(6版)
- 2024年社会工作者-社会综合能力考试历年真题
- 人力资源的降本增效操作
- 机场航班信息LED显示屏方案
- 村级财务课件教学课件
评论
0/150
提交评论