前面在做MT2523 UI显示的时候需要用到二维码,于是上网查了很多资料。
移植了二维码生成的C语言库到自己的项目。然后调用接口生成二维码数据。
最后显示到自己的LCD上面。
如果不知道库的可以查看博客:https://blog.csdn.net/qq_21475601/article/details/71480028#commentsedit
里面介绍了如何使用代码库文件,需要自己移植。文章写的很好。
本文假设读者已经移植完成,只需要显示。
我自己的在显示的时候一开始显示很小。原因是屏幕像素比较密,像素点很小,需要自己实现放大显示。
思路:放大2倍,4个点的正方形,3倍9个点,4倍16个点,以此类推。。。
每个单片机显示接口函数不一样,下面是我的demo代码
void QRcode_screen_show(void)
{
//我的屏幕是320*320,start_x,start_y代表开始的坐标,block_width代表每个二维码点的宽度(pixel)
uint32_t start_x = 10,start_y = 10,block_width = 12;
uint8_t i = 0,j = 0,k = 0;
bool retState = false;
//QRcode *code;
//测试的字符串
char *p = "www.baidu.com";
//更新屏幕前先把LCD显示全黑背景,起始(0,0)->(319,319),填充0x00代表黑色
gdi_draw_filled_rectangle(0,0,319,319,0x00);
//调用生成二维码的核心接口,返回成功判断
retState = EncodeData(p);
LOG_D(xjk_screen,"retState =%d,m_nSymbleSize=%d\n",retState,m_nSymbleSize);
//如果成功
if(retState) {
/*根据全局变量m_nSymbleSize(生成二维码的宽度),计算出放大之后的每点的像素宽度block_width,为了适配LCD尺寸*/
block_width = (320 - 2*start_x) / m_nSymbleSize;
for (i = 0; i < m_nSymbleSize;i++) {
for (j = 0; j < m_nSymbleSize;j++) {
if((uint8_t)m_byModuleData[i][j] & 0x01) {
/*画图,画点格子,起(start_x+j*block_width),(start_y+i*block_width),止于:(start_x+block_width+j*block_width),(start_y+block_width+i*block_width),最后一位为1填充黑色,反之白色0xffff*/
gdi_draw_filled_rectangle((start_x+j*block_width),(start_y+i*block_width),
(start_x+block_width+j*block_width),(start_y+block_width+i*block_width),0x00);
} else {
gdi_draw_filled_rectangle((start_x+j*block_width),(start_y+i*block_width),
(start_x+block_width+j*block_width),(start_y+block_width+i*block_width),0xffff);
}
}
}
gdi_lcd_update_screen(0, 0, 320, 320);
}
LOG_I(xjk_screen,"settings_main_screen_show \n");
}
当然每个系统显示接口不一样,高级点的单片机应该都有自带画图的接口,只需要用到画矩形的接口即可,就算没有也可以自己封装draw_filled_rectangle类似的函数。