打印
[活动专区]

【AT-START-F425测评】串口printf + 二维码生成和串口打印

[复制链接]
1169|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
    最近在项目上想用上二维码生成并在显示屏显示,于是就找了些关于二维码生成的资料和程序,在这里也将二维码的程序加入到PRINTF例程里并直接通过串口将二维码打印了出来进行了测试。
    首先,打开printf工程,将下图中的QR_Encode.c加入工程
   
    1.readme.txt 文档里有相关的说明,如果想更多了解相关内容,可以查看该文档。
    二维码生成的程序用起来也很容易,实际工程使用程序如下
#include "at32f425_board.h"
#include "at32f425_clock.h"
#include "QR_Encode.h"

/** @addtogroup AT32F425_periph_examples
  * @{
  */
  
/** @addtogroup 425_USART_printf USART_printf
  * @{
  */

__IO uint32_t time_cnt = 0;

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
        unsigned char i = 0;
        unsigned char x,y;
        char p[12]="www.21ic.com";
  system_clock_config();
  at32_board_init();
  uart_print_init(115200);

  /* output a message on hyperterminal using printf function */
  printf("usart printf example: retarget the c library printf function to the usart\r\n");

  while(1)
  {
    printf("usart printf counter: %u\r\n",time_cnt++);
    delay_sec(1);
                if(!i)
                {
                        EncodeData(p);    //Generate QR code
                        i++;
                }
               
                while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                usart_data_transmit(PRINT_UART, 0x0d);
                while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                usart_data_transmit(PRINT_UART, 0x0a);
                for(x=0;x<MAX_MODULESIZE;x++)
                {
                        for(y=0;y<MAX_MODULESIZE;y++)
                        {
                                if(m_byModuleData[x][y])
                                {
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0xa8);
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0x80);
                                }
                                else
                                {
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, ' ');
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, ' ');
                                }
                                if(y==MAX_MODULESIZE-1)
                                {
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0x0d);
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0x0a);
                                }
                               
                        }
                }
               
  }
}
     只需使用图中所示的程序行即可直接生成二维码数据
     
    二维码数据全部存在 m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE] 数据里面,数组里每个数据 是 非0即1 的值。
   至于显示么,就用串口打印出来显示一下看看是否正常吧

for(x=0;x<MAX_MODULESIZE;x++)
                {
                        for(y=0;y<MAX_MODULESIZE;y++)
                        {
                                if(m_byModuleData[x][y])
                                {
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0xa8);
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0x80);
                                }
                                else
                                {
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, ' ');
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, ' ');
                                }
                                if(y==MAX_MODULESIZE-1)
                                {
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0x0d);
                                        while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
                                        usart_data_transmit(PRINT_UART, 0x0a);
                                }
                               
                        }
                }
   打印方法是将1的数据打印输出“■” ,0的数据打印输出“ ”(空格),实际输出的效果如下   
    使用手机扫描正常,之后加上LCD显示屏就可以显示二维码了。
    但是要在LCD上显示二维码要注意的是,直接显示的话,二维码太小了,需要对二维码进行等比放大后再显示,比如放大2倍或3倍,具体大小根据你的显示屏分辨进行调整到合适。
    下面是工程代码,只需复制替换例程里的文件即可进行测试
    printf.rar (5.12 MB)

使用特权

评论回复
沙发
豌豆爹| | 2022-3-23 09:49 | 只看该作者
这二维码生成看起来也挺简单的

使用特权

评论回复
板凳
muyichuan2012| | 2022-3-23 17:35 | 只看该作者
这么强

使用特权

评论回复
地板
usysm| | 2022-12-5 22:40 | 只看该作者
这个二维码是怎么显示的?              

使用特权

评论回复
5
uptown| | 2022-12-6 14:40 | 只看该作者
oled好像只是能生成小像素的,怎么生成大的图片?

使用特权

评论回复
6
juliestephen| | 2022-12-6 16:40 | 只看该作者
动态生成图片的吗?              

使用特权

评论回复
7
weifeng90| | 2022-12-8 17:52 | 只看该作者
这个想法不错,简单实用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

1401

帖子

2

粉丝