电子设计竞赛-多功能电子秤设计报告及源代码

合集下载

基于STM32的多功能电子秤

基于STM32的多功能电子秤

2012年电子设计大赛黑龙江科技大学题目名称:多功能电子计价秤制作参赛队员:张城照黄力修陈高禹院系:电气与信息工程学院摘要:智能电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。

它与我们日常生活紧密结合成为一种方便、快捷、称量精确的工具,广泛应用于商业、工厂生厂、集贸市场、超市、大型商场、及零售业等公共场所的信息显示和重量计算。

本作品使用STM32单片机作为中心控制单元,通过称重传感器采集质量信息,以HX711进行模数转换单元,在配以TFT液晶显示和触摸屏控制,及WT588D进行语音播报组成。

该电子称不但计量准确、快速方便,更重要的自动称重、计价功能外,还可实现去皮、净/毛转,自动计算,数字显示,语音播报,显示实时温度,实时时间。

本系统是针对是电子称的自动称重、自动计价、数据处理,语音播报进行研究的。

为了阐明用单片机是如何对采样数据进行处理,对数据的采集和转换、计算问题进行了研究。

讨论了单片机控制系统中关键的中断、计算问题,结果表明通过软件设计实现更完善。

本文在给出智能电子称硬件设计的基础上,详细分析了电子称的软件控制方法。

由于单片机控制的电子称结构简单,成本低廉,深受人们的喜爱,本文将对此进行详细讨论关键字:电子秤;STM32;称重传感器;HX711; TFT液晶屏幕;WT588DAbstract:Intelligent electronic balance values detection and the modern new-type names of technical com prehensive one body such as conversion technical, computer technology, message handling and d igital technology instrument. Its and our close combination of daily life becomes a kind of conveni ent, shortcut, weighing accurate tool , is applied extensively in commercial, factory raw factory , g athers trade market, supermarket and large scale market , the message of the etc. public place of retail trade shows and weight calculation.Intelligent electronic name passes through name mainly with STM32 as central control unit, value sensor to carry out modulus conversion unit , it is matching with keyboard , show by TFTand powerful software to form. It is accurate that this electron claims to not only measure , fast c onvenience, more important automatic name may still realize besides heavy, valuation function t o remove the peel , completely / hair turns , calculate voluntarily, figure shows , is welcomed by masses of user. Intelligent electronic name since carry convenience.This system aims at is the automatic name of electronic name heavy, automatic valuation and dat a handling carry out research. To expound to use single flat machine , it is to how to carry out han dling for sampling data , is for the collection of data and conversion and calculation problem has s tudied. Have discussed the suspension of the key in single flat machine control system , calculate problem , show as a result that through software design, realization is perfected more. This text is weighing the foundation of hardware design to intelligent electron , has analysed the software c ontrol method of electronic name in detail. Since the electron of single flat machine control weig hs structure, is simple, cost is cheap, receive deeply people like , this text will carry out detailed di scussion for this.Key words:Intelligent and electronic to scale; Single flat machine 89c52; Weigh heavy sensor; LED shows题目要求:1.基本部分:(1)能用键盘设置单价,称重后能同时显示重量、单价和总额;电子计价秤:最大称重为10.000公斤,重量误差不大于±0.1%;(2)具有TFT液晶屏显示,显示重量、单价、总额等信息。

电子秤课程设计实验报告

电子秤课程设计实验报告
≥2000(100VDC)
蠕变(%F.S/3min)
0.05
推荐激励电压(V)
3~12
零点漂移(%F.S/1min)
0.05
工作温度范围 (℃)
-10~+50
零点温度漂移(%F.S/10℃)
0.2
过载能力(%F.S)
150
由于其激励电压越高,准确度越高的特性,本次设计使用10V电源供电。
2.2信号放大电路的设计与选择
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定
ADC_InitStructure.n_Right; //右对齐
c.单片机数据处理及控制电路,包括矩阵键盘,OLED屏幕等。
d.双电源供电及变压电路。
1.2.2 基本工作原理及原理框图
图一:基本硬件系统结构图
全桥电阻应变式传感器输入电压,当标准重物放置在传感器之上时,电阻值发生改变,使加载到全桥电路上的输出电压发生变化,变化范围约为3mV到10mV运用AD620N仪表放大电路将微弱模拟信号放大,并经过LM358搭建的电压跟随器电路滤波。送至STM32单片机中进行A/D模数转换,将模拟信号转变成单片机能够识别的数字信号,并且利用单片机控制整个电路的同时,处理数字信号,并且控制在OLED中显示实时结果。
量程(kg)
3kg
综合误差(%F.S)
0.05
额定输出温度飘移(%F.S/10℃)
≤0.15
灵敏度(mv/v)
1.0±0.1

基于单片机的智能电子秤设计

基于单片机的智能电子秤设计

基于单片机的智能电子秤设计随着科技的不断发展,智能化和自动化已经成为我们生活中不可或缺的一部分。

在众多领域中,智能电子秤的设计与应用也越来越受到。

本文将介绍一种基于单片机的智能电子秤设计方案,该设计具有高精度、低成本、易于实现等优点,具有一定的实用价值。

一、概述智能电子秤是一种能够自动测量物体重量的设备,广泛应用于超市、菜市场等场所。

与传统的机械秤相比,智能电子秤具有测量精度高、使用方便、易于维护等优点。

而基于单片机的智能电子秤设计,更是将智能化和自动化技术融入到电子秤中,提高了设备的性能和可靠性。

二、设计原理基于单片机的智能电子秤设计主要是利用单片机的控制和数据处理能力,实现对物体重量的准确测量。

其核心部件为压力传感器和单片机。

压力传感器负责采集物体的重量信号,并将信号传输给单片机;单片机则对信号进行处理、分析和存储,同时控制显示屏显示物体的重量。

三、硬件设计1、单片机选择单片机是智能电子秤的核心部件,负责控制整个系统的运行。

本设计选用AT89C51单片机,该单片机具有低功耗、高性能、易于编程等优点,能够满足智能电子秤的设计要求。

2、压力传感器选择压力传感器是智能电子秤的重要组成部件,负责采集物体的重量信号。

本设计选用电阻应变式压力传感器,该传感器具有测量精度高、稳定性好、抗干扰能力强等优点。

3、显示模块选择显示模块负责将物体的重量信息呈现给用户。

本设计选用LED显示屏,该显示屏具有亮度高、视角广、寿命长等优点。

4、电源模块选择电源模块为整个系统提供稳定的电源,保证系统的正常运行。

本设计选用线性稳压电源,该电源具有输出电压稳定、纹波小、安全性高等优点。

四、软件设计软件设计是智能电子秤的关键部分之一,直接影响设备的性能和可靠性。

本设计的软件部分采用C语言编写,主要包括数据采集、数据处理、数据显示等模块。

具体流程如下:1、开机后,系统进行初始化操作;2、压力传感器采集物体的重量信号;3、单片机对采集到的信号进行处理和分析;4、单片机将处理后的数据存储到存储器中;5、单片机控制LED显示屏显示物体的重量信息;6、系统继续等待下一次测量。

多功能精准电子秤的设计与实现

多功能精准电子秤的设计与实现
Ab s t r a c t :T h e d e s i g n o f t h e e l e c t r o n i c s c a l e s u s e s mo i s t u r e - p r o o f ,wa t e r p r o o f a n d a n t i - s h i e l d i n g me a s u r e s ,t h e e l e c t r o n i c s c a l e s h a s

2 03 ・
多功能精准 电子秤 的设计 与实现
De s i g n a n d I mp l e me n t a t i o n o f Mu l t i f u n c t i o n a l P r e c i s i o n El e c t r o n i c S c a l e s
孙莉 S U N L i
( 德 州 学 院机 电系 , 德州 2 5 3 0 2 3) ( D e p t . o f E l e c t r o m e c h a n i c a l E n g i n e e r i n g o f D e z h o u U n i v e r s i t y , D e z h o u 2 5 3 0 2 3 , C h i n a )
摘要 : 本设 计的 电子秤采用防潮防水防屏 蔽等措施 , 该 电子秤具有 电压检 测功能, 当电压低 于正常工作 电压时 , L C D显示屏上低 压报警灯就会 亮起 , 电子秤 主要 由微控 制器、 传感器 、 显 示装 置三 大部分组成 , 本设计采 用的称重传感器是 电阻应 变片式 。
v o l t a g e d e t e c t i o n f u n c t i o n ,t h e l o w p r e s s u r e wa r n i n g l i g h t o f L C D d i s p l a y wi l l i l l u mi n a t e wh e n t h e v o l t a g e i s b e l o w t h e n o r ma l o p e r a t i n g

电子秤的设计报告

电子秤的设计报告

电子秤的设计报告学号:1605111班级:测控111姓名:绪论手提电子秤具有称重精确度高,简单实用,携带方便成成本低,制作简单,测量准确,分辨率高,不易损坏和价格便宜等优点。

是家庭购物使用的首选。

其电路构成主要有测量电路,差动放大电路,A/D转换,显示电路。

其中测量电路中最主要的元器件就是电阻应变式传感器。

电阻应变式传感器是传感器中应用最多的一种,广泛应用于电子秤以及各种新型结构的测量装置。

而差动放大电路的作用就是把传感器输出的微弱的模拟信号进行一定倍数的放大,以满足A/D 转换器对输入信号电平的要求。

A/D转换的作用是把模拟信号转变成数字信号,进行模数转换,然后把数字信号输送到显示电路中去,最后由显示电路显示出测量结果。

一、课题任务与要求1.设计题目:便携式电子秤的设计报告2.任务与要求:1)设计一个LED数码显示的便携式电子称。

2)采用电阻应变式传感器。

3)称重范围0~1.999KG。

二、系统概述1.方案比较:1)设计方案一①.系统框图:②. 系统设计思路、工作原理压力传感器实现压电转换,将压力转换为电信号。

经过高精度差动放大器放大后。

输入给模数转换器,转化为数字信号,由该数字信号控制编码器的编码,从而控制数码管显示。

③该设计的优劣:a.优点:每个模块的功能单一,且没有复杂的编程问题。

在整个系统进行调试时,可以比较方便的对每个模块进行测试,能够迅速找到出现问题的模块。

比较容易制作。

b.缺点:使用的芯片较多,信号的噪声较大,且数码管与编码器的电路比较繁杂,在实际焊接中容易出现问题。

2)设计方案二①.系统框图:②. 系统设计思路、工作原理:压力传感器实现压电转换,将压力转换为电信号。

经过高精度差动放大器放大后。

输入给模数转换器,从而控制数码管显示。

③该设计的优劣:a.优点:每个模块的功能单一,且没有复杂的编程问题。

在整个系统进行调试时,可以比较方便的对每个模块进行测试,能够迅速找到出现问题的模块。

2016江苏省大学生电子设计竞赛D题(附源程序)

2016江苏省大学生电子设计竞赛D题(附源程序)

2016江苏省大学生电子设计竞赛参赛试题(含题号):D 简易电子秤
摘要
本设计以MSP430单片机为控制核心,设计并实现了一个以电阻应变片为称重传感器的简易电子秤,具有“称重”、“计价”、“去皮”等功能。

具体来说,采用自制的电阻应变片称重传感器将砝码重量变化转换为电压信号的变化,并用精密仪用放大器放大信号以及A/D转化,最终将信号送往单片机处理,得到物体重量,同时,该设计还实现了通过按键对电子秤设置单价并计价与“去皮”功能。

关键词:电阻应变片称重传感器仪用放大器简易电子秤
1.方案设计与论证
本设计运用到五个模块,分别是主控芯片模块、HX711AD转换、LCD液晶显示模块、独立按键、称重传感器模块以及蓝牙数据传输(测试专用)。

系统方案框图如图1所示。

图1 系统方案框图
1.1主控芯片模块
方案一:采用51单片机,但是51单片机的IO口个数较少,同时处理性能较低,无法满足本设计的工作要求。

故我们不采用此方案。

电子称代码

电子称代码
_nop_();
_nop_();
_nop_();
}
}
}
/**************************************************
检查LCD忙状态
lcd_busy为1时,忙,等待;lcd_busy为0时。闲,可写指令与数据。
**************************************************/
sbit LCD_RW = P3^1; //液晶读/写控制
sbit LCD_EN = P3^2; //液晶使能控制
sbit led=P3^5;
sbit bell=P3^4;
sbit AD_EOC=P3^3; //A/D转换接口
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/**************************************************
***************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
float VOL;
unsigned char rekey=0,ge=0,shi=0,xiaoshu=0;
unsigned char setflag=0,fuwei;
float x[5]={0.00,0.00,0.00,0.00,0.00};

电子秤综合设计实验总结报告

电子秤综合设计实验总结报告

电子秤综合设计实验总结报告本次电子秤综合设计实验是本人在大学所学的电子课程中重点实验,其主要内容涵盖了电路设计、电子元器件的应用、程序编写、现场实验等方面。

因此,本人在这次实验中深刻地领悟到了实践对于知识学习的巨大影响,同时也积累了宝贵的经验和知识,下面就是本人对本次实验的总结报告。

一、实验目的1、通过对秤的基本原理的分析,掌握电子秤的实现原理;2、通过对电子秤系统设计过程中各个关键组成部分的计算、选择和设计,提高自己解决实际问题的能力;3、熟悉电子元器件的使用方法,掌握CAD、PROTEUS等软件工具的使用方法,提高自己的实践能力;4、了解MCU应用的实践,并掌握MCU编程的应用。

二、实验内容1、电路设计本次实验的电路设计主要分为三个部分:采样电路、模数转换电路和LCD显示模块。

采样电路是用来采集称量物体的电压信号的电路。

电路中采用的是通用运放和电位器来调整参考电平,通过变压器进行防干扰处理,最后输出被称量物品的电压信号。

模数转换电路是用来将电压信号转换成数字信号的电路。

电路中采用的是ADC0804模拟数字转换芯片。

ADC0804是一种8位模数转换器,提供一个串行数据输出(SCLK)和一组并行数据输出。

在实际的电路设计中,需要为其提供时钟信号、底电平、参考电压等输入。

通过将采样电路输出的电压信号输入到ADC0804中,就可以获得相应的数字信号。

LCD显示模块是用来将数字信号转换成对应的重量值并用LCD屏幕进行显示的模块。

其中,在实现该模块时,需要利用MCU进行计算。

MCU根据采集到的数字信号进行计算,将结果转换为重量值。

最后,通过LCD液晶屏幕进行显示。

2、程序编写MCU主控制器选用AT89S52。

AT89S52是8位单片机,具有14个I/O端口,有可编程中断控制器、标准2线UART串行口、3个定时器/计数器、8KB的Flash程序存储器等等。

程序编写的主要内容包括:采集到的数字信号进行计算、将结果转换为重量值、数据显示等等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多功能数字电子计价秤(C题)摘要:基于对物体重量测量的多功能数字电子秤系统由主控制器部分、称重传感器部分、信号放大和模数(A/D)转换部分、显示部分及电源五部分组成,设计以单片机C8051F120为主控核心器件,A/D模块采集电阻应变式传感器将物体的重量转化的电信号,进行处理输送给单片机,同时单片机控制LCD液晶显示器实时显示物体的重量、单价、金额以及当前的时间等信息。

测试结果表明:系统整体运行稳定,人机界面友好。

关键词:C8051F120 称重传感器A/D采样LCD显示1引言分析赛题,我们认为本多功能数字电子计价秤装置系统需要实现如下任务:1)能用键盘设置单价,称重后能同时显示重量、单价和总额;电子计价秤:大称重为15.000公斤,重量误差不大于±0.1%;2)具有实时时钟显示并具有掉电保护,可显示日历时钟(年、月、日、时、分、秒);3)扩展高精度A/D转换器,提高电子计价秤测量精度,测量误差不大于±0.01%;能预存10种商品的单价,可以随意调出使用。

基于以上分析,系统采用模块设计的方案实现系统的各项功能,主要由主控制器部分、数据采集及放大部分、A/D转换部分和显示部分,具体的实现方案如系统主框图1所示:图1 系统主框图2系统方案设计与论证2.1主控制器的选择在主控制器的选择上有以下两种方案:采用FPGA(现场可编程逻辑门阵列)作为系统的控制核心和基于单片机技术的控制方案。

上述两种控制方式除在处理方式和处理能力(速度)上的差异外,实现效果及复杂程度等方面也有显著的区别。

FPGA将器件功能在一块芯片上,其外围电路较少,集成度高。

而单片机技术成熟,开发过程中可以利用的资源和工具丰富、价格便宜、成本低。

鉴于本设计中,需要采集传感器称重物体的电信号,并实时显示重量,单片机的资源已经能满足设计的需求,而FPGA的高速处理的优势在这里却得不到充分体现,因此本设计的控制方案模块选用基于单片机控制方案。

我们选择技术成熟,性价比高的C8051F120单片机作为主控制器,因本系统需要对交流信号进行A/D采样,而C8051F120单片机内部集成多路通道ADC,完全满足设计需要,并且减去了外围电路的设计,降低单片机的负载,同时其内部系统时钟频率为22MHz,执行一个单周期指令所需时间为仅40ns,完全满足系统软件编写需求。

2.2信号放大设备的选择本系统采用单片机C8051F120作为主控芯片,通过查询其数据手册和实际检测,我们得到单片机在A/D 采样时的采样范围在0-3.3V ,而传感器输出的电压值都非常小,在毫伏级甚至微伏级左右,不能满足单片机的采样条件,需要外部放大电路来获得足够的增益。

综合考虑采用仪表放大器AD620对电压、电流信号进行衰减处理,由理论公式计算电压放大倍数:()01221X R v v v R ⎧⎫⎪⎪=+-⎨⎬⎪⎪⎩⎭,通过选择不同的阻值就可以得到不同的放大或衰减倍数。

2.3显示设备的选择本模块的主要功能是能实时显示描述系统状态的各种信息以及记录各阶段运行的状态。

LCD 不仅显示信息量大,画面效果好,节省I/O 口,且能够显示物体重量、单价、总额等相关文字说明,所以系统的显示部分选择彩色液晶屏TFT128显示。

3系统设计与实现经过仔细分析与论证,选用系统各模块的最终方案如下:(1)主控制器模块:采用单片机C8051F120控制,符合工作条件。

(2)信号放大模块:采用AD620放大电路。

(5)终端显示模块:采用TFT128彩色液晶屏显示。

(6)键盘输入模块:采用4×4矩阵键盘。

3.1单元电路设计 3.1.1 信号放大电路仪表放大电路时有三个放大器组成的,其中的电阻R 和Rx 需要在放大器的电阻适用范围(1K~10K )即由固定的电阻R ,我们可以同Rx 来调整放大的增益值,其关系为:()01221X R v v v R ⎧⎫⎪⎪=+-⎨⎬⎪⎪⎩⎭,放大电路原理图如下图2所示:图2 AD620放大电路3.1.2 系统电源电路本系统需要+5V 为单片机供电,+5V 和-5V 双电源为运放供电,但系统对电源的电流没有太大的要求,因此我们采用普通的小功率变压器经过整流,滤波,稳压后,得到±5V 和±12V 电压。

系统的电源电路图如图3所示。

图3 系统电源电路3.2系统软件设计 3.2.1系统分析电阻应变式称重传感器桥式测量电路如图4所示:图4 桥式测量电路R1、R2、R3、R4为4个应变片电阻,组成了桥式测量电路,Rm 为温度补偿电阻,e 为激励电压,V 为输出电压。

若不考虑Rm ,在应变片电阻变化以前,电桥的输出电压为:V=e R R R R R R ⎪⎭⎫ ⎝⎛+-+434211由于桥臂的起始电阻全等,即R1 = R2 = R3 = R4 = R ,所以V=0 。

当应变片的电阻R1、R2、R3、R4变成R+△R1、R+△R2、R+△R3、R+△R4时,电桥的输出电压变为:V=e R R R R R R R R R R R R ⎪⎭⎫⎝⎛∆++∆+∆+-∆++∆+∆+434211通过化简,上式则变为:V=4e ⎪⎭⎫⎝⎛∆-∆+∆-∆R R R R R R RR 4321 也就是说,电桥输出电压的变化与各臂电阻变化率的代数和成正比。

如果四个桥臂应变片的灵敏系数相同,且RR∆ = K ε,则上式又可写成:V=(4eK ε1 - ε2 + ε3 - ε4 )式中K 为应变片灵敏系数,ε为应变量。

上式表明,电桥的输出电压和四个轿臂的应变片所感受的应变量的代数和成正比。

在电阻应变式称重传感器中,4个应变片分别贴在弹性梁的4个敏感部位,传感器受力作用后发生变形。

在力的作用下,R1、R3被拉伸,阻值增大,△R1、△R3正值,R2、R4被压缩,阻值减小,△R2、△R4为负值。

再加之应变片阻值变化的绝对值相同,即△R1 = △R3 = + △R 或ε1 = ε3 = +ε △R2 = △R4= - △R 或ε2 = ε4 = - ε因此,V=4eK×4ε = e K ε。

若考虑 Rm ,则电桥的输出电压变成:V=e Rm R R R R R R R R ⎪⎭⎫⎝⎛+⎪⎭⎫ ⎝⎛∆--∆+222= e R R Rm R R ∆+2 = Rm R R 2+ K εe 令S U =eV,则S U =Rm R R 2+ K εS U 称为传感器系数或传感器输出灵敏度。

3.2.2软件设计部分主程序主要完成对一些变量和控件的初始化,其流程如图5所示:单片机判断按键的触发,进行处理和实时显示当前的数据信息。

图5 主程序流程图图6 采样子程序流程图4系统测试与分析4.1测试仪器本次测试使用的仪器设备如表3所示4.2测试过程4.3测试分析在物体称重测试,分为放置物体和不放置物体,由于放大电路的基准电压没有调整为绝对的零,使显示出现误差,同时由于物体过重,传感器发生形变,在没有放置物体时,系统无法返回至零点。

在掉电存储设置测试,测试误差率为0%。

5总结本系统以单片机C8051F120芯片为核心部件,利用检测技术,配合软件算法成功地实现了本题的基本要求和发挥部分所有功能。

系统设计难点在于如何将称重传感器的信号进行放大和基准电压的校零。

本多功能数字电子秤系统设计的创新之处在于采用主控芯片的高精度A/D采样模块,使测量物体重量更为精确,降低了系统的误差。

此次设计的不足之处在于信号放大时,没有很好的将称重传感器的干扰噪声进行消除,在后期的完善中,还有待提高这方面的能力。

6参考文献1.房小翠. 单片微型计算机与机电接口技术, 北京:国防工业出版社,2004年.2. 许自图. 电子电路原理分析与仿真,北京:电子工业出版社,2006年. 3.赵亮,侯国锐. 单片机C语言编程与实例, 北京:人民邮电出版社,2004年.4. 康华光. 电子技术基础模拟部分(第五版),北京:高等教育出版社,2006年.5. 康华光. 电子技术基础数字部分(第五版),北京:高等教育出版社,2006年.6.黄智伟,王彦. 全国大学生电子设计竞赛训练教程, 北京:电子工业出版社,2005年.7. 谢自美. 电子线路设计·实验·测试,武汉:华中科技大学出版社,2005年.7附录部分程序清单#include "Includes.h"/**********************全局变量定义*************************///***************日期和时间变量定义***************//struct DateAndTime //定义日期和时间共用体并为其赋初值{U8 Year ;U8 Month ;U8 Day ;U8 Hour ;U8 Minute ;U8 Second ;U8 Date[6];U8 Time[6];}CurrentDateAndTime = {0x10, 0x07, 0x25, 0x09, 0x30, 0x00};//************************************************//FP32 Object_Weigh = 0; //物体重量FP32 Object_Price = 0; //物体价格FP32 Object_Sum = 0; //物体总额U8 Key_Value = 16; //获取键盘按下的值/******************定义价格数组,存储16种商品的价格*************/ FP32 StorePrice[16] = {4, //--青椒--6, //--苹果--3.5, //--西红柿--3, //--黄瓜--4.5, //--香蕉--2.5, //--青菜--6, //--鱼--20, //--猪肉--1.5, //--土豆--1, //--西瓜--2.4, //--香瓜3, //--杏子--3.5, //--桃子--1.2, //--萝卜--6.5, //--草莓--14.6 //--牛肉--};/***************************************************************/ U8 pFlag = 0; //小数点标志FP32 TempWeigh = 0; //定义临时物体重量变量FP32 TempSum = 0; //定义临时商品总金额变量bit DispFlag = 1; //定义显示变量标志/**********************枚举,将键值用名称来代替,结果更形象*********************/enum spectrum {Set = 10, Price = 11, Point = 12, Del =13, Back = 14, Sure = 15, Nopress = 16};enum spectrum Key_Value;/******************************************************************** ***********/long xdata result=0; //定义变量用来获取AD采样后的寄存器值//************************************************///***********************************************************//***********************************************************函数名称:main函数功能:C8051F120单片机采用自身12位AD采样对称重传感器输出信号进行采样,并送给小彩屏进行显示,该函数为多功能电子称主函数入口参数:无出口参数:无备注:***********************************************************/void main(){U16 i = 0;U8 j = 0; //循环体控制变量FP32 Temp = 0; //定义临时变量,用来获取采样的电压System_Init(); //C8051F120单片机初始化Timer_Init(); //定时器初始化Reset(); //TFT128复位LCD_Init(); //TFT液晶初始化ADC_Init(); //ADC初始化AD0BUSY = 1; //AD忙字置位Clear_Screen(); //清屏System_Delay(200); //延时2秒钟,以便系统初始化while (1){ADC_ConvStart(0x00); //开启ADC0的AIN0.0Temp = result * 3.09 /2048 -0.152 ;// DisplayfNum(40,96,Temp,1);Object_Weigh = Temp * 6.4694; //将电压值转换成重量KeyScan(); //调用键盘扫描程序//************************输入单价**************************//if ((Key_Value < 10)&&(pFlag == 0)) //整数部分{Object_Price = Object_Price * 10 + Key_Value;Key_Value = 16;}elseif ((Key_Value < 10)&&(pFlag == 1)) //有一位小数{Object_Price = Object_Price + Key_Value * 0.1;Key_Value = 16;pFlag = 2;}elseif ((Key_Value < 10)&&(pFlag == 2)) //有两位小数{Object_Price = Object_Price + Key_Value * 0.01;Key_Value = 16;pFlag = 3;}elseif ((Key_Value < 10)&&(pFlag == 3)) //有三位小数{Object_Price = Object_Price + Key_Value * 0.001;Key_Value = 16;pFlag = 0;}Object_Sum = Object_Weigh * Object_Price;//**********************************************************//switch (Key_Value){case Point : Key_Value = Nopress;pFlag = 1;break; //判断有无小数点按下case Del : Key_Value = Nopress; //清除键按下,清除当前的价格和金额DisplayfNum(40,64,Object_Price,0);DisplayfNum(40,80,Object_Sum,0);Object_Price = 0;Object_Sum = 0;System_Delay(20); DisplayfNum(40,64,Object_Price,1);DisplayfNum(40,80,Object_Sum,1);break;case Set : Key_Value = Nopress;Clear_Screen();Set_Display();break;//按下设置键,进入设置界面case Price : Key_Value = Nopress;Clear_Screen();PriceList_Display();break; //按下单价表键,进入单价查询表case Sure : Key_Value = Nopress;DispFlag = !DispFlag ; //按下确定键,锁住当前的物体重量TempWeigh = Object_Weigh;TempSum = Object_Sum;break;default:System_Display(); //系统主界面,一直显示}}}/***********************************************************函数名称:System_Display函数功能: 多功能电子称的主显示界面,主要显示日期和时间,物品的重量、单价、金额等信息入口参数:无出口参数:无备注:***********************************************************/void System_Display(void){LCD_Display(14,0,"多功能电子称",RGB(0,63,0),RGB(0,0,31),0);//*********************显示日期和时间**********************// LCD_EN_Disp(14,16,DS1302_ReadData(Read_Year)/10+0x30,RGB(0,0,31),RG B(31,0,0),0);LCD_EN_Disp(22,16,DS1302_ReadData(Read_Year)%10+0x30,RGB(0,0,31),R GB(31,0,0),0);LCD_Display(30,16,"年",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(46,16,DS1302_ReadData(Read_Month)/10+0x30,RGB(0,0,31), RGB(31,0,0),0);LCD_EN_Disp(54,16,DS1302_ReadData(Read_Month)%10+0x30,RGB(0,0,31), RGB(31,0,0),0);LCD_Display(62,16,"月",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(78,16,DS1302_ReadData(Read_Day)/10+0x30,RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(86,16,DS1302_ReadData(Read_Day)%10+0x30,RGB(0,0,31),R GB(31,0,0),0);LCD_Display(94,16,"日",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(32,32,DS1302_ReadData(Read_Hour)/10+0x30,RGB(0,0,31),R GB(31,0,0),0);LCD_EN_Disp(40,32,DS1302_ReadData(Read_Hour)%10+0x30,RGB(0,0,31),R GB(31,0,0),0);LCD_EN_Disp(48,32,':',RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(56,32,DS1302_ReadData(Read_Minute)/10+0x30,RGB(0,0,31), RGB(31,0,0),0);LCD_EN_Disp(64,32,DS1302_ReadData(Read_Minute)%10+0x30,RGB(0,0,31) ,RGB(31,0,0),0);LCD_EN_Disp(72,32,':',RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(80,32,DS1302_ReadData(Read_Second)/10+0x30,RGB(0,0,31), RGB(31,0,0),0);LCD_EN_Disp(88,32,DS1302_ReadData(Read_Second)%10+0x30,RGB(0,0,31) ,RGB(31,0,0),0);//*********************************************************////*********************显示物体信息************************//LCD_Display(0,48,"重量",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(32,48,':',RGB(0,0,31),RGB(31,0,0),0);if (DispFlag == 0){DisplayfNum(40,48,TempWeigh,1);}elseDisplayfNum(40,48,Object_Weigh,1);LCD_Display(88,48,"公斤",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,64,"单价",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(32,64,':',RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(40,64,Object_Price,1);LCD_Display(96,64,"元",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,80,"总额",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(32,80,':',RGB(0,0,31),RGB(31,0,0),0);if (DispFlag == 0){DisplayfNum(40,80,TempSum,1);}elseDisplayfNum(40,80,Object_Sum,1);LCD_Display(96,80,"元",RGB(0,0,31),RGB(31,0,0),0);//*********************************************************//LCD_Display(0,112,"设置",RGB(0,63,0),RGB(0,0,31),0);LCD_Display(80,112,"单价表",RGB(0,63,0),RGB(0,0,31),0);}/***********************************************************函数名称:Clear_Screen函数功能: TFT128的刷屏函数,通过对TFT128屏幕刷屏来清除屏幕入口参数:无出口参数:无备注:***********************************************************/void Clear_Screen(void){U16 i = 0;//循环体控制变量for (i=0;i<32768;i++)write_data16(0xf800);}/***********************************************************函数名称:PriceList_Display函数功能: 物品价格预存列表,分页预存了16中商品价格入口参数:无出口参数:无备注:***********************************************************/void PriceList_Display(void){U16 i = 0;//循环体控制变量U8 Page = 1; //定义页码变量,初始页码为1U8 TempNum = 0; //定义临时变量LCD_Display(14,0,"多功能电子称",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(40,16,"单价表",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,32,"种类",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(64,32,"单价(元)",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(0,112,"选择",RGB(0,63,0),RGB(0,0,31),0);LCD_Display(96,112,"返回",RGB(0,63,0),RGB(0,0,31),0);while (1){KeyScan();if ((Key_Value >= 1)&&(Key_Value <= 4)) //选择键,1~4用来选择物品的种类{TempNum = Key_Value - 1;Key_Value = Nopress; //选中物品种类后,该种类的名称会闪烁3次for (i=0;i<3;i++){Choosed_Object_Kinds(Page, TempNum+1,Choosed);System_Delay(50);Choosed_Object_Kinds(Page, TempNum+1,Show);System_Delay(50);}Object_Price = StorePrice[(Page-1)*4 + TempNum]; //将选中物品的价格送给单价}if (Key_Value == Set) //按下设置选择键,进行翻页显示菜价{Clear_Current_Page(Page); //销毁清除当前页Page++; //页码自加一达到翻页的效果if (Page == 5)Page = 1; //最后一页翻完后又回到第一页Key_Value = Nopress; //释放按键}Disp_Current_Page(Page); //显示当前页/********************显示最大页码和当前页码*******************/LCD_EN_Disp(52,112,Page+0x30,RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(60,112,'/',RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(68,112,Max_Page+0x30,RGB(0,0,31),RGB(31,0,0),0);/*************************************************************/if (Key_Value == Back) //按下返回键,回到初始界面{Key_Value = Nopress;Clear_Screen();break;}}}/***********************************************************函数名称:PriceList_Display函数功能: 物品价格预存列表,分页预存了16中商品价格入口参数:无出口参数:无备注:***********************************************************/void Price_Set_Display(void){U16 i = 0;//循环体控制变量U8 Page = 1;U8 TempNum = 0;LCD_Display(14,0,"多功能电子称",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(40,16,"单价表",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,32,"种类",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(64,32,"单价(元)",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(0,112,"修改",RGB(0,63,0),RGB(0,0,31),0);LCD_Display(96,112,"返回",RGB(0,63,0),RGB(0,0,31),0);while (1){KeyScan();if ((Key_Value >= 1)&&(Key_Value <= 4)) //按下键1~键4中的任意一键选择相应的物品{TempNum = Key_Value - 1; //当前的键值减一,用来和价格数组进行匹配运算Key_Value = Nopress; //释放按键for (i=0;i<3;i++) //循环三次闪烁显示表示被选中{Choosed_Object_Kinds(Page, TempNum+1,Choosed); //背景色加深,表示被选中System_Delay(50);Choosed_Object_Kinds(Page, TempNum+1,Show); //正常显示System_Delay(50);}Object_Price = StorePrice[(Page-1)*4 + TempNum];//将当前的物品种类和它的价格进行匹配并传递给物品的价格变量}if (Key_Value == Set) //按下设置选择键,进行翻页显示菜价{Clear_Current_Page(Page); //销毁清除当前页Page++;if (Page == 5)Page = 1; //最后一页翻完后又回到第一页Key_Value = Nopress; //释放按键}Disp_Current_Page(Page); //显示当前页/*******************显示当前页码和最大页码***********************/LCD_EN_Disp(52,112,Page+0x30,RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(60,112,'/',RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(68,112,Max_Page+0x30,RGB(0,0,31),RGB(31,0,0),0);/****************************************************************/ if (Key_Value == Back) //按下返回键,返回到系统主界面{Key_Value = Nopress;Clear_Screen();//释放按键并刷新屏幕break;}}}/***********************************************************函数名称:Disp_Current_Page函数功能: 显示当前物品价格预存列表入口参数:当前的显示页码Disp_Page出口参数:无备注:***********************************************************/void Disp_Current_Page(U8 Disp_Page){switch (Disp_Page) //选择页码{case 1:PageOne(Show);break;case 2:PageTwo(Show);break;case 3:PageThree(Show);break;case 4:PageFour(Show);break;}}/*********************************************************** 函数名称:Clear_Current_Page函数功能: 擦除当前物品价格预存列表,利用前景色与背景色相同来达到擦除当前的列表的效果入口参数:当前的显示页码Disp_Page出口参数:无备注:***********************************************************/ void Clear_Current_Page(U8 Disp_Page){switch (Disp_Page) //选择页码{case 1:PageOne(Clear);break;case 2:PageTwo(Clear);break;case 3:PageThree(Clear);break;case 4:PageFour(Clear);break;}}/*********************************************************** 函数名称:Choosed_Object_Kinds函数功能: 选择物品种类的处理函数入口参数:页码Disp_Page,种类数Kind,颜色标志ColFlag出口参数:无备注:Disp_Page变化范围为1-4kind 变化范围为1-4ColFlag 变化范围为show(即1),Choosed(即2)Show表示正常显示Choosed表示被选中***********************************************************/void Choosed_Object_Kinds(U8 Disp_Page, U8 Kind ,U8 ColFlag){if (ColFlag == Show) //正常显示{if (Disp_Page == 1) //显示第一页{switch (Kind) //选择物品种类{case 1:LCD_Display(0,48,"1 青椒",RGB(0,0,31),RGB(31,0,0),0);break;case 2:LCD_Display(0,64,"2 苹果",RGB(0,0,31),RGB(31,0,0),0);break;case 3:LCD_Display(0,80,"3 西红柿",RGB(0,0,31),RGB(31,0,0),0);break;case 4:LCD_Display(0,96,"4 黄瓜",RGB(0,0,31),RGB(31,0,0),0);break;}}elseif (Disp_Page == 2) //显示第二页{switch (Kind) //选择物品种类{case 1:LCD_Display(0,48,"1 香蕉",RGB(0,0,31),RGB(31,0,0),0);break;case 2:LCD_Display(0,64,"2 青菜",RGB(0,0,31),RGB(31,0,0),0);break;case 3:LCD_Display(0,80,"3 鱼",RGB(0,0,31),RGB(31,0,0),0);break;case 4:LCD_Display(0,96,"4 猪肉",RGB(0,0,31),RGB(31,0,0),0);break;}}elseif (Disp_Page == 3) //显示第三页{switch (Kind) //选择物品种类{case 1:LCD_Display(0,48,"1 土豆",RGB(0,0,31),RGB(31,0,0),0);break;case 2:LCD_Display(0,64,"2 西瓜",RGB(0,0,31),RGB(31,0,0),0);break;",RGB(0,0,31),RGB(31,0,0),0);break;case 4:LCD_Display(0,96,"4 杏子",RGB(0,0,31),RGB(31,0,0),0);break;}}elseif (Disp_Page == 4) //显示第四页{switch (Kind) //选择物品种类{case 1:LCD_Display(0,48,"1 桃子",RGB(0,0,31),RGB(31,0,0),0);break;case 2:LCD_Display(0,64,"2 萝卜",RGB(0,0,31),RGB(31,0,0),0);break;case 3:LCD_Display(0,80,"3 草莓",RGB(0,0,31),RGB(31,0,0),0);break;case 4:LCD_Display(0,96,"4 牛肉",RGB(0,0,31),RGB(31,0,0),0);break;}}}elseif (ColFlag == Choosed) //物品种类被选中{if (Disp_Page == 1) //显示第一页{switch (Kind) //选择物品种类{case 1:LCD_Display(0,48,"1 青椒",RGB(0,63,0),RGB(0,0,31),0);break;case 2:LCD_Display(0,64,"2 苹果",RGB(0,63,0),RGB(0,0,31),0);break;case 3:LCD_Display(0,80,"3 西红柿",RGB(0,63,0),RGB(0,0,31),0);break;case 4:LCD_Display(0,96,"4 黄瓜",RGB(0,63,0),RGB(0,0,31),0);break;}}elseif (Disp_Page == 2) //显示第二页{switch (Kind) //选择物品种类{",RGB(0,63,0),RGB(0,0,31),0);break;case 2:LCD_Display(0,64,"2 青菜",RGB(0,63,0),RGB(0,0,31),0);break;case 3:LCD_Display(0,80,"3 鱼",RGB(0,63,0),RGB(0,0,31),0);break;case 4:LCD_Display(0,96,"4 猪肉",RGB(0,63,0),RGB(0,0,31),0);break;}}elseif (Disp_Page == 3) //显示第三页{switch (Kind) //选择物品种类{case 1:LCD_Display(0,48,"1 土豆",RGB(0,63,0),RGB(0,0,31),0);break;case 2:LCD_Display(0,64,"2 西瓜",RGB(0,63,0),RGB(0,0,31),0);break;case 3:LCD_Display(0,80,"3 香瓜",RGB(0,63,0),RGB(0,0,31),0);break;case 4:LCD_Display(0,96,"4 杏子",RGB(0,63,0),RGB(0,0,31),0);break;}}elseif (Disp_Page == 4) //显示第四页{switch (Kind) //选择物品种类{case 1:LCD_Display(0,48,"1 桃子",RGB(0,63,0),RGB(0,0,31),0);break;case 2:LCD_Display(0,64,"2 萝卜",RGB(0,63,0),RGB(0,0,31),0);break;case 3:LCD_Display(0,80,"3 草莓",RGB(0,63,0),RGB(0,0,31),0);break;case 4:LCD_Display(0,96,"4 牛肉",RGB(0,63,0),RGB(0,0,31),0);break;}}}}/***********************************************************函数名称:PageOne函数功能: 物品价格预存列表的第一页入口参数:颜色标志ColFlag出口参数:无备注:ColFlag为1时正常显示,ColFlag为0时利用前景色和背景色相同来达到擦除的效果***********************************************************/ void PageOne(bit ColFlag){if (ColFlag){LCD_Display(0,48,"1 青椒",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,48,StorePrice[0],1);LCD_Display(0,64,"2 苹果",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[1],1);LCD_Display(0,80,"3 西红柿",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[2],1);LCD_Display(0,96,"4 黄瓜",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,96,StorePrice[3],1);}else{LCD_Display(0,48,"1 青椒",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,48,StorePrice[0],0);LCD_Display(0,64,"2 苹果",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[1],0);LCD_Display(0,80,"3 西红柿",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[2],0);LCD_Display(0,96,"4 黄瓜",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,96,StorePrice[3],0);}}/*********************************************************** 函数名称:PageTwo函数功能: 物品价格预存列表的第二页入口参数:颜色标志ColFlag出口参数:无备注:ColFlag为1时正常显示,ColFlag为0时利用前景色和背景色相同来达到擦除的效果***********************************************************/ void PageTwo(bit ColFlag){if (ColFlag){LCD_Display(0,48,"1 香蕉",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,48,StorePrice[4],1);LCD_Display(0,64,"2 青菜",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[5],1);LCD_Display(0,80,"3 鱼",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[6],1);LCD_Display(0,96,"4 猪肉",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,96,StorePrice[7],1);}else{LCD_Display(0,48,"1 香蕉",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,48,StorePrice[4],0);LCD_Display(0,64,"2 青菜",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[5],0);LCD_Display(0,80,"3 鱼",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[6],0);LCD_Display(0,96,"4 猪肉",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,96,StorePrice[7],0);}}/*********************************************************** 函数名称:PageThree函数功能: 物品价格预存列表的第三页入口参数:无出口参数:颜色标志ColFlag备注:ColFlag为1时正常显示,ColFlag为0时利用前景色和背景色相同来达到擦除的效果***********************************************************/ void PageThree(bit ColFlag){if (ColFlag){DisplayfNum(72,48,StorePrice[8],1);LCD_Display(0,64,"2 西瓜",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[9],1);LCD_Display(0,80,"3 香瓜",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[10],1);LCD_Display(0,96,"4 杏子",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,96,StorePrice[11],1);}else{LCD_Display(0,48,"1 土豆",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,48,StorePrice[8],0);LCD_Display(0,64,"2 西瓜",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[9],0);LCD_Display(0,80,"3 香瓜",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[10],0);LCD_Display(0,96,"4 杏子",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,96,StorePrice[11],0);}}/*********************************************************** 函数名称:PageFour函数功能: 物品价格预存列表的第四页入口参数:颜色标志ColFlag出口参数:无备注:ColFlag为1时正常显示,ColFlag为0时利用前景色和背景色相同来达到擦除的效果***********************************************************/ void PageFour(bit ColFlag){if (ColFlag){LCD_Display(0,48,"1 桃子",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,48,StorePrice[12],1);LCD_Display(0,64,"2 萝卜",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[13],1);LCD_Display(0,80,"3 草莓",RGB(0,0,31),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[14],1);DisplayfNum(72,96,StorePrice[15],1);}else{LCD_Display(0,48,"1 桃子",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,48,StorePrice[12],0);LCD_Display(0,64,"2 萝卜",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,64,StorePrice[13],0);LCD_Display(0,80,"3 草莓",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,80,StorePrice[14],0);LCD_Display(0,96,"4 牛肉",RGB(31,0,0),RGB(31,0,0),0);DisplayfNum(72,96,StorePrice[15],0);}}/***********************************************************函数名称:Set_Display函数功能: 系统功能设置界面,主要用来选择设置项,有时间设置、价格设置,以及恢复初始值入口参数:无出口参数:无备注:***********************************************************/void Set_Display(void){U16 i = 0;//循环体控制变量while (1){LCD_Display(14,0,"多功能电子称",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(32,16,"功能设置",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,32,"1.时间设置",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,48,"2.单价设置",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,112,"选择",RGB(0,63,0),RGB(0,0,31),0);LCD_Display(96,112,"返回",RGB(0,63,0),RGB(0,0,31),0);KeyScan();if (Key_Value == 1) //按下1键,选中了时间设置项,进入时钟设置界面{Key_Value = Nopress; //释放按键/***********************读取当前的时间******************/CurrentDateAndTime.Date[0] = DS1302_ReadData(Read_Year)/10;CurrentDateAndTime.Date[1] = DS1302_ReadData(Read_Year)%10;CurrentDateAndTime.Date[2] = DS1302_ReadData(Read_Month)/10;CurrentDateAndTime.Date[3] = DS1302_ReadData(Read_Month)%10;CurrentDateAndTime.Date[4] = DS1302_ReadData(Read_Day)/10;CurrentDateAndTime.Date[5] = DS1302_ReadData(Read_Day)%10;CurrentDateAndTime.Time[0] = DS1302_ReadData(Read_Hour)/10;CurrentDateAndTime.Time[1] = DS1302_ReadData(Read_Hour)%10;CurrentDateAndTime.Time[2] = DS1302_ReadData(Read_Minute)/10;CurrentDateAndTime.Time[3] = DS1302_ReadData(Read_Minute)%10;CurrentDateAndTime.Time[4] = DS1302_ReadData(Read_Second)/10;CurrentDateAndTime.Time[5] = DS1302_ReadData(Read_Second)%10;/*******************************************************/System_Delay(200); //延时2秒钟,以便正确读取当前时间Clear_Screen(); //擦除屏幕Time_Set_Display(); //进入时间设置界面}if (Key_Value == 2) //按下1键,选中了时间设置项,进入时钟设置界面{Key_Value = Nopress;Clear_Screen(); //擦除屏幕Price_Set_Display();//进入价格设置界面}if (Key_Value == Set) //按下选择设置键,恢复时钟初始值{Key_Value = Nopress;//释放按键DS1302_Init(); //初始化DS1302,恢复为最初时间ADC_Init(); //对ADC进行初始化System_Delay(100); //延时1秒,保证DS1302正确初始化Clear_Screen(); //擦除屏幕break;}if (Key_Value == Back) //按下返回键,返回到功能设置界面{Key_Value = Nopress;//释放按键Clear_Screen(); //擦除屏幕break;}}}/***********************************************************函数名称:Time_Set_Display函数功能: 时间设置显示界面,完成对日期和时间的设置入口参数:无出口参数:无备注:***********************************************************/void Time_Set_Display(void){U16 i = 0;//循环体控制变量LCD_Display(14,0,"多功能电子称",RGB(0,63,0),RGB(31,0,0),0);LCD_Display(32,16,"时间设置",RGB(0,0,31),RGB(31,0,0),0);LCD_Display(0,112,"选择",RGB(0,63,0),RGB(0,0,31),0);LCD_Display(96,112,"返回",RGB(0,63,0),RGB(0,0,31),0);while (1){ //*********************显示日期和时间**********************// LCD_EN_Disp(14,32,CurrentDateAndTime.Date[0]+0x30,RGB(0,0,31),RGB(31 ,0,0),0);LCD_EN_Disp(22,32,CurrentDateAndTime.Date[1]+0x30,RGB(0,0,31),RGB(31 ,0,0),0);LCD_Display(30,32,"年",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(46,32,CurrentDateAndTime.Date[2]+0x30,RGB(0,0,31),RGB(31 ,0,0),0);LCD_EN_Disp(54,32,CurrentDateAndTime.Date[3]+0x30,RGB(0,0,31),RGB(31 ,0,0),0);LCD_Display(62,32,"月",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(78,32,CurrentDateAndTime.Date[4]+0x30,RGB(0,0,31),RGB(31 ,0,0),0);LCD_EN_Disp(86,32,CurrentDateAndTime.Date[5]+0x30,RGB(0,0,31),RGB(31 ,0,0),0);LCD_Display(94,32,"日",RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(32,48,CurrentDateAndTime.Time[0]+0x30,RGB(0,0,31),RGB(3 1,0,0),0);LCD_EN_Disp(40,48,CurrentDateAndTime.Time[1]+0x30,RGB(0,0,31),RGB(3 1,0,0),0);LCD_EN_Disp(48,48,':',RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(56,48,CurrentDateAndTime.Time[2]+0x30,RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(64,48,CurrentDateAndTime.Time[3]+0x30,RGB(0,0,31),RGB(3 1,0,0),0);LCD_EN_Disp(72,48,':',RGB(0,0,31),RGB(31,0,0),0);LCD_EN_Disp(80,48,CurrentDateAndTime.Time[4]+0x30,RGB(0,0,31),RGB(3 1,0,0),0);LCD_EN_Disp(88,48,CurrentDateAndTime.Time[5]+0x30,RGB(0,0,31),RGB(3 1,0,0),0);KeyScan();if (Key_Value == Back) //按下返回键,保存当前设置的时间信息{Key_Value = Nopress;/**********************保存设置的日期和时间****************************************/CurrentDateAndTime.Year = CurrentDateAndTime.Date[0] * 10 + CurrentDateAndTime.Date[1];CurrentDateAndTime.Month = CurrentDateAndTime.Date[2] * 10 + CurrentDateAndTime.Date[3];CurrentDateAndTime.Day = CurrentDateAndTime.Date[4] * 10 + CurrentDateAndTime.Date[5];CurrentDateAndTime.Hour = CurrentDateAndTime.Time[0] * 10 + CurrentDateAndTime.Time[1];CurrentDateAndTime.Minute = CurrentDateAndTime.Time[2] * 10 + CurrentDateAndTime.Time[3];CurrentDateAndTime.Second = CurrentDateAndTime.Time[4] * 10 + CurrentDateAndTime.Time[5];/***************************************************************** *****************/System_Delay(200);Clear_Screen(); //清屏,擦除上次显示留下的痕迹DS1302_Init(); //初始化DS1302,使时钟运行break;}}}/***********************************************************函数名称:KeyScan函数功能:4X4矩阵键盘扫描程序入口参数:无。

相关文档
最新文档