⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一个基于C51开发的计价秤
💻 C
📖 第 1 页 / 共 4 页
字号:
/*********************************************/
// Model: Retail Scale
// Chip: SST89E516RD2
// Development Tools: Keil C51 7.50
// Version: 1.00
// Note: Copyright (c) 2006 CHAS Electronics Co.
/*********************************************/
// File Name: main.c
// Author: henny
// Date: 2006/3/1
/*********************************************/
#include <SST89x5xxRD2.h>
#include <stdio.h>
#include <stdlib.h>
#include "Public.h"                               
#include "KeyBoard.h"
#include "main.h"

main()
{
	Power_On();
	while(1)
	{
		switch(mode)
		{
		case Input_code_mode:Input_Code();break;
		case Calibration_mode:Calibration();break;
		case Initialization_mode:Initialization();break;
		case Sales_mode:Sales();break;
		case Total_mode:Total();break;
		case Payback_mode:Payback();break;
		case PLU_Setup_mode:PLU_Setup();break;
		case Time_Setup_mode:Time_Setup();break;
		case Beep_and_Light_Setup_mode:Beep_and_Light_Setup();break;
		case Calculator_mode:Calculator();break;
		case Reports_mode:Reports();break;
		case Download_mode:Download();break;
		case Print_Cancel_mode:Print_Cancel();break;
		case Power_down_mode:Power_Down();break;
		}
	}
}

/**********************************
********Power On Reset*************
**********************************/
VOID Power_On()
{
	BAT_DECT=1;
	AC_DECT=1;
	P4=0x00;
	P3=0xff;
	P2=0xff;
	P0=0x7f;
	Delay(20);
	if(!P3_2)
		mode=Input_code_mode;
	else
		mode=Initialization_mode;
	timer1_count=0;
	date.year=6;
	date.month=3;
	date.day=1;
	time.hour=12;
	time.min=0;
	time.sec=0;
	icon_buf=0x00;
	PT0=1;
	TMOD=V_TMOD;
	TH0=V_TH0;TL0=V_TL0;
	TH1=V_TH1;TL1=V_TL1;
	TR0=1;ET0=1;TR1=1;ET1=1;EA=1;
	if(!Key_Short_Test())
	{
		Beep_on=TRUE;
		while(1)
		{
			Beep();
			Wait_n_s(2);
		}
	}
	RS232_Init();
	CS5532_Init();
	LCD_Init(LCD_MODE,LCD_GLITTER);
	keyprocess=FALSE;keydone=TRUE;
	Beep_on=TRUE;colon=FALSE;Cal_flag=FALSE;	
}

/**********************************
********Power Down mode***********
**********************************/
VOID Power_Down()
{
	P4=0xff;
	LIGHT=TRUE;
	Cls_Icon_Buf();
	while(mode==Power_down_mode)
	{
		if(keyprocess)
		{
			keydone=FALSE;
			keyprocess=FALSE;
			if(keypre[0]==K_ON_OFF)
			{
				Beep();
				P4=0x00;
				Delay(20);	
				RS232_Init();
				CS5532_Init();
				LCD_Init(LCD_MODE,LCD_GLITTER);
				if(Light_on)
					LIGHT=FALSE;
				else
					LIGHT=TRUE;
				Set_Logo_Display();
				Set_SCALE_Display();
				Set_Ver_no_Display(Soft_ver_no);
				Display();
				Wait_n_ms(50);
				while(!Zero_Setting_When_Power_Up())
				{
					Set_INIT0_On_Lcd1_Display();
					Display();	
				}	
				unit_price_entered=FALSE;
				mode=Sales_mode;
				Sold_Quantity=0;
				Sum_Price=0;
			}
			keydone=TRUE;
		}
		PCON|=0x01;
	}	
}

/**********************************
*********Input Code mode***********
**********************************/
VOID Input_Code()
{
	INT8 data i;
	static input_count=0;
	BYTE Option_Table[TABLE_LEN];
	Beep_on=TRUE;
	if(Read_extern_eeprom(Option_Table))
	{
		if(Option_Table[EEPROM_ID]==0xa5&&Option_Table[EEPROM_ID+1]==0x5a)
		{
			if(Save_Option_Table(Option_Table))
			{
				Set_COPY_SUCCESS_Display();
				Display();
				Wait_n_s(2);	
			}
		}	
	}
	if(!Read_Cal_Password(Option_Table))
	{
		Set_NOEEP_On_Lcd1_Display();
		Display();
		while(1);	
	}
	Full_Display();
	Wait_n_s(2);
	for(i=9;i>=0;i--)
	{
		Set_Lcd1_Buf(i+'0',0,5);
		Set_Lcd2_Buf(i+'0',0,7);
		Set_Lcd3_Buf(i+'0',0,7);
		Display();
		Wait_n_ms(50);
	}
	Set_INPUT_CODE_Display();
	Display();
	while(!P3_2);
	while(mode==Input_code_mode)
	{
		if(keyprocess)
		{
			keydone=FALSE;
			keyprocess=FALSE;
			numeric=0;
			if(!keypre[1]&&!keypre[2]&&!keypre[3])
			{
				switch(keypre[0])
				{
				case K_ENTER:
					Beep();
					if(Password_Compare(Option_Table,lcd2_buf))
						mode=Calibration_mode;
					else if(input_count>3)
					{
						Cal_flag=FALSE;
						mode=Initialization_mode;
					}	
					else
					{
						Alarm();
						input_count++;
					}
					break;
				case K_CLEAR:
					Beep();
					Set_INPUT_CODE_Display();
					break;			
				case K_00:
					Beep();
					numeric+='0';
					Lcd_Buf_Left_Shift(lcd2_buf,2,numeric,0);
					Lcd_Buf_Left_Shift(lcd2_buf,2,numeric,0);
					break;	
				case K_9:numeric++;
				case K_8:numeric++;
				case K_7:numeric++;
				case K_6:numeric++;
				case K_5:numeric++;
				case K_4:numeric++;
				case K_3:numeric++;
				case K_2:numeric++;
				case K_1:numeric++;
				case K_0:numeric+='0';
					Beep();
					Lcd_Buf_Left_Shift(lcd2_buf,2,numeric,0);
					break;
				}	
			}
			else if(keypre[3])
			{
				Beep();
				Cal_flag=FALSE;
				mode=Initialization_mode;
			}
			keydone=TRUE;
		}
		if(half_sec)
		{
			half_sec=FALSE;
			Display();			
		}	
	}
}
/**********************************
********Calibration mode***********
**********************************/
VOID Calibration_Key_Processing()
{
	if(keyprocess)
	{
		keydone=FALSE;
		keyprocess=FALSE;
		numeric=0;
		if(!keypre[1]&&!keypre[2]&&!keypre[3])
		{
			switch(keypre[0])
			{
			case K_ENTER:
				Beep();
				Cal_Weight=Get_Cal_Weight_from_display_buf();
				if(Cal_Weight!=0&&Cal_Weight<=30000)
				{
					factor_calcul=TRUE;
					Calculate_One_Count();
					Save_Cal_One_count(One_count);
					Set_One_count_Display(One_count);
					Delay(2);
					Cal_counts++;
					if(Cal_counts>99)
						Cal_counts=99;
					Save_Cal_counts(&Cal_counts);
				}
				else
					Alarm();
				break;
			case K_ADD:
				Beep();
				if(factor_calcul)
				{
					One_count=One_count+1;
					//Save_Cal_One_count(One_count);
					Set_One_count_Display(One_count);
				}
				break;
			case K_SUB:
				Beep();
				if(factor_calcul)
				{
					One_count=One_count-1;
					//Save_Cal_One_count(One_count);
					Set_One_count_Display(One_count);
				}
				break;
			case K_CLEAR:
				Beep();
				Cal_Weight=0;
				Set_Cal_Weight_Display(Cal_Weight);
				break;
			case K_00:
				Beep();
				numeric+='0';
				Lcd_Buf_Left_Shift(lcd2_buf,4,numeric,0);
				Lcd_Buf_Left_Shift(lcd2_buf,4,numeric,0);
				Cal_Weight=Get_Cal_Weight_from_display_buf();
				Set_Cal_Weight_Display(Cal_Weight);
				break;	
			case K_9:numeric++;
			case K_8:numeric++;
			case K_7:numeric++;
			case K_6:numeric++;
			case K_5:numeric++;
			case K_4:numeric++;
			case K_3:numeric++;
			case K_2:numeric++;
			case K_1:numeric++;
			case K_0:numeric+='0';
				Beep();
				Lcd_Buf_Left_Shift(lcd2_buf,4,numeric,0);
				Cal_Weight=Get_Cal_Weight_from_display_buf();
				Set_Cal_Weight_Display(Cal_Weight);
				break;
			}	
		}
		else if(keypre[3])
		{
			Beep();
			Cal_flag=FALSE;
			mode=Initialization_mode;
		}
		keydone=TRUE;
	}
}

VOID Calibration()
{
	INT8 data i;
	BYTE Option_Table[6],Option_buf;
	Read_Cal_counts(&Cal_counts);
	Set_Lcd2_Buf(0,0,7);
	Set_Lcd3_Buf(0,0,7);
	Set_Cal_counts_Display(Cal_counts);
	Display();
	Wait_n_s(2);
	Read_Option_Param(&Option_buf);
	if((Option_buf&0x02)==0x02)
		KG_flag=FALSE;
	else
		KG_flag=TRUE;
	Read_Cal_Zero_limit(Option_Table);
	temp_LONG.B[0]=0x00;
	temp_LONG.B[1]=Option_Table[0];
	temp_LONG.B[2]=Option_Table[1];
	temp_LONG.B[3]=Option_Table[2];
	Cal_Zero_Lower_count=temp_LONG.L;
	temp_LONG.B[0]=0x00;
	temp_LONG.B[1]=Option_Table[3];
	temp_LONG.B[2]=Option_Table[4];
	temp_LONG.B[3]=Option_Table[5];
	Cal_Zero_Upper_count=temp_LONG.L;
	Cal_flag=TRUE;
	One_count=0;
	Weight=0;
	Cal_Weight=0;
	factor_calcul=FALSE;
	for(i=0;i<5;i++)
		Get_AD_Convert_Data();
	Cal_Zero_count=0;
	for(i=0;i<5;i++)
		Cal_Zero_count+=Get_AD_Convert_Data();
	Cal_Zero_count=Cal_Zero_count/5;
	if(Cal_Zero_Count_Check())
		Save_Cal_Zero_count(Cal_Zero_count);
	else
	{
		Set_ADC_On_Lcd1_Display();
		Display();
		while(1);
	}
	Set_Weight_Display(Weight);
	Set_Cal_Weight_Display(Cal_Weight);
	Set_One_count_Display(One_count);
	Set_BEEP_Icon();
	while(mode==Calibration_mode)
	{
		if(factor_calcul)
		{
			Monitor_Weigh_Scale_On_Calibration_Mode();
			Set_Weight_Display(Weight);	
		}
		Calibration_Key_Processing();
		if(half_sec)
		{
			half_sec=FALSE;
			point2_on=~point2_on;
			Display();			
		}
	}	
}

/**********************************
********Initialization mode********
**********************************/
VOID Initialization()
{
	INT8 data i;
	BYTE Option_Table[TABLE_LEN];
	BYTE Option_buf; 
	if(!Read_Option_Table(Option_Table))
	{
		Set_NOEEP_On_Lcd1_Display();
		Display();
		while(1);
	}
	if(Option_Table[EEPROM_ID]!=0xa5&&Option_Table[EEPROM_ID+1]!=0x5a)
	{
		Set_EEP_On_Lcd1_Display();
		Display();
		while(1);
	}
	Option_buf=Option_Table[Option_Param_address];
	if((Option_buf&0x01)==0x01)
		Beep_on=TRUE;
	else
		Beep_on=FALSE;
	if((Option_buf&0x02)==0x02)
		KG_flag=FALSE;
	else
		KG_flag=TRUE;
	if((Option_buf&0x04)==0x04)
		Ver_flag=FOOKTIN;
	else
		Ver_flag=PAND;

	if((Option_buf&0x08)==0x08)
		Unit_flag=TRUE;
	else
		Unit_flag=FALSE;
	if((Option_buf&0x10)==0x10)
	{
		Light_on=TRUE;
		LIGHT=FALSE;
	}
	else
	{
		Light_on=FALSE;
		LIGHT=TRUE;
	}
	temp_INT.B[0]=Option_Table[Graduation_Grade_address];
	temp_INT.B[1]=Option_Table[Graduation_Grade_address+1];
	Graduation_Grade=temp_INT.I;
	Graduation1=Option_Table[Graduation1_address];
	Graduation2=Option_Table[Graduation2_address];

	temp_INT.B[0]=Option_Table[Max_Capacity_address];
	temp_INT.B[1]=Option_Table[Max_Capacity_address+1];
	Max_Capacity=temp_INT.I;

	Initial_Zero_Setting_limit=Option_Table[Initial_Zero_Setting_limit_address];
	Zero_Setting_and_Zero_Tracking_limit=Option_Table[Zero_Setting_and_Zero_Tracking_limit_address];
	
	temp_INT.B[0]=Option_Table[Zero_Stable_count_address];
	temp_INT.B[1]=Option_Table[Zero_Stable_count_address+1];
	Zero_Stable_count=temp_INT.I;
	Zero_Stable_times=Option_Table[Zero_Stable_times_address];
	temp_INT.B[0]=Option_Table[Weight_Stable_count_address];
	temp_INT.B[1]=Option_Table[Weight_Stable_count_address+1];
	Weight_Stable_count=temp_INT.I;
	Weight_Stable_times=Option_Table[Weight_Stable_times_address];
	
	Err1_Timeout=Option_Table[Err1_Timeout_address];
	Timeout3=Err1_Timeout;

	temp_INT.B[0]=Option_Table[Local_Height_address];
	temp_INT.B[1]=Option_Table[Local_Height_address+1];
	Local_Height=temp_INT.I;

	Local_Latitude=Option_Table[Local_Latitude_address];

	temp_INT.B[0]=Option_Table[Destination_Height_address];
	temp_INT.B[1]=Option_Table[Destination_Height_address+1];
	Destination_Height=temp_INT.I;

	Destination_Latitude=Option_Table[Destination_Latitude_address];

	temp_INT.B[0]=Option_Table[Soft_Ver_address];
	temp_INT.B[1]=Option_Table[Soft_Ver_address+1];
	Soft_ver_no=temp_INT.I;
	
	Cal_counts=Option_Table[Cal_counts_address];

	temp_FLOAT.B[0]=Option_Table[Cal_One_count_address];
	temp_FLOAT.B[1]=Option_Table[Cal_One_count_address+1];
	temp_FLOAT.B[2]=Option_Table[Cal_One_count_address+2];
	temp_FLOAT.B[3]=Option_Table[Cal_One_count_address+3];
	One_count=temp_FLOAT.F;
	temp_FLOAT.B[0]=Option_Table[Cal_Zero_count_address];
	temp_FLOAT.B[1]=Option_Table[Cal_Zero_count_address+1];
	temp_FLOAT.B[2]=Option_Table[Cal_Zero_count_address+2];
	temp_FLOAT.B[3]=Option_Table[Cal_Zero_count_address+3];
	Cal_Zero_count=temp_FLOAT.F;
	temp_FLOAT.B[0]=Option_Table[Cal_Weight_count_address];
	temp_FLOAT.B[1]=Option_Table[Cal_Weight_count_address+1];
	temp_FLOAT.B[2]=Option_Table[Cal_Weight_count_address+2];
	temp_FLOAT.B[3]=Option_Table[Cal_Weight_count_address+3];
	Cal_Weight_count=temp_FLOAT.F;
	if(Cal_counts==0)
	{
		Set_NOCAL_On_Lcd1_Display();
		Display();
		while(1);	
	}
	temp_LONG.B[0]=0x00;
	Cls_Icon_Buf();
	Set_Logo_Display();
	Set_SCALE_Display();
	for(i=9;i>=0;i--)
	{
		Set_Lcd1_Buf(i+'0',0,5);
		Display();
		Wait_n_ms(50);
	}
	Set_Ver_no_Display(Soft_ver_no);
	Display();
	Wait_n_ms(50);
	while(!Zero_Setting_When_Power_Up())
	{
		Set_INIT0_On_Lcd1_Display();
		Display();	
	}
	if(Beep_on)
		Set_BEEP_Icon();
	else
		Cls_BEEP_Icon();
	Last_day=0;
	unit_price_entered=FALSE;
	NET_flag=FALSE;		
	mode=Sales_mode;
	Sold_Quantity=0;
	Sum_Price=0;
	Tare_Weight=0;
}

/**********************************
********Sales mode*****************
**********************************/
VOID Sales_Key_Processing()
{
	if(keyprocess)
	{
		keydone=FALSE;
		keyprocess=FALSE;
		numeric=0;
		if(!keypre[1]&&!keypre[2]&&!keypre[3])
		{
			switch(keypre[0])
			{
			case PLU30:numeric++;
			case PLU29:numeric++;
			case PLU28:numeric++;
			case PLU27:numeric++;
			case PLU26:numeric++;
			case PLU25:numeric++;
			case PLU24:numeric++;
			case PLU23:numeric++;
			case PLU22:numeric++;
			case PLU21:numeric++;
			case PLU20:numeric++;
			case PLU19:numeric++;
			case PLU18:numeric++;
			case PLU17:numeric++;
			case PLU16:numeric++;
			case PLU15:numeric++;
			case PLU14:numeric++;
			case PLU13:numeric++;
			case PLU12:numeric++;
			case PLU11:numeric++;
			case PLU10:numeric++;
			case PLU9:numeric++;
			case PLU8:numeric++;
			case PLU7:numeric++;
			case PLU6:numeric++;
			case PLU5:numeric++;
			case PLU4:numeric++;
			case PLU3:numeric++;
			case PLU2:numeric++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -