QR码和PDF417 For STM8

2019-12-23 18:35发布

本帖最后由 linjunxiong 于 2014-10-29 22:42 编辑

    二维码,种类比较多,常见的有QR码和PDF417,比一维码可以存储的信息多了很多。很多应用还是可以应用到。
了解具体原理和历史可以维基下,
无标题.png (138 KB, 下载次数: 0) 下载附件 不同版本和纠错 2014-10-29 22:27 上传
STM8移植Qrduino输出任意版本和纠错级别.rar (116.26 KB, 下载次数: 145) 2014-10-29 22:38 上传 点击文件名下载附件
STM8移植Qrduino输出任意版本和纠错级别


PDF417

pdf417_enc  http://sourceforge.jp/projects/sfnet_pdf417encode/releases/

Zint Barcode Generator http://sourceforge.net/projects/zint/
这个在单片机上的参考就真的没能G到,索性直接找的PC端的移植下,整体的流程基本差不多,只是差最后一步整理把它打印出来,一直想把它弄出来,就是没那个动力,有兴趣的可以了解下。
STM8 移植PDF417_ENC.rar (835.78 KB, 下载次数: 113) 2014-10-29 22:40 上传 点击文件名下载附件
STM8 移植PDF417_ENC


代码些许乱,懒得去整理它了。。。多少懒


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
45条回答
linjunxiong
1楼-- · 2019-12-25 08:27
 精彩回答 2  元偷偷看……
XUEPENGBIN
2楼-- · 2019-12-25 14:17
linjunxiong 发表于 2015-6-26 18:52
framebase[] 是固定的;

    你可以试下

我是这样的。
后来用你传的文件里边有一个LCD.C 文件 里边的算法显示。显示正常了。但是扫描不出来。。
下边使用的 定义 3-1的

unsigned char neccblk1 = 1;
unsigned char neccblk2 = 0;
unsigned char datablkw = 55;
unsigned char eccblkwid = 15;
unsigned char VERSION = 3;
unsigned char ECCLEVEL = 1;
unsigned char WD = 29;
unsigned char WDB = 4;
unsigned char strinbuf[116]="http://www.amobbs.com;http://bbs.yleee.com.cn";
//unsigned char strinbuf[116]="abcdefghijklmnopqrst";
unsigned char qrframe[600];
unsigned char rlens[30];


unsigned char framebase[]  = {
0xfe,0x00,0x03,0xf8,
0x82,0x00,0x02,0x08,
0xba,0x00,0x02,0xe8,
0xba,0x00,0x02,0xe8,
0xba,0x00,0x02,0xe8,
0x82,0x00,0x02,0x08,
0xfe,0xaa,0xab,0xf8,
0x00,0x00,0x00,0x00,
0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x02,0x00,0x0f,0x80,
0x00,0x80,0x08,0x80,
0xfe,0x00,0x0a,0x80,
0x82,0x00,0x08,0x80,
0xba,0x00,0x0f,0x80,
0xba,0x00,0x00,0x00,
0xba,0x00,0x00,0x00,
0x82,0x00,0x00,0x00,
0xfe,0x00,0x00,0x00,
};

unsigned char framask[]  = {
0xff,0xff,0xff,0xff,
0xff,0xf8,0x10,0x04,
0x00,0x80,0x08,0x00,
0x40,0x01,0x00,0x02,
0x00,0x02,0x00,0x01,
0x00,0x00,0x40,0x00,
0x08,0x00,0x00,0x80,
0x03,0xff,0x00,0x1f,
0xfc,0x00,0x7f,0xf8,
0x00,0xff,0xf8,0x00,
0xff,0xfc,0x00,0x01,
0xff,0x00,0x00,0x3f,
0xe0,0x00,0x03,0xfe,
0x00,0x00,0x00,
};
下边是从 LCD.C 里边移植过来的 代码

QRBIT.H 里边有定义  红 {MOD}的是我参考  QRBIT 修改的

#define QRBIT(x,y) ( ( qrframe[((x)>>3) + (y) * WDB] >> (7-((x) & 7 ))) & 1 )
#define QRBITB(x,y) ( ( framebase[((x)>>3) + (y) * WDB] >> (7-((x) & 7 ))) & 1 )
#define SETQRBIT(x,y) qrframe[((x)>>3) + (y) * WDB] |= 0x80 >> ((x) & 7)
#define TOGQRBIT(x,y) qrframe[((x)>>3) + (y) * WDB] ^= 0x80 >> ((x) & 7)


void DrwBit(unsigned char x1,unsigned char y1,unsigned char X_Long,unsigned char Y_Long,unsigned char *Data)
{
          unsigned char Y_Cout,X_Cout,x,y;
          unsigned char i,k,b,t;
          
         X_Long=X_Long;          
   X_Cout = 0;
         Y_Cout = 0;       
                t = 0;
    b = 0;

   for(y=0;y<Y_Long;y++)
                 {
      for(x=0;x<(X_Long*8);x++)
         {
                                          
            b >>= 1;
            if( x <( Y_Long) && y < (Y_Long))
                                                  
            if( QRBITB(Y_Long-x-1,y) )   b |= 0x80;
            if( ++t > 7 )
                  {
                    t = 0;
                                                                                PutByte(x/8+x1,y+y1,b);

                                                                                X_Cout ++;
                                                                                if(X_Cout == X_Long)
                                                                                {
                     X_Cout = 0;
                                                                                 Y_Cout ++;
                                                                                }                                                                                                 
                    b = 0;
                  }
              
        }
}
}

直接用  下边函数显示  framebase 就是不正常的图片

void DrwBit2(unsigned char x1,unsigned char y1,unsigned char X_Long,unsigned char Y_Long,unsigned char *Data)
{
        unsigned char x,y;
        for(y=0;y<Y_Long;y++)
        {
          for(x=0;x<X_Long;x++)
                 {
                  PutByte(x,y,*Data);
                  Data ++;
                  }
         }
}
XUEPENGBIN
3楼-- · 2019-12-25 17:53
linjunxiong 发表于 2015-6-26 18:52
framebase[] 是固定的;

    你可以试下

你 main 函数里边的那种方式 我观察了下 移植过来 显示好像不怎么对劲。。
linjunxiong
4楼-- · 2019-12-25 22:32
生成数据在qrframe,不在franebase,还有strinbuf试下弄小些,不同等级可以包含的字节不同的,
XUEPENGBIN
5楼-- · 2019-12-26 02:47
本帖最后由 XUEPENGBIN 于 2015-6-27 11:45 编辑
linjunxiong 发表于 2015-6-27 06:35
生成数据在qrframe,不在franebase,还有strinbuf试下弄小些,不同等级可以包含的字节不同的, ...


谢谢你的指导,现在终于可以正确显示了。

二维码4-7.jpg (387.58 KB, 下载次数: 0)

下载附件

2015-6-27 11:44 上传



zyw19987
6楼-- · 2019-12-26 08:24
 精彩回答 2  元偷偷看……

一周热门 更多>