2564|0

244

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[GD32E231 DIY大赛]第四篇:汇总贴 [复制链接]

设计名称:动态二维码显示器

 

作品照片:

 

作品简介:

生活中二维码随处可见,各种支付,收款,广告,推广等都有二维码的身影,因为手机都可以扫码,大大方便了人们的生活。借助手机扫码,利用gd32ee231开发板的硬件资源,设计一款动态二维码显示器,用户定制并显示设置的信息,方便大家随时扫码,而且可以随时更改信息,灵活方便,很适合广告推广,收款付款等场景。

 

所需外设:SPI接口LCD显示屏

 

开发板硬件连接如下图:

 

各部分功能介绍:

1.PC通过串口连接开发板串口,同时,开发板通过SPI连接LCD显示屏。

2.MCU烧录固件,PC通过串口shell输入命令和二维码数据后,MCU会将数据生成二维码并显示在LCD显示屏上面。

3.MCU固件其实就是把串口数据转换成01的二维码数据,然后送给显示屏,显示屏再按照设置好的像素点,把01用白色和黑色分别显示出来,就是我们看到的二维码了。

4.最后,用手机微信扫描二维码,即可显示出来PC输入的数据。

 

串口源码:

void usart0_config(void)

{

    /* enable USART GPIO clock */

    rcu_periph_clock_enable(RCU_GPIOA);

 

    /* enable USART clock */

    rcu_periph_clock_enable(RCU_USART0);

 

    /* connect port to USARTx_Tx */

    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);

 

    /* connect port to USARTx_Rx */

    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);

 

    /* configure USART Tx as alternate function push-pull */

    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);

    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);

 

    /* configure USART Rx as alternate function push-pull */

    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);

    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

 

 

    /* USART configure */

    usart_deinit(USART0);

    usart_baudrate_set(USART0,    115200);

    usart_word_length_set(USART0, USART_WL_8BIT);

    usart_stop_bit_set(USART0,    USART_STB_1BIT);

    usart_parity_config(USART0,   USART_PM_NONE);

 

    usart_receive_config(USART0,  USART_RECEIVE_ENABLE);

    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

 

    /* enable the TIMER5 interrupt */

    nvic_irq_enable(USART0_IRQn, 0);

 

    /* USART0 INT_RBNE enable */

    usart_interrupt_enable(USART0, USART_INT_RBNE);

 

    /* enable USART0 */

    usart_enable(USART0);

}

 

LCD接口管脚初始化源码:

void gpio_init(void)

{

         /* enable the LED1 GPIO clock */

    rcu_periph_clock_enable(RCU_GPIOA);

         /* configure LED1,2,3,4 GPIO port */

    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_11|GPIO_PIN_12);

    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_11|GPIO_PIN_12);

    /* reset LED1 GPIO pin */

    //gpio_bit_reset(GPIOA,GPIO_PIN_7);

         gpio_bit_set(GPIOA, GPIO_PIN_7);         //led1

         gpio_bit_set(GPIOA,GPIO_PIN_11);        //led3

         //gpio_bit_set(GPIOA,GPIO_PIN_12);    //led4

 

         //PA1,PA2,PA3,PA4,PA5,PA6

         gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);

    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);

         gpio_bit_set(GPIOA, GPIO_PIN_1);

         gpio_bit_set(GPIOA, GPIO_PIN_2);

         gpio_bit_set(GPIOA, GPIO_PIN_3);

         gpio_bit_set(GPIOA, GPIO_PIN_4);

         gpio_bit_set(GPIOA, GPIO_PIN_5);

         gpio_bit_set(GPIOA, GPIO_PIN_6);

 

         //spi0 gpio init

         //SPI0_SCK-PB3,SPI0_MISO-PB4,SPI0_MOSI-PB5

         rcu_periph_clock_enable(RCU_GPIOB);

         gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_3|GPIO_PIN_5);

         gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);

    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3|GPIO_PIN_5);

 

         //spi1 gpio init

         //SPI1_SCK-PB13,SPI1_MISO-PB14,SPI1_MOSI-PB15

         gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);

         gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);

    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);

 

         //PB0,PB1,CS-PB6,RS-PB7

         gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7);

    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7);

         gpio_bit_set(GPIOB, GPIO_PIN_0);

         gpio_bit_set(GPIOB, GPIO_PIN_1);

         gpio_bit_set(GPIOB, GPIO_PIN_6);

         gpio_bit_set(GPIOB, GPIO_PIN_7);

 

         //PB8,PB10,PB11,PB12

         gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);

    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);

         gpio_bit_reset(GPIOB, GPIO_PIN_8);

         gpio_bit_set(GPIOB, GPIO_PIN_10);

         gpio_bit_set(GPIOB, GPIO_PIN_11);

         gpio_bit_reset(GPIOB, GPIO_PIN_12);

 

         //TP_CS-PA1,RST-PA2

         gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_1|GPIO_PIN_2);

    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2|GPIO_PIN_2);

         gpio_bit_set(GPIOA, GPIO_PIN_1);

         gpio_bit_set(GPIOA, GPIO_PIN_2);

}

 

SPI接口源码:

void lcd_port_init(void)

{

         spi_parameter_struct spi_dev;

        

         rcu_periph_clock_enable(RCU_SPI0);

         rcu_periph_clock_enable(RCU_SPI1);

 

         spi_i2s_deinit(SPI0);

         spi_dev.device_mode = SPI_MASTER;

         spi_dev.trans_mode = SPI_TRANSMODE_FULLDUPLEX;

         spi_dev.frame_size = SPI_FRAMESIZE_8BIT;

         spi_dev.nss = SPI_NSS_SOFT;

         spi_dev.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;

         spi_dev.prescale = SPI_PSC_4;

         spi_dev.endian = SPI_ENDIAN_MSB;

         spi_init(SPI0, &spi_dev);

         spi_enable(SPI0);

 

}

 

LCD显示源码:

void LCD_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 color)

{         

         u16 i,j;

 

         for(i=sy; i<=ey; i++){

                   for(j=sx; j<=ex; j++){

                            LCD_SetPoint(j, i, color);

                   }

         }

}

 

二维码生成并显示的源码:

void show_qrcode(u16 x, u16 y, u16 p, u8 *qrcode_data)

{

         u8 i,j;

 

         EncodeData((char *)qrcode_data);

 

         for(i=0; i<m_nSymbleSize; i++)

         {

                   for(j=0; j<m_nSymbleSize; j++)

                   {

                            if(m_byModuleData[j]==1){

                                     LCD_Fill(x+p*i, y+p*j, x+p*(i+1)-1, y+p*(j+1)-1, Black);

                            }

                   }

         }

}

 

测试生成二维码并显示的效果:

 

1560860939549.mp4

5.96 MB, 下载次数: 467

测试视频

gd32e231_qrcoder_note.doc

294.5 KB, 下载次数: 7

作品文档

此帖出自GD32 MCU论坛
点赞 关注(1)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表