sub.c

来自「一个基于C51开发的计价秤」· C语言 代码 · 共 273 行

C
273
字号
/*********************************************/
// File Name: sub.c
// Author: henny
// Date: 2006/3/1
/*********************************************/
#include <SST89x5xxRD2.h>
#include "Public.h"
#include "KeyBoard.h"

extern BYTE timer1_count;
extern INT8 Timeout1,Timeout2;
extern BOOL Timeout1_enable,Timeout2_enable;
extern BYTE report_type;
extern WORD Record_Counts;
extern WORD PLU_no;
extern WORD Weight;
extern WORD Quantity;
extern DWORD Unit_Price;
extern DWORD Total_Price;
extern BYTE lastop;
extern FLOAT Last_value;
extern FLOAT Current_value;
extern UNION_LONG temp_LONG;
extern BYTE PLU_buf[PLU_LEN];
extern BYTE Record_buf[RECORD_LEN];

extern VOID PLU_Load(WORD temp);
extern VOID Record_Load(WORD temp);
extern VOID Set_Weight_Display(WORD temp);
extern VOID Set_Quantity_Display(WORD temp);
extern VOID Set_Unit_Price_Display(DWORD temp);
extern VOID Set_Total_Price_Display(DWORD temp);
extern VOID Set_Calcul_Result_Display(BYTE *p);
extern VOID Set_Lcd3_Buf(CHAR c,BYTE pos,BYTE cnt);

VOID Wait_n_ms(BYTE n)
{
	Timeout1=n;
	Timeout1_enable=TRUE;
	timer1_count=0;
	while(Timeout1>0);
	Timeout1_enable=FALSE;
		
}

VOID Wait_n_s(BYTE n)
{
	Timeout2=n;
	Timeout2_enable=TRUE;
	timer1_count=0;
	while(Timeout2>0);
	Timeout2_enable=FALSE;
		
}

VOID Float_Format(FLOAT f)
{
	INT8 data p=0;
	BYTE dbuf[9];
	BYTE digit;
	FLOAT divisor=1000000; 
	BOOL pad=FALSE;
	if(f>=0)
		dbuf[p++]=' ';
	else
	{
		dbuf[p++]='-';
		f=-f;
	}
	if(f>=divisor)
		dbuf[p++]='E';
	else
		while(p<9&&(divisor>1||f>=0.000001))
		{
			divisor=divisor/10;
			digit=(int)(f/divisor);
			if(divisor<1&&divisor>0.01)
				dbuf[p++]='.';
			if(digit!=0||divisor<10)
			{
				dbuf[p++]=digit+'0';
				pad=TRUE;
			}
			else if(pad)
				dbuf[p++]='0';
			f-=digit*divisor;
		}
	dbuf[p]=0;
	Set_Calcul_Result_Display(dbuf);
}

VOID Calculator_Operate(BYTE token)
{
	BOOL result=TRUE;
	switch(token)
	{
	case K_ADD:Last_value+=Current_value;break;
	case K_SUB:Last_value-=Current_value;break;
	case K_MUL:Last_value*=Current_value;break;
	case K_DIV:
		if(Current_value!=0)
		{
			Last_value/=Current_value;
			result=TRUE;
		}
		else
			result=FALSE;
		break;
	}
	if(result)
	{
		Last_value=Last_value+0.000001;
		Float_Format(Last_value);
	}
	else
	{
		Set_Lcd3_Buf(0,1,6);
		Set_Lcd3_Buf('E',0,1);
	}
}

DWORD Hex_to_Dec(DWORD hex)
{
	FLOAT a,b,c,d,e,f,g;
	a=hex&0xf;
	b=hex>>4&0xf;
	c=hex>>8&0xf;
	d=hex>>12&0xf;
	e=hex>>16&0xf;
	f=hex>>20&0xf;
	g=hex>>24&0xf;
	if(a>9||b>9||c>9||d>9||e>9||f>9||g>9)
		return 0;
	else
		return a+b*10+c*100+d*1000+e*10000.0+f*100000+g*1000000;
}

DWORD Data_Convert_Process(BYTE *pt,n)
{
	switch(n)
	{
	case 2:
		temp_LONG.B[0]=0x00;
		temp_LONG.B[1]=0x00;
		temp_LONG.B[2]=*pt;
		temp_LONG.B[3]=*(pt+1);
		break;
	case 3:
		temp_LONG.B[0]=0x00;
		temp_LONG.B[1]=*pt;
		temp_LONG.B[2]=*(pt+1);
		temp_LONG.B[3]=*(pt+2);
		break;	
	case 4:
		temp_LONG.B[0]=*pt;
		temp_LONG.B[1]=*(pt+1);
		temp_LONG.B[2]=*(pt+2);
		temp_LONG.B[3]=*(pt+3);
		break;
	}
	return(Hex_to_Dec(temp_LONG.L));
}

VOID Load_PLU_to_LCD_Buf(WORD temp)
{
	PLU_Load(temp);
	Unit_Price=Data_Convert_Process(PLU_buf,3);
	Set_Unit_Price_Display(Unit_Price);
}

BOOL Load_Record_to_LCD_Buf(WORD temp)
{
	Record_Load(temp);
	if(Record_buf[0]==DELE)
		return FALSE;
	if(Record_buf[0]==PW||Record_buf[0]==MW)
	{
		Weight=Data_Convert_Process(Record_buf+Weight_Save_address,3);
		Set_Weight_Display(Weight);	
	}
	else if(Record_buf[0]==PN||Record_buf[0]==MN)
	{
		Quantity=Data_Convert_Process(Record_buf+Weight_Save_address,2);
		Set_Quantity_Display(Quantity);	
	}
	Unit_Price=Data_Convert_Process(Record_buf+Unit_Price_Save_address,3);
	Set_Unit_Price_Display(Unit_Price);
	Total_Price=Data_Convert_Process(Record_buf+Total_Price_Save_address,4);
	Set_Total_Price_Display(Total_Price);
	return TRUE;
}

DWORD Report_Total()
{
	WORD ii;
	DWORD total_value=0;
	for(ii=1;ii<=Record_Counts;ii++)
	{
		Record_Load(ii);
		switch(report_type)
		{	
			case TOTAL_ALL_MONEY:
				if(Record_buf[0]==PW||Record_buf[0]==PN||Record_buf[0]==MW||Record_buf[0]==MN)
					total_value+=Data_Convert_Process(Record_buf+Total_Price_Save_address,4);	
				break;
			case TOTAL_ALL_PLU_MONEY:
				if(Record_buf[0]==PW||Record_buf[0]==PN)
					total_value+=Data_Convert_Process(Record_buf+Total_Price_Save_address,4);	
				break;
			case TOTAL_SEL_PLU_MONEY:
				if(PLU_no==Data_Convert_Process(Record_buf+PLU_no_Save_address,2))
					total_value+=Data_Convert_Process(Record_buf+Total_Price_Save_address,4);	
				break;
			case TOTAL_ALL_MANUL_MONEY:
				if(Record_buf[0]==MW||Record_buf[0]==MN)
					total_value+=Data_Convert_Process(Record_buf+Total_Price_Save_address,4);	
				break;
			case TOTAL_ALL_NUMBER_MONEY:
				if(Record_buf[0]==PN||Record_buf[0]==MN)
					total_value+=Data_Convert_Process(Record_buf+Total_Price_Save_address,4);	
				break;
			case TOTAL_ALL_WEIGHT:
				if(Record_buf[0]==PW||Record_buf[0]==MW)
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,3);
				break;
			case TOTAL_ALL_PLU_WEIGHT:
				if(Record_buf[0]==PW)
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,3);
				break;
			case TOTAL_SEL_PLU_WEIGHT:
				if((Record_buf[0]==MW||Record_buf[0]==PW)&&PLU_no==Data_Convert_Process(Record_buf+PLU_no_Save_address,2))
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,3);
				break;
			case TOTAL_ALL_MANUL_WEIGHT:
				if(Record_buf[0]==MW)
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,3);
				break;
			case TOTAL_ALL_NUMBER:
				if(Record_buf[0]==PN||Record_buf[0]==MN)
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,2);
				break;
			case TOTAL_ALL_PLU_NUMBER:
				if(Record_buf[0]==PN)
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,2);
				break;
			case TOTAL_SEL_PLU_NUMBER:
				if((Record_buf[0]==MN||Record_buf[0]==PN)&&PLU_no==Data_Convert_Process(Record_buf+PLU_no_Save_address,2))
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,2);
				break;
			case TOTAL_ALL_MANUL_NUMBER:
				if(Record_buf[0]==MN)
					total_value+=Data_Convert_Process(Record_buf+Weight_Save_address,2);
				break;
		}
	}
	if(total_value>9999999)
		total_value=9999999;
	return total_value;			
}
 
BOOL Password_Compare(BYTE *password,BYTE *lcd_buf)
{
	if(password[0]==lcd_buf[2]&&password[1]==lcd_buf[1]&&password[2]==lcd_buf[0])
 		return TRUE;
	else
		return FALSE;	
}
/*
VOID Weight_KG_to_LB()	//1kg=2.2046lb,1lb=16oz
{
	
}
*/

⌨️ 快捷键说明

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