[GD32E231 DIY大赛]第四篇:汇总贴
[复制链接]
设计名称:动态二维码显示器
作品照片:
作品简介:
生活中二维码随处可见,各种支付,收款,广告,推广等都有二维码的身影,因为手机都可以扫码,大大方便了人们的生活。借助手机扫码,利用gd32ee231开发板的硬件资源,设计一款动态二维码显示器,用户定制并显示设置的信息,方便大家随时扫码,而且可以随时更改信息,灵活方便,很适合广告推广,收款付款等场景。
所需外设:SPI接口LCD显示屏
开发板硬件连接如下图:
各部分功能介绍:
1.PC通过串口连接开发板串口,同时,开发板通过SPI连接LCD显示屏。
2.给MCU烧录固件,PC通过串口shell输入命令和二维码数据后,MCU会将数据生成二维码并显示在LCD显示屏上面。
3.MCU固件其实就是把串口数据转换成0和1的二维码数据,然后送给显示屏,显示屏再按照设置好的像素点,把0和1用白色和黑色分别显示出来,就是我们看到的二维码了。
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);
}
}
}
}
测试生成二维码并显示的效果:
|