#include "barcode.h"
#include "pos_lcd_if.h"
#define BARCODE_X 0 //条形码起始x坐标,左边预留白边5pixl
#define BARCODE_Y 5 //条形码起始y坐标,上面预留白边5pixl
//线条颜色
#define LCD_COLOR_BLACK 0x00000000
#define LCD_COLOR_WHITE 0xFFFFFFFF
int picWidth = 130; // 图像宽度
int picHeight = 70; // 图像高度
int lineWidth = 1; // 线的宽度
int shortLine = 40; // 短线长度
int longLine = 50; // 长线长度
int code[13] = {0}; // 条形码数字数组
char* savecode = 0; //用于存储编码
char toChar(int no)
{
char c = 0;
return (char)no + 48;
}
void findandgetcode( char* c)
{
int i;
for(i = 0; i < 30; ++i)
{
if(!memcmp(secondcode[i][0], c, 2))
{
savecode = (char*)secondcode[i][1];
}
}
}
//获取指定位置的字符
char GetAt(char* pdata, int index)
{
return *(pdata+index);
}
//计算校验码
void calcCheckBit()
{
int odd=0,even=0;
int i, j;
for(i = 0; i < 12; ++i)
{
//偶数位
if(i%2 == 0)
{
odd += code[i];
}
else
{
even += code[i];
}
}
//与10取补得到检验码
code[12] = 10 - (odd*3+even)%10;
}
//接口,,只输入12个数字的数组,检验码自动计算
void getEan13Data(const char* pdata)
{
int i;
for(i = 0; i < 12; ++i, pdata++)
{
code[i] = *pdata;
}
//计算检验码
calcCheckBit();
//打印条形码
printbarcode();
}
//划粗细线
void drawline(u32 color, int x1, int y1, int x2, int y2)
{
int i;
for(i = 0; i< lineWidth; i++)
{
lcd_draw_line(color, x1 + i, y1, x2 + i, y2);
}
}
//画黑线
//参数 :起点坐标 终点坐标
//遇到字符1:短线; 0:长线
void drawBlack(int x1, int y1, int x2, int y2)
{
drawline(LCD_COLOR_BLACK, x1, y1, x2, y2);
}
//画白线 全都是短线
void drawWhite( int x1, int y1, int x2, int y2)
{
drawline(LCD_COLOR_WHITE, x1, y1, x2, y2);
}
//画条形码开始部分
void drawStart()
{
int i;
for(i = 0; i <= 8; ++i)
{
drawWhite(i*lineWidth + BARCODE_X, BARCODE_Y, i*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
}
int startX1Index = 9;
drawBlack((startX1Index++)*lineWidth + BARCODE_X, BARCODE_Y, startX1Index*lineWidth + BARCODE_X, BARCODE_Y + longLine);
drawWhite((startX1Index++)*lineWidth + BARCODE_X, BARCODE_Y, startX1Index*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
drawBlack((startX1Index++)*lineWidth + BARCODE_X, BARCODE_Y, startX1Index*lineWidth + BARCODE_X, BARCODE_Y + longLine);
}
//画条形码左边
void drawLeft()
{
int i, j, k;
const char* chTemp = firstcode[code[0]];
//用于存储左边的6位数的编码
char* szYorn[7] = {0};
for(i = 0; i < 6; i++)
{
char chTemp2;
chTemp2 = toChar(code[i+1]);
char chTemp3[3];
chTemp3[0] = chTemp2;
chTemp3[1] = chTemp[i];
findandgetcode(chTemp3);
szYorn[i] = savecode;
}
int x;
for(int j = 0; j < 6; j++)
{
for(k = 0; k < 7; k++)
{
x = 12 + j*7 + k;
if(GetAt(szYorn[j], k) == '1')//遇到字符1, 画短线; 0画长线
{
drawBlack(x*lineWidth + BARCODE_X, BARCODE_Y, x*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
}
else
{
drawWhite(x*lineWidth + BARCODE_X, BARCODE_Y, x*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
}
}
}
}
//画条形码中间
void drawMiddle()
{
int middleX1Pix = 54;
drawWhite((middleX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, middleX1Pix*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
drawBlack((middleX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, middleX1Pix*lineWidth + BARCODE_X, BARCODE_Y + longLine);
drawWhite((middleX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, middleX1Pix*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
drawBlack((middleX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, middleX1Pix*lineWidth + BARCODE_X, BARCODE_Y + longLine);
drawWhite((middleX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, middleX1Pix*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
}
//画条形码右边
void drawRight()
{
int i, j, k;
//用于存储左边的6位数的编码
char* szYorn[7] = {0};
for(i = 7; i <= 12; ++i)
{
char chTemp2;
chTemp2 = toChar(code[i]);
char chTemp3[3];
chTemp3[0] = chTemp2;
chTemp3[1] = 'C';
findandgetcode(chTemp3);
szYorn[i-7] = savecode;
}
int x;
for(int j = 0; j < 6; ++j)
{
for(k = 0; k < 7; ++k)
{
x = 59 + j*7 + k;
if(GetAt(szYorn[j], k) == '1')//遇到字符1, 画短线; 0画长线
{
drawBlack(x*lineWidth + BARCODE_X, BARCODE_Y, x*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
}
else
{
drawWhite(x*lineWidth + BARCODE_X, BARCODE_Y, x*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
}
}
}
}
//画条形码结束部分
void drawEnd()
{
int endX1Pix = 101;
int i;
drawBlack((endX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, endX1Pix*lineWidth + BARCODE_X, BARCODE_Y + longLine);
drawWhite((endX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, endX1Pix*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
drawBlack((endX1Pix++)*lineWidth + BARCODE_X, BARCODE_Y, endX1Pix*lineWidth + BARCODE_X, BARCODE_Y + longLine);
for(i = 104; i <= 112; ++i)
{
drawWhite(i*lineWidth + BARCODE_X, BARCODE_Y, i*lineWidth + BARCODE_X, BARCODE_Y + shortLine);
}
}
//画数字
void drawNumber()
{
int i,j;
char No[13] = {0};
char num = 0;
for(int i=0;i<=12;i++)
{
No[i] = toChar(code[i]);
}
num = No[0];
lcd_draw_text(&num, 2*lineWidth + BARCODE_X, 5 + BARCODE_Y + shortLine, 0.5, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
for(i = 1; i <= 6; i++)
{
num = No[i];
lcd_draw_text(&num, 7*lineWidth + 13 * i + BARCODE_X, 5 + BARCODE_Y + shortLine, 0.5, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
}
for(j = 7; j <= 12; j++)
{
num = No[j];
lcd_draw_text(&num, 15*lineWidth + 13 * j + BARCODE_X, 5 + BARCODE_Y + shortLine, 0.5, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
}
}
//打印条形码
void printbarcode()
{
lcd_drawfillrect(LCD_COLOR_WHITE, 0, 0, 240, 150);
drawStart();
drawLeft();
drawMiddle();
drawRight();
drawEnd();
//drawNumber();
}
- 1
- 2
前往页