最近在项目上想用上二维码生成并在显示屏显示,于是就找了些关于二维码生成的资料和程序,在这里也将二维码的程序加入到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, 下载次数: 43)
|