单片机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]);
		}
	}
}
经验分享 程序员 微信小程序 职场和发展