条形码生成 C

条形码生成 C


#define CODE128_PIXEL_WIDTH		(1)		// 单位宽度
#define CODE128_PIXEL_HIGT		(64)	// 单位高度
#define CODE128_START_A			(103)	// 字符集 A
#define CODE128_START_B			(104)	// 字符集 B
#define CODE128_START_C			(105)	// 字符集 C
#define CODE128_STOP			(106)	// 结束


typedef struct
{
	char    str[2];
	uint8_t bitWidth[6];
	
}BAR_CODE128_ASCII_BIT;

const BAR_CODE128_ASCII_BIT  BarCode128_SACii[] = 
{
/*
 *	参考 GB/T 18347-2001 表1  128条码编码字符集
 */
	{' ',' ',{2,1,2,2,2,2}},	// 0
	{'!','!',{2,2,2,1,2,2}},	// 1
	{'"','"',{2,2,2,2,2,1}},	// 2
	{'#','#',{1,2,1,2,2,3}},	// 3
	{'$','$',{1,2,1,3,2,2}},	// 4
	{'%','%',{1,3,1,2,2,2}},	// 5
	{'&','&',{1,2,2,2,1,3}},	// 6
	{'\'','\'',{1,2,2,3,1,2}},	// 7
	{'(','(',{1,3,2,2,1,2}},	// 8
	{')',')',{2,2,1,2,1,3}},	// 9
	{'*','*',{2,2,1,3,1,2}},	// 10
	{'+','+',{2,3,1,2,1,2}},	// 11
	{',',',',{1,1,2,2,3,2}},	// 12
	{'-','-',{1,2,2,1,3,2}},	// 13
	{'.','.',{1,1,3,2,3,1}},	// 14
	{'/','/',{1,1,3,2,2,2}},	// 15
	{'0','0',{1,2,3,1,2,2}},	// 16
	{'1','1',{1,2,3,2,1,1}},	// 17
	{'2','2',{2,2,3,2,2,1}},	// 18
	{'3','3',{2,2,1,1,3,2}},	// 19
	{'4','4',{2,2,1,2,3,1}},	// 20
	{'5','5',{2,1,3,2,1,2}},	// 21
	{'6','6',{2,2,3,1,1,2}},	// 22
	{'7','7',{3,1,2,1,3,1}},	// 23
	{'8','8',{3,1,1,2,2,2}},	// 24
	{'9','9',{3,2,1,1,2,2}},	// 25
	{':',':',{3,2,1,2,2,1}},	// 26
	{';',';',{3,1,2,2,1,2}},	// 27
	{'<','<',{3,2,2,1,1,2}},	// 28
	{'=','=',{3,2,2,2,1,1}},	// 29
	{'>','>',{2,1,2,1,2,3}},	// 30
	{'?','?',{2,1,2,3,2,1}},	// 31
	{'@','@',{2,3,2,1,2,1}},	// 32
	{'A','A',{1,1,1,3,2,3}},	// 33
	{'B','B',{1,3,1,1,2,3}},	// 34
	{'C','C',{1,3,1,3,2,1}},	// 35
	{'D','D',{1,1,2,3,1,3}},	// 36
	{'E','E',{1,3,2,1,1,3}},	// 37
	{'F','F',{1,3,2,3,1,1}},	// 38
	{'G','G',{2,1,1,3,1,3}},	// 39
	{'H','H',{2,3,1,1,1,3}},	// 40
	{'I','I',{2,3,1,3,1,1}},	// 41
	{'J','J',{1,1,2,1,3,3}},	// 42
	{'K','K',{1,1,2,3,3,1}},	// 43
	{'L','L',{1,3,2,1,3,1}},	// 44
	{'M','M',{1,1,3,1,2,3}},	// 45
	{'N','N',{1,1,3,3,2,1}},	// 46
	{'O','O',{1,3,3,1,2,1}},	// 47
	{'P','P',{3,1,3,1,2,1}},	// 48
	{'Q','Q',{2,1,1,3,1,1}},	// 49
	{'R','R',{2,3,1,1,3,1}},	// 50
	{'S','S',{2,1,3,1,1,3}},	// 51
	{'T','T',{2,1,3,3,1,1}},	// 52
	{'U','U',{2,1,3,1,3,1}},	// 53
	{'V','V',{3,1,1,1,2,3}},	// 54
	{'W','W',{3,1,1,3,2,1}},	// 55
	{'X','X',{3,3,1,1,2,1}},	// 56
	{'Y','Y',{3,1,2,1,1,3}},	// 57
	{'Z','Z',{3,1,2,3,1,1}},	// 58
	{']',']',{3,3,2,1,1,1}},	// 59
	{'\\','\\',{3,1,4,1,1,1}},	// 60
	{'}','}',{2,2,1,4,1,1}},	// 61
	{'^','^',{4,3,1,1,1,1}},	// 62
	{'_','_',{1,1,1,2,2,4}},	// 63
	{' ','`',{1,1,1,4,2,2}},	// 64
	{' ','a',{1,2,1,1,2,4}},	// 65
	{' ','b',{1,2,1,4,2,1}},	// 66
	{' ','c',{1,4,1,1,2,2}},	// 67
	{' ','d',{1,4,1,2,2,1}},	// 68
	{' ','e',{1,1,2,2,1,4}},	// 69
	{' ','f',{1,1,2,4,1,2}},	// 70
	{' ','g',{1,2,2,1,1,4}},	// 71
	{' ','h',{1,2,2,4,1,1}},	// 72
	{' ','i',{1,4,2,1,1,2}},	// 73
	{' ','j',{1,4,2,2,1,1}},	// 74
	{' ','k',{2,4,1,2,2,1}},	// 75
	{' ','l',{2,2,1,1,1,4}},	// 76
	{' ','m',{4,1,3,1,1,1}},	// 77
	{' ','n',{2,4,1,1,1,2}},	// 78
	{' ','o',{1,3,4,1,1,1}},	// 79
	{' ','p',{1,1,1,2,4,2}},	// 80
	{' ','q',{1,2,1,1,4,2}},	// 81
	{' ','r',{1,2,1,2,4,1}},	// 82
	{' ','s',{1,1,4,2,1,2}},	// 83
	{' ','t',{1,2,4,1,1,2}},	// 84
	{' ','u',{1,2,4,2,1,1}},	// 85
	{' ','v',{4,1,1,2,1,2}},	// 86
	{' ','w',{4,2,1,1,1,2}},	// 87
	{' ','x',{4,2,1,2,1,1}},	// 88
	{' ','y',{2,1,2,1,4,1}},	// 89
	{' ','z',{2,1,4,1,2,1}},	// 90
	{' ','{',{4,1,2,1,2,1}},	// 91
	{' ','|',{1,1,1,1,4,3}},	// 92
	{' ','}',{1,1,1,3,4,1}},	// 93
	{' ','~',{1,3,1,1,4,1}},	// 94
	{' ',' ',{1,1,4,1,1,3}},	// 95
	{' ',' ',{1,1,4,3,1,1}},	// 96
	{' ',' ',{4,1,1,1,1,3}},	// 97
	{' ',' ',{4,1,1,3,1,1}},	// 98
	{' ',' ',{1,1,3,1,4,1}},	// 99
	{' ',' ',{1,1,4,1,3,1}},	// 100
	{' ',' ',{3,1,1,1,4,1}},	// 101
	{' ',' ',{4,1,1,1,3,1}},	// 102
	{' ',' ',{2,1,1,4,1,2}},	// 103
	{' ',' ',{2,1,1,2,1,4}},	// 104
	{' ',' ',{2,1,1,2,3,2}},	// 105
};

const uint8_t BarCode128_STOP_BitData[]={2,3,3,1,1,1,2}; // 结束符

// 以 x,y 为起点,画宽pixel_w,高pixel_h的实心矩形,color 为颜色。
int AH_LCD_Disp_Rectangle(unsigned char pixel_x,unsigned char pixel_y,unsigned char pixel_w,unsigned char pixel_h,DISP_COLOR_enum color);


int AH_LCD_Disp_BarCode_bitData(unsigned char pixel_x,unsigned char pixel_y,unsigned char data)
{
	unsigned char x=0,y=0,PixelBit=0;
	unsigned char bitWidth = 0;
	unsigned char bitWidth_data[7] = {0};

	
	if(data < CODE128_STOP)
	{
		memcpy(bitWidth_data,&BarCode128_SACii[data].bitWidth[0],6);
	}
	else if(data == CODE128_STOP)
	{
		memcpy(bitWidth_data,&BarCode128_STOP_BitData[0],7);
	}
	else
	{
		return -2;
	}
	
	
	x = pixel_x;
	y = pixel_y;
	
	bitWidth = bitWidth_data[0] * CODE128_PIXEL_WIDTH;
	AH_LCD_Disp_Rectangle(x,y,bitWidth,CODE128_PIXEL_HIGT,DISP_COLOR_BLACK); //  黑色
	
	y += bitWidth;
	bitWidth = bitWidth_data[1] * CODE128_PIXEL_WIDTH;
	AH_LCD_Disp_Rectangle(x,y,bitWidth,CODE128_PIXEL_HIGT,DISP_COLOR_WHITE); // 白色
	
	y += bitWidth;
	bitWidth = bitWidth_data[2] * CODE128_PIXEL_WIDTH;
	AH_LCD_Disp_Rectangle(x,y,bitWidth,CODE128_PIXEL_HIGT,DISP_COLOR_BLACK); //  黑色
	
	y += bitWidth;
	bitWidth = bitWidth_data[3] * CODE128_PIXEL_WIDTH;
	AH_LCD_Disp_Rectangle(x,y,bitWidth,CODE128_PIXEL_HIGT,DISP_COLOR_WHITE); // 白色
	
	y += bitWidth;
	bitWidth = bitWidth_data[4] * CODE128_PIXEL_WIDTH;
	AH_LCD_Disp_Rectangle(x,y,bitWidth,CODE128_PIXEL_HIGT,DISP_COLOR_BLACK); //  黑色
	
	y += bitWidth;
	bitWidth = bitWidth_data[5] * CODE128_PIXEL_WIDTH;
	AH_LCD_Disp_Rectangle(x,y,bitWidth,CODE128_PIXEL_HIGT,DISP_COLOR_WHITE); // 白色
	
	if(data == CODE128_STOP) // 结束
	{
		y += bitWidth;
		bitWidth = bitWidth_data[6] * CODE128_PIXEL_WIDTH;
		AH_LCD_Disp_Rectangle(x,y,bitWidth,CODE128_PIXEL_HIGT,DISP_COLOR_BLACK); // 黑色
	}
	
	y += bitWidth;
	
	return (y);
}
/*
**************************************************************************************************************
*
* 函数原型:int AH_LCD_Disp_BarCode128(uint8_t x, uint8_t y, uint8_t type, char *str)
*
* 函数功能:显示条形码(code 128)
*
* 函数输入:uint8_t x : 行
*           uint8_t y : 列
*           uint8_t type : 字符集类型,CODE128_START_A(大写字母、数字、标点)
*                                      CODE128_START_B(大写字母、数字、标点、小写字母)
*                                      CODE128_START_C(纯数字,00-99,长度为偶数)
*           char    *str :
*                  
* 函数输出:无
*
* 函数返回:0   		失败
*   
**************************************************************************************************************
*/
int AH_LCD_Disp_BarCode128(uint8_t x, uint8_t y, uint8_t type, char *str)
{
	uint8_t i,k,stringLen,number,dataLen,dataArray[20],NumberArray[20];
	uint32_t sum;

	if( (type != CODE128_START_A)&&(type != CODE128_START_B)&&(type != CODE128_START_C) )
		return 1; 
	
	stringLen = strlen(str);
	
	if( stringLen > (sizeof(dataArray)-3) )
		return 2;
	
	if(type == CODE128_START_C) //字符集C,源数据转成 HEX 数组。
	{
		AH_Tools_Str2Bcd(str,stringLen,NumberArray);
		
		if( stringLen % 2)
			stringLen = stringLen / 2 + 1;
		else
			stringLen = stringLen / 2;
		
		AH_Tools_Bcd2Bin(NumberArray,NumberArray,stringLen);
	}
	
	dataLen = 0;
	sum = 0;
	memset(dataArray,0,sizeof(dataArray));
	
	// 起始符
	sum += type;
	dataArray[dataLen++] = type;
	
	// 有效数据
	for(i=0;i<stringLen;i++)
	{

		k = CODE128_STOP;
		number = *(str+i);
		
		if( type == CODE128_START_A)
		{
			if( (number >= 32) && ( number <= 95))
				k = *(str+i) - 32;
		}
		else if( type == CODE128_START_B)
		{
			if( (number >= 32) && ( number <= 127))
				k = *(str+i) - 32;
		}
		else // CODE128_START_C
		{
			k = NumberArray[i];
			if(k >= 100 )
				return 3;
		}

		
		if( k == CODE128_STOP)
			return 3;
		
		sum += (i+1) * k;
		dataArray[dataLen++] = k;
	}
	
	// 校验符
	sum = sum % 103;
	dataArray[dataLen++] = sum;
	
	// 结束符
	dataArray[dataLen++] = CODE128_STOP;
	
	//显示
	for(i=0;i<dataLen;i++)
		y = AH_LCD_Disp_BarCode_bitData(x,y,dataArray[i]);
	
	return 0;
}

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值