C/C++ 二维码的实现,并放大显示。

前面在做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类似的函数。

猜你喜欢

转载自blog.csdn.net/u013255351/article/details/81560404