电子秤应用C语言源程序
- 格式:pdf
- 大小:46.38 KB
- 文档页数:8
基于单片机的电子秤系统设计摘要电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。
它与我们日常生活紧密结合息息相关。
电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。
电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。
本系统的设计主要从硬件电路设计,软件编程调试,实物焊接调试三部分进行详细阐述。
硬件电路主要是基于单片机AT89S52为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子秤专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由LCD1602液晶实现,液晶显示效果稳定无闪烁关键词:AT89S52单片机;电子秤;压力传感器;HX711WIRELESS TEMPERATURE DETECTING SYSTEM DESINGBASED ON MCUABSTRACTWith Intelligent electronic scale is the detection and conversion technology, computer technology, information processing, digital technology, an integrated modern technology of new weighing equipment.Ectronic scale takes SCM as its central controling unit,and achieves AD transform through weighting transducer,then adds keybord,display circuit and powerful softerwear. It is not only accurate,swift,and convenient, but also makes an important effect to people’s life by its automatic weightment and digital display, so it becomes more and more popular.The design of this system gives its eleboration from 3 parts: Hardwear circuit design,softwear programme debugging and entity weld debugging.Hardwear circuit reaches data processing by the controling unit which based on AT89S52,and gathers data by weighting transducer,then makes AD transform by HX711 to the data gathered, and the transformed data then transferred to AT89S52 for display prosessing, at last LCD1602 would show it out steadily without twinklingKey Words: AT89S52 MCU,Electrnoic Scale,Load sensor,HX711.目录摘要 (I)ABSTRACT (II)目录.......................................................................................................................................................................... I II 第1章绪论. (1)1.1课题背景与研究意义 (1)1.2 系统设计要求 (2)1.3系统设计方案 (3)1.4电子秤的主要组成 (5)1.4.1 电子秤的基本结构 (5)1.4.2 电子秤的工作原理 (6)1.4.3 电子秤的计量性能 (7)第2章系统硬件设计 (8)2.1 流系统元器件选型及参数介绍 (8)2.1.1 系统单片机选型 (8)2.1.2 系统传感器选型 (10)2.1.3 系统AD转换芯片选择 (13)2.1.4系统显示器选择 (14)2.1.5系统时钟芯片选择 (16)2.2 系统硬件电路设计 (17)2.2.1系统电源电路设计 (17)2.2.2系统单片机主控电路设计 (18)2.2.3系统显示部分电路设计 (20)2.2.4系统超重报警指示电路设计 (21)2.2.5系统按键输入电路设计 (21)2.3系统硬件电路的绘制与PCB线路板制作 (23)2.3.1 Protell 99 SE软件介绍 (23)2.3.2 系统原理图绘制与PCB印刷线路板制作 (23)第3章系统软件设计 (27)3.1 系统软件编程环境介绍 (27)3.2系统主程序流程图 (27)3.3系统显示部分流程图 (28)3.4系统按键调整部分流程图 (29)第四章系统的制作、安装与调试 (30)4.1电路的绘制与PCB板的制作 (30)4.2 系统的调试 (31)第五章总结与体会 (32)5.1 总结 (32)5.2 体会 (33)参考文献 (34)致谢 (35)第1章绪论1.1课题背景与研究意义电子秤作为一种计量手段,广泛应用于工农业、科研、交通、内外贸易等各个领域,与人民的生活紧密相连。
#include "main.h"#include "LCD1602.h"#include "HX711.h"unsigned long HX711_Buffer = 0;unsigned long Weight_Maopi = 0,Weight_Shiwu = 0;char Price_Count = 0;unsigned char KEY_NUM = 0;unsigned char Price_Buffer[3] = {0x00,0x00,0x00};unsigned long Money = 0;bit Flag_OK = 0;//****************************************************//主函数//****************************************************void main(){Init_LCD1602(); //初始化LCD1602LCD1602_write_com(0x80); //指针设置LCD1602_write_word("Welcome to use! "); //开机画面第一行Delay_ms(2000); //延时2sloop:Price_Count = 0;Price_Buffer[0] = 0;Price_Buffer[1] = 0;Price_Buffer[2] = 0;Flag_OK = 0;LCD1602_write_com(0x80); //指针设置LCD1602_write_word("+WEI |PRI | MON ");LCD1602_write_com(0x80+0x40); //指针设置LCD1602_write_word("0.000| . | . ");Get_Maopi(); //称毛皮重量while(1){if( Flag_OK == 0){Get_Weight(); //称重//显示当前重量LCD1602_write_com(0x80+0x40);LCD1602_write_data(Weight_Shiwu/1000 + 0x30);LCD1602_write_data('.');LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);LCD1602_write_data(Weight_Shiwu%10 + 0x30);}KEY_NUM = KEY_Scan();if( KEY_NUM != 0x55) //当返回的不是初值时候,确认按键按下。
下面介绍主程序编写,其他程序略。
(1) 头文件和一些宏定义#include <>#include <>#include <>#include ""#include ""#include "";;int2str(j,str1);if (j<10){ display_GB2312_string(3,84,"00");display_GB2312_string(3,100,str1);}else if (j<100){ display_GB2312_string(3,84,"0");display_GB2312_string(3,92,str1);}else{ display_GB2312_string(3,84,str1);}};13(确定价格)void KeyPress(uchar keycode){ switch (keycode){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:..");To_Zero();display_GB2312_string(1,1,"电子秤初始化成功"); display_GB2312_string(3,1,"重量: kg");display_GB2312_string(5,1,"单价: 元");display_GB2312_string(7,1,"金额: 元");Display_Price();while(1){ //每秒称重一次if (FlagTest==1){//称重,得到重量值weight,单位为gAdVal=ReadCount();weight=FullScale-AdVal/1000;if (weight>0x8000) weight=0;weight=10000*weight/FullScale;weight=weight*RATIO;//如果超量程,则报警if (weight >= 10000){ beep = 0;alert = 0;display_GB2312_string(3,60,"------");display_GB2312_string(7,44,"--------");}//如果不超量程else{ beep = 1;alert = 1;//显示重量值Display_Weight();//如果单价设定好了,则计算价格if (FlagSetPrice == 1){ money = weight*price/1000; //money单位为分//显示总金额Display_Money();}else{ display_GB2312_string(7,44," ");}//清测试标志FlagTest = 0;}}//获取按键keycode = Getkeyboard();//有效键值0-15if ((keycode<16)&&(FlagKeyPress==0)){ FlagKeyPress = 1;KeyPress(keycode);FlagKeyPress = 0;}delay(20);}}。
一、实训目的本次实训旨在通过实践操作,了解单片机电子秤的工作原理和设计方法,掌握单片机在电子秤中的应用技术,提高动手能力和实际操作能力。
二、实训内容1. 硬件设计(1)硬件选型本次实训所选用的硬件主要包括:51单片机、LCD1602液晶显示屏、按键模块、HX711高精度AD转换芯片、压力传感器、电源模块等。
(2)电路设计根据选用的硬件,设计电子秤的电路原理图,包括单片机电路、显示屏电路、按键电路、传感器电路等。
电路图如下:2. 软件设计(1)程序设计采用C语言进行程序设计,主要包括以下功能模块:1)初始化模块:初始化LCD1602、按键、HX711等模块。
2)数据采集模块:通过HX711芯片读取压力传感器的数据,转换为重量值。
3)显示模块:将重量值显示在LCD1602液晶显示屏上。
4)按键控制模块:根据按键输入,实现计价、去皮、清零等功能。
5)数据处理模块:根据重量值和单价计算总价。
(2)程序流程程序流程如下:1)系统初始化。
2)检测按键状态,判断是否按下。
3)根据按键状态执行相应功能。
4)读取传感器数据,转换为重量值。
5)将重量值显示在LCD1602显示屏上。
6)根据单价计算总价。
7)返回步骤2)。
3. 调试与测试(1)调试在Proteus仿真软件中对程序进行调试,确保程序功能正常运行。
(2)测试将硬件电路连接到实际设备上,进行以下测试:1)重量测试:在电子秤上放置不同重量的物体,观察显示屏显示的重量值是否准确。
2)计价测试:设置不同的单价,观察计价功能是否正常。
3)去皮测试:在电子秤上放置物体,进行去皮操作,观察去皮功能是否正常。
4)清零测试:在电子秤上放置物体,进行清零操作,观察清零功能是否正常。
三、实训总结1. 通过本次实训,掌握了单片机电子秤的硬件设计和软件设计方法。
2. 熟悉了51单片机、LCD1602、按键、HX711等硬件模块的应用。
3. 提高了动手能力和实际操作能力,为以后从事电子技术相关领域的工作打下了基础。
51单片机电子秤程序设计概述本文档介绍了如何使用51单片机(AT89C51)设计一个简单的电子秤程序。
通过该程序,电子秤能够测量物体的重量并实时显示在液晶显示屏上。
硬件准备在开始编写程序之前,我们需要准备以下硬件设备:- AT89C51单片机开发板- 电子秤传感器模块- 16x2液晶显示屏- 连接线程序设计以下是该电子秤的主要程序设计步骤:1. 引入必要的头文件include <reg51.h>include <lcd.h>2. 定义端口和变量sbit DOUT = P3^7; // 电子秤传感器数据接口float weight = 0; // 测量到的重量3. 初始化液晶显示屏void lcd_init(){// 在这里初始化液晶显示屏的相关设置}4. 启动AD转换void start_conversion(){// 在这里启动AD转换,将传感器的模拟数据转换为数字数据}5. 读取AD转换结果float read_conversion(){// 在这里读取AD转换结果并返回}6. 主程序void main(){lcd_init(); // 初始化液晶显示屏while (1){start_conversion(); // 启动AD转换weight = read_conversion(); // 读取AD转换结果// 将重量显示在液晶显示屏上lcd_gotoxy(1, 1); // 设置光标位置lcd_print("Weight: %.2f kg", weight); // 显示重量delay(500); // 延时一段时间,以控制刷新速度}}总结通过以上步骤,我们可以设计一个简单的51单片机电子秤程序。
该程序可以实时获取电子秤传感器的数据,并将测量到的重量显示在液晶显示屏上。
我们可以根据实际需求进行进一步的功能扩展和优化。
请注意,本文档仅提供了程序设计的概述,并未包含具体的代码实现。
多功能数字电子计价秤(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的高速处理的优势在这里却得不到充分体现,因此本设计的控制方案模块选用基于单片机控制方案。
湖南理工学院课程设计报告课程名称:专业综合课程设计专业班级:学生姓名:指导教师:完成时间:报告成绩:目录摘要 (1)第一章绪论 (3)1.1引言: (3)第二章系统方案的设计 (3)2.1 电子秤的设计要求 (3)2.1.1 基本要求 (3)2.1.2 特色与创新 (4)2.2 设计作用与目的: (4)2.3 所用仪器与设备: (4)2.4 设计原理及设计基本思路: (5)2.4.1系统的原理: (5)2.4.2 系统的基本设计思路: (5)2.5 系统总体设计方案选择 (5)2.6单片机的选型:............................... 错误!未定义书签。
2.7输入输出设备指派: (5)2.7.1 键盘输入 (5)2.7.2 输出显示 (6)2.8系统电源 (6)第三章系统硬件设计 (9)3.1 基于AT89S52的主控电路 (9)3.1.1芯片介绍 (9)3.1.2 主控电路 (14)3.2 基于ICL7135的前端信号处理电路 (14)3.2.1 芯片介绍 (14)3.2.2 信号处理电路 (19)3.3 人机交互界面 (21)3.3.1 键盘控制电路 (21)3.3.2 液晶显示电路 (24)3.4 系统电源 (26)3.4.1 芯片介绍 (26)3.4.2 电源电路 (27)3.5 报警电路.................................... 错误!未定义书签。
第四章软件流程 (28)4.1 主程序流程图 (28)4.2 主要中断程序流程图 (29)第五章源程序 (32)第六章程序调试 (44)课程设计心得 (50)参考文献 (51)摘要该设计以51系列单片机AT89S52为控制核心,实现电子秤的基本控制功能。
在设计系统时,为了更好地采用模块化设计法,分步的设计各个单元功能模块,系统的硬件部分可以分为最小系统、数据采集、人机交互界面和系统电源四大部分。
C#实现连接电⼦秤串⼝⾃动称重⼀、界⾯设计⼆、核⼼代码123456789101112131415161718192021222324252627282930313233343536373839404142private SerialPort com;private void FormCheck_Load(object sender, EventArgs e){ //初始化COMListinitCOMList();}#region private void initCOMList(){ ManageCOM com = new ManageCOM(); List<string> s = com.AutoGetCOM();string[] comNames = s.ToArray();comboxCOM.Items.Clear();comboxCOM.Items.Add("请选择COM"); comboxCOM.SelectedIndex = 0; foreach (string portName in comNames) {//添加COM ⼝到界⾯下拉框comboxCOM.Items.Add(portName);}}#endregion private void btnStart_Click(object sender, EventArgs e){getWeightfromCOM();}#region private void getWeightfromCOM(){ int selectIndex= comboxCOM.SelectedIndex; if (selectIndex!=0) {string COM = comboxCOM.Items[selectIndex].ToString();42434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596com = new SerialPort(COM); //实例化SerialPort 并设置COM ⼝com.BaudRate = 9600;//波特率com.Parity = Parity.None;//⽆奇偶校验位com.StopBits = StopBits.Two;//两个停⽌位 com.Handshake = Handshake.RequestToSend;//控制协议 com.ReceivedBytesThreshold = 13;//设置 DataReceived 事件发⽣前内部输⼊缓冲区中的字节数,我这⾥是13字节为⼀组 com.Open(); //打开串⼝com.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived); //接受数据线程 }else { MessageBox.Show("请选择COM"); }}/// <summary>/// 监听串⼝数据线程/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e){Thread.Sleep(500);//线程休眠500毫秒,⽅便接收串⼝的全部数据 try {if (com.IsOpen){byte[] readBuffer = new byte[com.ReadBufferSize + 1];try{ int count = com.Read(readBuffer, 0, com.ReadBufferSize); //读取串⼝数据(监听) String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count);//将字节数组解码为字符串 if (count != 0) { //这⾥强调⼀下,线程⾥不可以直接对UI 进⾏赋值,只能使⽤委托操作控件this.BeginInvoke(new System.Threading.ThreadStart(delegate (){rbResult.Text = SerialIn; })); } }catch (TimeoutException) { }}else{ TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50); Thread.Sleep(waitTime); }}catch (Exception ex){MessageBox.Show(ex.ToString()); }}#endregion到此这篇关于C#实现连接电⼦秤串⼝⾃动称重的⽂章就介绍到这了。
本科毕业论文(设计)题目:基于51单片机数字电子称的设计院系:电子与通信工程学院专业:电子信息科学与技术姓名: ***学号: ***指导教师:张涛教师职称:副教授填写日期: 2013年4月20日摘要随着微电子技术的应用,市场上使用的传统称重工具已经满足不了人们的要求。
为了改变传统称重工具在使用上存在的问题,在本设计中将智能化、自动化、人性化用在了电子称重的控制系统中。
本系统主要由单片机来控制,测量物体重量部分由称重传感器及A/D转换器组成,加上显示单元,此电子秤具备了功能多、性能价格比高、功耗低、系统设计简单、使用方便直观、速度快、测量准确、自动化程度高等特点。
本系统以AT89C51单片机为主控芯片,外围附以称重电路、显示电路、报警电路、键盘电路等构成智能称重系统电路,从而实现自动称重系统的称重功能、报警功能、数据计算功能以及人机交换功能。
可以说,此设计所完成的电子秤很大程度上满足了应用需求。
关键词:AT89C51;MPX4250压力传感器;A/D转换器;LCD显示器AbstractWith the application of microelectronic technology,the tools of traditional weighing on the market have can't satisfy the demands of people. In order to change the problem of the application of traditional weighing tools in the using of daily life, the design will be integrated with intelligence, automation and human nature in the electronic scales with weight control system. This system mainly controlled by the single chip microcomputer , measured by weighting transducer and A/D converter component and added with the display unit, the electronic scales are aptitude for the high ratio of performance, multi-function , low power consumption ,and it is simple enough ,especially it is given the characteristic with Easy-to-use intuitively, Speed, Measure accurately, Higher automation.The system take AT89C51 SCM as the main controller chip, and its peripheral circuit attach to integrated circuit, display circuit, alarm circuit, keyboard circuit which integrate the weighing system circuit board, so the design can realize the automatic weighing system function, alarm function, weighing data calculation function and Man-machine exchange function. We can say that the design of complete electronic scales largely meet the application requirements perfectly.KEYWORDS: AT89C51;MPX4250sensor;A/D converter;LCD Display目录第一章绪论 (6)1.1 研究目的和意义 (6)1.2 电子称重系统的应用领域 (6)1.3 国内外研究现状、发展动态 (6)1.4 主要工作以及论文结构 (7)第二章电子称工作原理及系统方案论证与选择 (9)2.1 电子称的元器件 (9)2.2 称重器的工作原理 (9)2.3 系统总体设计方案比较与论证 (9)2.4控制器部分 (12)2.5数据采集部分 (13)2.5.1 传感器的选择 (13)2.5.2 A/D转换器的选择 (14)2.6 键盘处理部分方案论证 (15)2.7 显示电路部分的选择 (16)2.8报警部分电路选择 (16)第三章电子称具体电路设计 (17)3.1 AT89C51的最小系统电路 (17)3.1.1单片机芯片AT89C51介绍 (17)3.2数据采集部分电路设计 (21)3.3显示电路与AT89C51单片机接口电路设计 (22)3.4键盘电路与AT89C51单片机接口电路设计 (24)3.5报警电路的设计 (25)第四章系统软件设计 (27)4.1 主程序设计 (27)4.2 子程序设计 (28)4.2.1 A/D转换启动及数据读取程序设计 (28)4.2.2显示子程序设计 (29)4.2.3 键盘输入控制程序的设计 (30)4.2.4报警子程序的设计 (31)第五章软件仿真及调试 (32)5.1软件使用 (32)5.1.1 keil软件的简单使用 (32)5.1.2 Protues软件的简单使用 (33)5.2 仿真调试 (34)5.3 使用说明 (36)第六章总结 (37)致谢 (38)参考文献 (39)附录 (40)附录1 系统总图 (40)附录2仿真总图 (41)附录3 程序清单 (42)第一章绪论1.1 研究目的和意义传统的机械秤有很多缺点,比如精度不高,结构复杂,易老化,成本高等。
#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DATA_PORT P2//------------------------------------------- // 12864管脚定义//------------------------------------------- sbit CD=P0^3; //数据(L)/命令(H)选择sbit WRIT=P0^4; //写,低电平有效sbit CE=P0^5; //使能,低电平有效//------------------------------------------- // TLC2543管脚定义//------------------------------------------- sbit CS = P1^2;sbit CLK = P1^3;sbit ADin = P1^1;sbit ADout = P1^0;sbit EOC = P1^4;//------------------------------------------- long total=0; //总价long dat; //TLC2543端口数据uint i=0; //Price中设置的变量uint b[10]; //用于存放Priceuint s=0,y=0; //s用于保存小数点,y判断ENTER键//===========================================// 函数声明//-------------------------------------------void delay(char);void write_data(char);void write_text(char);void write_com(char);void lcd_init_text();void text_out(char a);int asc2lcd(int asc);void cursor_on();void print_text();void text_location();void print_string();void Key_Scan(void);//-------------------------------------------- // 写数据函数//-------------------------------------------- void write_data(char dat){CD=0; //数据CE=0; //LCD使能WRIT=0; //写DATA_PORT=dat; //把数据送到P口delay(1); //当晶振较高时加延时WRIT=1; //关写CE=1; //关使能}//-------------------------------------------- // 写数据函数//-------------------------------------------- void write_text(char text){CD=0; //数据CE=0; //LCD使能WRIT=0; //写DATA_PORT=text; //把数据送到P口delay(1); //当晶振较高时加延时WRIT=1; //关写CE=1; //关使能}//-------------------------------------------- // 写命令函数//-------------------------------------------- void write_com(char com){CD=1; //命令CE=0;WRIT=0;DATA_PORT=com;delay(1); //当晶振较高时加延时WRIT=1;CE=1;}//-------------------------------------------- // LM4229初始化函数//-------------------------------------------- void lcd_init_text(){write_data(0);write_data(0);write_com(0x40); //set text home addresswrite_data(0);write_com(0x41); //set text area;write_com(0x84); //text attribute mode write_com(0x94); //text on graphic off }void cursor_on(){write_com(0xA0);write_com(0x93);write_com(0x94); //text on graphic off }void print_text(char x,char y,char a){int place;place=x*30+y;write_data(place&0xff); //写地址低8位write_data(place/256); //写地址高8位write_com(0x24); //设置地址write_com(0xb0); //设置数据自动写write_com(0xb2); //自动复位}//------------------------------------------- int asc2lcd(int asc){uint r;r=asc-32;return r;}void text_out(char a){write_com(0xb0); //设置数据自动写write_text(a);write_com(0xb2); //自动复位}void text_location(int place){write_data(place&0xff); //写地址低8位write_data(place/256); //写地址高8位write_com(0x24); //设置地址}void print_string(char* str){int i;int ch;for(i=0;str[i]!=0;i++){ch=asc2lcd(str[i]);text_out(ch);}}//-------------------------------------------- // 延时函数//-------------------------------------------- void delay(uchar t){uint p,j;for(p=0;p<t;p++)for(j=0;j<114;j++);}//-------------------------------------------// 4*4矩键查寻键值函数//-------------------------------------------void Key_Scan(void){uchar readkey;uint x=200;uchar x_temp,y_temp;P3=0x0f;x_temp=P3&0x0f;if(x_temp==0x0f) goto keyout;P3=0xf0;y_temp=P3&0xf0;readkey=x_temp|y_temp;readkey=~readkey;switch(readkey){case 0x11:break;case 0x21:break;case 0x41:break;case 0x81:i=0;s=0;total=0;y=1;i=1;b[0]=0;delay(x);break; //CANCEL键;case 0x12:b[i]=3;i++;delay(x);break;case 0x22:b[i]=6;i++;delay(x);break;case 0x42:b[i]=9;i++;delay(x);break;case 0x82:y=1;if(s==0)s=i;break; //确认键case 0x14:b[i]=2;i++;delay(x);break;case 0x24:b[i]=5; i++;delay(x);break;case 0x44:b[i]=8;i++;delay(x);break;case 0x84:b[i]=14;s=i;i++;delay(x);break;//小数点case 0x18:b[i]=1;i++;delay(x);break;case 0x28:b[i]=4;i++;delay(x);break;case 0x48:b[i]=7;i++;delay(x);break;case 0x88:b[i]=0;i++;delay(x);break;default:break;}keyout:_nop_();}//-------------------------------------------// 读TLC2543端口数据函数//------------------------------------------- uint readAD(uchar port){uchar ch,i,j;uint ad;ch=port;for(j=0;j<1;j++){ad=0;ch=port;EOC=1;CS=1;CS=0;CLK=0;for(i=0;i<16;i++){if(ADout) ad|=0x01;ADin=(bit)(ch&0x80); //取到ch的最高位CLK=1;CLK=0;ch<<=1;ad<<=1;}}CS=1; /////////转换和读取数值while(!EOC);ad>>=1;return(ad);}//-------------------------------------------// main函数//-------------------------------------------main(){uint A1,A2,A3,A4; //A1——A4为重量uint B0,B1,B2,B3,B4; //B0——B4为总价uint j;while(1){Key_Scan();dat=readAD(0x0c);A1=(dat*122)/100000; //12位端口最大数4096和5000g 之间有1.22的倍数关系;A2=(dat*122)%100000/10000;A3=(dat*122)%10000/1000;A4=(dat*122)%1000/100;//------------------------------------------- // 显示重量//------------------------------------------- lcd_init_text();text_location(0);print_string("weight: ");text_out(A1+16);text_out(14);text_out(A2+16);text_out(A3+16);text_out(A4+16);print_string("kg");//------------------------------------------- // 显示单价Price//------------------------------------------- text_location(60);print_string("Price:");for(j=0;j<i;j++){if(b[j]==14)text_out(b[j]);elsetext_out(b[j]+16);}if(i==1){for(j=i;j<15;j++){text_out(0xff);}}//------------------------------------------- // 当ENTER键按下后,显示总价//------------------------------------------- if(y==1){if(s==0){if(i>=2)total+=dat*122*b[1]/10;}if(s==1){total+=dat*122*b[0];if(i>=3)total+=dat*122*b[2]/10;}if(s==2){total=total+dat*122*b[0]*10+dat*122*b[1];if(i>=4)total+=dat*122*b[3]/10;}B0=(total)/10000000;B1=(total)%10000000/1000000;B2=(total)%1000000/100000;B3=(total)%100000/10000;B4=(total)%10000/1000;text_location(120);print_string("Total:");text_out(B0+16);text_out(B1+16);text_out(B2+16);text_out(14);text_out(B3+16);text_out(B4+16);y=0;i=0;s=0;total=0;delay(100); }}}。