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

📄 public.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
				break;
			case 'F':
			case 'f':
				output[i]+=15*((j==0?0x10:1));
				break;
			default:
				return(PARAM_FAIL);
			}
		}
	}
	return(0);
}
//===========================================================================================
void HexToStr(const uchar * buf,uchar * output,uchar len)
{
	uchar i;
	uchar tmp[3];
	tmp[0]=0;
	output[0]=0;
	for(i=0;i<len;i++)
	{
		sprintf((char *)tmp,"%02x",(uint)buf[i]);
		strcat((char *)output,(const char *)tmp);
	}
}

//--------------------------- crc-----------------------------
/*code TABLE1[] = {

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 

0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 

0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 

0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 

0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 

0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 

0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 

0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 

0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 

0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 

0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 

0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 

0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 

0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 

0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 

0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 

0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 

0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 

0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 

0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 

0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 

0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 

0x43, 0x83, 0x41, 0x81, 0x80, 0x40

};

code TABLE2[] = {

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40

} ; 
/*
crc_make: calculates a crc16
size: size of the frame (including header)
buff: pointer to the first byte of the frame
(slave number)
return: CRC16 in MOTOROLA format (high byte / low byte)
*/
static void crc_byte(unsigned int onebyte,unsigned int *crc_reg)
{
 	int i;
    onebyte <<= 8;
    for(i=8;i>0;i--)
    {
       	if((onebyte^*crc_reg) & 0x8000 )
        	*crc_reg = (*crc_reg<<1)^0x8005;
		else
          	*crc_reg <<= 1;
      	onebyte <<= 1;
  	}
}


uint crcxdata(uint length,void* buffer)
{
  	uint i;
    static unsigned int crc;
    //if(clear)
       crc = 0;
    for(i=0;i<length;i++)
    {
     	crc_byte(*((unsigned char *)buffer),&crc);
     	((unsigned char *)buffer)++;
    }
    return crc;
}
/*
uint crcxdata(uint size, uchar *buff)
{
	uchar car;
	uchar crc[2];
	uint i;           

	crc[0] = 0xff;
	crc[1] = 0xff;
	for ( i = 0; i < length; i++ ) 
	{
		car = *((uchar*)(buffer+i));//buff[i];
		car ^= crc[0];
		crc[0] = crc[1] ^ TABLE2[car];
		crc[1] = TABLE1[car];
	}
	return (*(uint *)(&crc[0]));
}

//--------------------------- crc end-----------------------------
/*==================================================================
函数功能:长整形整数转换为压缩BCD码
入口参数:num--长整形整数; *bcd_buf--压缩BCD码缓冲区指针
出口参数:*bcd_buf--压缩BCD码缓冲区指针
返回值:   
全局变量:
编制人:     日期:2003-07-04
==================================================================*/	
void long_to_bcd(ulong num,uchar *bcd_buf)
{
	num = num%1000000;
	bcd_buf[0] = num/10000;
	bcd_buf[1] = (num%10000)/100;
	bcd_buf[2] = num%100;
	num = 0;
	bcd_buf[0] = ((bcd_buf[0]/10)*0x10)+bcd_buf[0]%10;
	bcd_buf[1] = ((bcd_buf[1]/10)*0x10)+bcd_buf[1]%10;
	bcd_buf[2] = ((bcd_buf[2]/10)*0x10)+bcd_buf[2]%10;	
}
/*------------------------------------------------------
功能:格式化长整数为带两位小数点的数
入口:
		da == 长整数
		num == 整数部分的位数
		buf == 存放格式化后数据的缓冲区
出口:buf == 存放格式化后数据的缓冲区
全局变量:
------------------------------------------------------*/
void pri_format(long da,uchar num,uchar *buf)
{
	int decimal;
	long integer;
	uint decimal0;
	uchar xdata buf1[15];

	integer = da /100;
	decimal = da % 100;
	//2005.11.7
	decimal0=(uint)decimal;
	if(decimal&0x8000)decimal0=0xffff-decimal0+1;
	sprintf(buf1,"%%%uld.%%02u",(uint)num);
	sprintf(buf,buf1,integer,decimal0);
}
/*------------------------------------------------------
	使字符串bufs位于一行的中间输出到bufd
	入口参数:
		print_num == 一行的长度
		bufs == 源字符串
		bufd == 目标字符串
	说明:优先空格在后面
------------------------------------------------------*/
void print_format(uchar line_len,uchar *bufd,uchar *bufs)
{
	uchar len,after,before;

	len = strlen(bufs);
	after = (line_len - len)/2;
	before = line_len - after - len;
	while(before)
	{
		*bufd = ' ';
		before--;
		bufd++;
	}
	while(len)
	{
		*bufd = *bufs;
		bufd++;
		bufs++;
		len--;
	}
	while(after)
	{
		*bufd = ' ';
		after--;
		bufd++;
	}
	*bufd = 0;
	return;
}
/*------------------------------------------------------
	入口参数:
		da == 需打印的长整数
		num == 整数部分的位数
		buf == 存放打印数据的缓冲区
------------------------------------------------------*/
void pri_format3(ulong da,uchar num,uchar *buf)
{
	int decimal;
	long integer;
	uchar i;
	uchar buf1[15];

	integer = da /100;
	decimal = da % 100;
	sprintf(buf1,"%%%uld.%%02u",(uint)num);
	sprintf(&buf[1],buf1,integer,decimal);
	if(buf[1]!=' ') buf[0] = '-';
	else
	{
		buf[0] = ' ';
		for(i=0;i<num+1;i++)
		{
			if(buf[i]!=' ')
			{
				buf[i-1] = '-';
				break;
			}
		}
	}
}
/*------------------------------------------------------
	在字符串后添空格
	入口参数:
		len == 空格的长度
		str == 源字符串
------------------------------------------------------*/
void add_blank(uchar len,uchar *str)
{
	while(len)
	{
		*str = ' ';
		len--;
		str++;
	}
	*str = 0;
}
//====================================================================================
uchar wait_input_num(ulong * l,uchar point,uchar len,ulong max_num)
{
	uchar key,old_key;//键值
	uchar key_first,result;
	uchar numkey[12];
	uchar buf[15];
	ulong num;

	num=0;
	key=0;old_key=0;
	key_first=1;
	set_value0(numkey,(uint)sizeof(numkey));
	while(1)
	{
        openbacklight();
		if(low_pwr) return(POWER_OFF);
		key=get_key();
		if (key==0)
		{
			old_key=0;
			continue;
		}
		else
		{
			if(key==old_key)
			{
				if(key_first)
				{
					delayms(10);
					key_first=0;
					continue;
				}
				else
				{
				//	beep(30);
					
				}
			}
			else
			{
				key_first=1;
				//beep(30);
			}
			old_key=key;

		}

		if(key==VOID)//取消退出 
		{
			clear_lcd(0,4);
			return(CANCEL);
		}
		if(key>='0' && key<='9' ||
			key==KEY00 || key==POINT) //数字键
		{
			
			result=get_valid_digit(key,point,len,numkey);
			
			strcpy(buf,numkey);
			clear_lcd(3,1);
			lcd_disp(3,0,buf);
			if(result)
			{
				clear_lcd(3,1);
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
				strcpy(buf,"按键错误,请重新输入");
				lcd_disp(3,0,buf);
				continue;
			}
			continue;
		}
		else //功能键
		{
			num=numstr_to_long(numkey,point,2);	
		}
			
		if(key==CASH)//现金/确认键
		{
			if(num==0 || max_num>0 && num>max_num)
			{
				clear_lcd(3,1);
				strcpy(buf,"按键错误,请重新输入");
				lcd_disp(3,0,buf);
				set_value0(numkey,(uint)sizeof(numkey));
				continue;
			}
			*l=num;
			break;
		}
		else
		{
			clear_lcd(3,1);
			strcpy(buf,"按键错误,请重新输入");
			lcd_disp(3,0,buf);
			num=0;
			key=0;
			set_value0(numkey,(uint)sizeof(numkey));
			continue;
		}
	}
	return(0);
}
/**************************************************************
功能:去掉字符串右边的空格
作者:罗益军
**************************************************************/
void rtrim(uchar * src)
{
	uint i,len,pos;

	pos=0;
	len=strlen(src);
	for(i=0;i<len;i++)
	{
		if(src[i]==' ')
			pos++;
		else
			pos=0;
	}
	src[len-pos]=0;

}
//====================================================================================
/*void money_format(uchar width,uchar * item,ulong money1,ulong money2,uchar * out_put)
{
	uchar xdata buf[20];
	
	if(money2>money1)
	{
		money1=money2-money1;
		sprintf(buf,"-%lu.%02u",money1/100,(uint)(money1%100));
	}
	else
	{
		money1=money1-money2;
		sprintf(buf,"%lu.%02u",money1/100,(uint)(money1%100));
	}
	 strcpy(out_put,item);
	 add_blank(width-strlen(item)-strlen(buf),&out_put[strlen(item)]);
     strcat(out_put,buf);
}
*/


⌨️ 快捷键说明

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