单片机C语言生成二维码[放大]
void draw2D() //用来画二维码的 主要是里面的DrawDot(y,x);这句话是用来在12864上画点的
{
//有自己的屏幕的打点函数也可以直接移植
char nn,mm;
for(mm=0;mm<(21/8);mm++)
{
for(nn=0;nn<21;nn++)
{
m_byModuleData[mm][nn]=~(m_byModuleData[mm*8+7][nn]|(m_byModuleData[mm*8+6][nn]<<1)|(m_byModuleData[mm*8+5][nn]<<2)|(m_byModuleData[mm*8+4][nn]<<3)|(m_byModuleData[mm*8+3][nn]<<4)|(m_byModuleData[mm*8+2][nn]<<5)|(m_byModuleData[mm*8+1][nn]<<6)|(m_byModuleData[mm*8+0][nn]<<7));
}
}
for(nn=0;nn<21;nn++)
{
m_byModuleData[mm][nn]=~((m_byModuleData[mm*8+4][nn]<<3)|(m_byModuleData[mm*8+3][nn]<<4)|(m_byModuleData[mm*8+2][nn]<<5)|(m_byModuleData[mm*8+1][nn]<<6)|(m_byModuleData[mm*8+0][nn]<<7));
}
dis_img(2,20,3,21,(uint8_t *)m_byModuleData);
}
调用方式:
EncodeData("1234"); //生成二维码数据 内容保存在(m_byModuleData[x][y];数组中 //数组内容为0 1 1是黑 0是白
dis_clear(0,0,16,296,0xFF);
draw2D();
dis_refresh();
这里在SYD8811上测试成功,源码如下:https://download..net/download/chengdong1314/86509102
二维码的放大
生成的二维码是21X21的点阵,但是在实际项目中需要66X66的点阵,最终采用了吧21X21放到成63X63也就是放大3倍的方案,放大算法如下:
char nn,mm,kk=0;;
sprintf(code,"MAC:%02x%02x%02x%02x%02x%02x",dev_addr.addr[0],dev_addr.addr[1],dev_addr.addr[2],dev_addr.addr[3],dev_addr.addr[4],dev_addr.addr[5]);
code[sizeof(code)-1]=0;
dbg_printf("qrcode:%s",code);
EncodeData(code); //生成二维码数据 内容保存在(m_byModuleData[x][y];数组中 //数组内容为0 1 1是黑 0是白
for(mm=0;mm<8;mm++)
{
for(nn=0;nn<MAX_MODULESIZE;nn++)
{
if(mm%3==0)
{
byModuleData[mm][nn]=~(m_byModuleData[kk+2][nn]|(m_byModuleData[kk+2][nn]<<1)|(m_byModuleData[kk+1][nn]<<2)|(m_byModuleData[kk+1][nn]<<3)|(m_byModuleData[kk+1][nn]<<4)|(m_byModuleData[kk+0][nn]<<5)|(m_byModuleData[kk+0][nn]<<6)|(m_byModuleData[kk+0][nn]<<7));
}
else if(mm%3==1)
{
byModuleData[mm][nn]=~(m_byModuleData[kk+2][nn]|(m_byModuleData[kk+1][nn]<<1)|(m_byModuleData[kk+1][nn]<<2)|(m_byModuleData[kk+1][nn]<<3)|(m_byModuleData[kk+0][nn]<<4)|(m_byModuleData[kk+0][nn]<<5)|(m_byModuleData[kk+0][nn]<<6)|(m_byModuleData[kk-1][nn]<<7));
}
else if(mm%3==2)
{
byModuleData[mm][nn]=~(m_byModuleData[kk+1][nn]|(m_byModuleData[kk+1][nn]<<1)|(m_byModuleData[kk+1][nn]<<2)|(m_byModuleData[kk+0][nn]<<3)|(m_byModuleData[kk+0][nn]<<4)|(m_byModuleData[kk+0][nn]<<5)|(m_byModuleData[kk-1][nn]<<6)|(m_byModuleData[kk-1][nn]<<7));
}
}
if(mm%3==0)
{
kk+=3;
}
else if(mm%3==1)
{
kk+=3;
}
else if(mm%3==2)
{
kk+=2;
}
}
void dis_img_zoom3(unsigned char x,unsigned short y,unsigned char w,unsigned short h,const unsigned char *data)
{
unsigned int row, col;
dis_set_window(x,y,w,h*3);
for(col=0; col<h; col++)
{
for(row=0; row<w; row++)
{
SPI4W_WRITEDATA(data[col*w+row]);
SPI4W_WRITEDATA(data[col*w+row]);
SPI4W_WRITEDATA(data[col*w+row]);
}
}
}
