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