当前位置: 首页 > news >正文

基于ILI9341液晶屏+STM32U5单片的显示试验

试验要求:

1、通过串口,下发两个命令 STR和PIC;

2、STR模式:

        (1)串口输入什么,屏幕上显示什么

        (2)如果屏幕满,自动下滚

        (3)输入回车,进行换行

        (4)输入PIC切换到PIC模式

3、PIC模式:

        (1)快速连续播放内置的单片机图片(以达到动图效果)

        (2)串口输入STR切换至STR模式 

1、运行效果展示

1.1 STR模式(最终运行效果)

串口输入

LCD液晶屏显示

2.1 PIC模式(GIF图片效果,并非最终运行效果)

1、配置工程

1.1、通过原理图找对应的功能引脚(SPI+UART)

spi

uart

1.2、配置spi和uart

略。

1.3、找ILI9341驱动库并修改

主要是注意修改对应的管脚功能,例如下图,需要改成实际使用的管脚。

2、STR模式的准备工作

2.1、字模原理及验证

原理:通过以下网址学习

26. LCD—液晶显示中英文 — [野火]STM32 HAL库开发实战指南——基于F103系列开发板 文档

通过工具生成的字符A和B的字模

/* 16X32的字模: 大写 */
unsigned char capLetterSet[2][64]={{// A 0x41  //0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x02,0xC0,0x02,0xC0,0x06,0xC0,0x04,0xE0,0x04,0x60,0x04,0x60,0x04,0x60,0x0C,0x70,0x08,0x30,0x08,0x30,0x08,0x30,0x1F,0xF8,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x1C,0x30,0x0C,0x20,0x0C,0x20,0x0C,0x60,0x0E,0xF8,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{// B 0x42 //0x00,0x00,0x00,0x00,0x3F,0xE0,0x18,0x38,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x18,0x18,0x30,0x1F,0xE0,0x18,0x30,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x38,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};

普通的C工程验证:

 

void Printf_Charater(unsigned char* matrix, int matrixLen)
{int i,j;unsigned char kk;/*i用作行计数*/for ( i=0; i<32; i++) {/*j用作一字节内数据的移位计数*//*一行像素的第一个字节*/for (j=0; j<8; j++) {/*一个数据位一个数据位地处理*/kk = matrix[2*i] << j ;  //左移J位if ( kk & 0x80) {printf("*"); //如果最高位为1,输出*号,表示笔迹} else {printf(" "); //如果最高位为0,输出空格,表示空白}}/*一行像素的第二个字节*/for (j=0; j<8; j++) {kk = matrix[2*i+1] << j ;  //左移J位if ( kk & 0x80) {printf("*"); //如果最高位为1,输出*号,表示笔迹} else {printf(" "); //如果最高位为0,输出空格,表示空白}}printf("\n");    //输出完一行像素,换行}printf("\n\n");     //一个字输出完毕
}void screen_print(char* str){for(int i=0;str[i]!=0;i++){char ch=str[i];unsigned char *charater_matrix=capLetterSet[ch-'A'];Printf_Charater(charater_matrix, 64);}
}

结论:本试验中采用16x32的字模。按照我的理解,就是把对应的字符转换成字模,液晶屏显示是,以16位为1行,每位代表这个像素点显示还是不显示(1-显示,0-不显示),共32行。本案例中,每个字节的高位代表较小的列号(MSP)

3、源码

3.1、main.c


int fputc(int ch, FILE * fp){HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);return ch;
}char uart_buff[128]={0};
int uart_buff_index=0;
char uart_ch;
typedef enum{MODE_STR,MODE_PIC
}mode_t;
mode_t mode;extern unsigned char gImages[5][153600];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){//只处理串叿 1 的数据中斿if(huart != &huart1){HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart_ch, 1);return;}uart_buff[uart_buff_index++]=uart_ch;printf("%c",uart_ch);if(uart_ch != '\r'){HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart_ch, 1);return;}uart_buff[uart_buff_index-1]=0;//将\r替换成\0printf("串口收到数据:[%s],uart_buff_index=[%d]!!!\n\r", uart_buff, uart_buff_index);uart_buff_index=0;//重新计数if(strcmp("STR", uart_buff)==0){//字符串模式 STRprintf("当前模式:STR(字符串显示模式(STR)\n\r");HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart_ch, 1);mode = MODE_STR;//清屏return;}if(strcmp("PIC", uart_buff)==0){//图片模式printf("当前模式:PIC(图片显示模式)\n\r");HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart_ch, 1);//mode = MODE_PIC;//清屏return;}if(mode == MODE_STR){//显示uart_buff的内容,并且换行printf("STR模式调用, uart_buff=[%s]\n\r", uart_buff);LCD_str_print(uart_buff);LCD_str_print("\n");}//HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart_ch, 1);
}int main(void)
{HAL_Init();SystemClock_Config();SystemPower_Config();MX_GPIO_Init();MX_ICACHE_Init();MX_USART1_UART_Init();MX_SPI1_Init();/* USER CODE BEGIN 2 */ILI9341_Init();	HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart_ch, 1);int i=0;while (1){if(mode == MODE_PIC){//图片显示模式LCD_picture(gImages[i%5]);i++;HAL_Delay(25);}else{HAL_Delay(1000);}}
}/* 其他代码是cube自动生成的,略... */

3.2、LCD_font.c 字模集合(26个大写英文字母、*和空格)

#include "LCD_str.h"unsigned char starMatrix[64]={//*0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,// * //0x00,0x80,0x00,0x80,0x00,0x80,0x40,0x81,0x20,0x82,0x10,0x84,0x08,0x88,0x04,0x90,0x02,0xA0,0x01,0xC0,0x02,0x20,0x04,0x10,0x08,0x08,0x10,0x04,0x20,0x02,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};unsigned char spaceMatrix[64]={//空格0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};unsigned char font_lowChSet[26][64]={//A-0x41{0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x02,0xC0,0x02,0xC0,0x06,0xC0,0x04,0xE0,// A //0x04,0x60,0x04,0x60,0x04,0x60,0x0C,0x70,0x08,0x30,0x08,0x30,0x08,0x30,0x1F,0xF8,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x1C,0x30,0x0C,0x20,0x0C,0x20,0x0C,0x60,0x0E,0xF8,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3F,0xE0,0x18,0x38,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,// B //0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x18,0x18,0x30,0x1F,0xE0,0x18,0x30,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x38,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x03,0xE4,0x07,0x34,0x0E,0x1C,0x1C,0x0C,0x18,0x06,0x38,0x06,// C //0x38,0x02,0x30,0x02,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x02,0x38,0x02,0x18,0x06,0x18,0x04,0x0E,0x0C,0x07,0x38,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3F,0xE0,0x18,0x30,0x18,0x18,0x18,0x1C,0x18,0x0C,0x18,0x0C,// D //0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x18,0x18,0x30,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3F,0xFC,0x18,0x0C,0x18,0x04,0x18,0x04,0x18,0x00,0x18,0x00,// E //0x18,0x00,0x18,0x00,0x18,0x08,0x18,0x08,0x18,0x18,0x1F,0xF8,0x18,0x18,0x18,0x08,0x18,0x08,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x04,0x18,0x04,0x18,0x0C,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3F,0xFC,0x18,0x0C,0x18,0x06,0x18,0x06,0x18,0x02,0x18,0x00,// F //0x18,0x00,0x18,0x00,0x18,0x08,0x18,0x08,0x18,0x18,0x1F,0xF8,0x18,0x18,0x18,0x08,0x18,0x08,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x03,0xE4,0x07,0x34,0x0E,0x1C,0x1C,0x0C,0x18,0x06,0x38,0x06,// G //0x30,0x02,0x30,0x02,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x3F,0x30,0x0E,0x30,0x0E,0x30,0x0E,0x38,0x0E,0x18,0x0E,0x1C,0x0E,0x0E,0x1E,0x07,0x30,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3E,0x3E,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,// H //0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x1F,0xFC,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x3C,0x1E,0x7E,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x0F,0xF0,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,// I //0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x0F,0xFC,0x01,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,// J //0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x60,0xC0,0x70,0xC0,0x70,0xC0,0x39,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3E,0x3E,0x18,0x18,0x18,0x10,0x18,0x20,0x18,0x20,0x18,0x40,// K //0x18,0x40,0x18,0x80,0x18,0x80,0x19,0x00,0x1E,0x00,0x1F,0x00,0x1B,0x80,0x19,0x80,0x18,0xC0,0x18,0xC0,0x18,0x60,0x18,0x70,0x18,0x30,0x18,0x18,0x18,0x1C,0x18,0x0C,0x18,0x0E,0x3E,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x7F,0x00,0x3C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,// L //0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x04,0x18,0x04,0x18,0x0C,0x18,0x1C,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x78,0x07,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x34,0x16,0x34,0x16,// M //0x34,0x16,0x36,0x36,0x32,0x26,0x32,0x26,0x32,0x26,0x33,0x66,0x31,0x46,0x31,0x46,0x31,0x46,0x31,0xC6,0x30,0x86,0x30,0x86,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x78,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3C,0x1E,0x1C,0x0C,0x1C,0x0C,0x1C,0x0C,0x1E,0x0C,0x1A,0x0C,// N //0x1A,0x0C,0x1B,0x0C,0x19,0x0C,0x19,0x0C,0x19,0x8C,0x18,0x8C,0x18,0x8C,0x18,0xCC,0x18,0x4C,0x18,0x4C,0x18,0x6C,0x18,0x2C,0x18,0x2C,0x18,0x3C,0x18,0x1C,0x18,0x1C,0x18,0x1C,0x3C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x18,0x30,0x0C,0x60,0x06,0x60,0x06,0x60,0x06,// O //0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x30,0x0C,0x18,0x18,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3F,0xF0,0x18,0x38,0x18,0x1C,0x18,0x0C,0x18,0x0C,0x18,0x0C,// P //0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x38,0x1F,0xF0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x03,0xC0,0x0E,0x70,0x1C,0x38,0x18,0x18,0x30,0x0C,0x30,0x0C,// Q //0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x33,0xCC,0x36,0x6C,0x1C,0x38,0x1C,0x39,0x0E,0x79,0x03,0xCF,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3F,0xF0,0x18,0x38,0x18,0x1C,0x18,0x0C,0x18,0x0C,0x18,0x0C,// R //0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x18,0x38,0x1F,0xE0,0x19,0xC0,0x18,0xE0,0x18,0xE0,0x18,0x70,0x18,0x70,0x18,0x38,0x18,0x38,0x18,0x1C,0x18,0x1C,0x18,0x0E,0x3C,0x0E,0x7E,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x03,0xE4,0x0E,0x74,0x1C,0x1C,0x18,0x0C,0x30,0x06,0x30,0x02,// S //0x30,0x02,0x38,0x00,0x18,0x00,0x1E,0x00,0x0F,0x00,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0C,0x40,0x0C,0x40,0x0C,0x60,0x0C,0x30,0x1C,0x38,0x38,0x2E,0x70,0x27,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x3F,0xFC,0x31,0x8C,0x21,0x84,0x61,0x86,0x41,0x82,0x01,0x80,// T //0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x7E,0x1F,0x3C,0x0E,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,// U //0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x18,0x04,0x0C,0x0C,0x06,0x18,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x7E,0x3F,0x38,0x0E,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,// V //0x0C,0x08,0x0C,0x08,0x0C,0x18,0x0C,0x10,0x0C,0x10,0x06,0x10,0x06,0x30,0x06,0x20,0x06,0x20,0x06,0x20,0x03,0x60,0x03,0x40,0x03,0x40,0x03,0x40,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0xFB,0xEF,0x61,0x82,0x61,0x82,0x61,0x82,0x61,0x82,0x31,0x86,// W //0x31,0x84,0x31,0x84,0x31,0x84,0x31,0xC4,0x31,0xC4,0x31,0xC4,0x31,0x44,0x12,0x48,0x1A,0x48,0x1A,0x48,0x1A,0x48,0x1A,0x68,0x1A,0x68,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0xFC,0x3F,0x70,0x0C,0x30,0x0C,0x38,0x08,0x18,0x10,0x1C,0x10,// X //0x0C,0x10,0x0E,0x20,0x06,0x20,0x07,0x40,0x03,0x40,0x03,0x80,0x01,0x80,0x01,0xC0,0x02,0xC0,0x02,0xC0,0x04,0x60,0x04,0x70,0x08,0x30,0x08,0x38,0x10,0x18,0x30,0x1C,0x30,0x0E,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x78,0x1F,0x30,0x06,0x18,0x04,0x18,0x04,0x18,0x04,0x0C,0x08,// Y //0x0C,0x08,0x0C,0x08,0x06,0x10,0x06,0x10,0x03,0x20,0x03,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x03,0xE0,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},{0x00,0x00,0x00,0x00,0x1F,0xFE,0x18,0x0C,0x10,0x0C,0x30,0x1C,0x20,0x18,0x20,0x18,// Z //0x00,0x38,0x00,0x30,0x00,0x70,0x00,0x60,0x00,0xE0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0x80,0x03,0x80,0x03,0x00,0x07,0x00,0x06,0x02,0x0E,0x02,0x0C,0x06,0x1C,0x04,0x1C,0x0C,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}};

3.3、LCD_str.c 字符和字符串的LCD打印

#include "LCD_str.h"
#include "bsp_ili9341_4line.h"
#include <stdio.h>void LCD_str_print(char* str){static int global_x=0;static int global_y=0;//for(int i=0;str[i]!=0;i++){if(str[i]=='\n'){global_x=0;global_y+=32;continue;}if(global_x+16 > 240){global_x=0;global_y+=32;}LCD_ch_show(global_x, global_y, str[i]);global_x+=16;}
}void LCD_ch_show(int start_x, int start_y, char ch){//获取对应字符的字模unsigned char* matrix;if(ch == ' '){//空格matrix = spaceMatrix;}else if(ch < 'A' || ch > 'Z'){matrix = starMatrix;}else{//A-Z之间matrix = font_lowChSet[ch-'A'];}//显示for(int row=0;row<32;row++){//16x32 每行2字节	从高位开始计数//第一个字符unsigned char mm=matrix[row*2];int col=0;for(col=0; col<8;col++){if(mm & 0x80){//显示 x在变, y没变,y代表row_HW_DrawPoint(col+start_x,row+start_y, GREEN);}mm <<= 1;}//第二个字符mm=matrix[row*2+1];for(col=8; col<16;col++){if(mm & 0x80){//显示 x在变, y没变,y代表row_HW_DrawPoint(col+start_x,row+start_y, GREEN);}mm <<= 1;}}}

3.4、LCD图片打印相关函数代码

void LCD_picture(unsigned char* pic)
{uint8_t temp[2] = {};//1. 给 ILI9341寄存器 写入 写数据命令ILI9341_WR_REG(0x2C);//屏幕中, 一个像素点占用两个字节uint32_t len = 2*240*320;uint32_t i = 0;while(i < len){temp[0] = pic[i];temp[1] = pic[i+1];HAL_SPI_Transmit(&hspi1,temp,2,0);i = i+2;}
}void LCD_pictures(unsigned char (*pics)[153600], int picPages)
{unsigned int i=0;while(1){LCD_picture(pics[i%picPages]);i++;}
}

4、小结

关于原理图:SPI的转接板的序号并没有对上,不知道是原理图有错还是我的查找方法不正确。

关于字模

        (1)本试验采用的16x32的字模,若是需要更小或更大的字体,需要重新生成字模或者通过某种算法扩展;

        (2)本试验仅支持A-Z的大写字母,如果需要更多的字符需要重新生成字模;

        (3)多字节的字符,例如中文,应该需要某种算法来找到对应的字模矩阵,没研究。

关于cube:关于cubeMax,重新生成导入到keil中,可能会有中文的乱码。还不知道怎么解决

关于烧录程序:本次的试验,用到的图片和字模都比较占用空间,目前是直接写到.c文件中,这样的话会占用较多的栈空间。按我的理解,应该放到硬盘中(例如flash),需要的时候再加载进来,单目前还不知道怎么使用flash。

相关文章:

基于ILI9341液晶屏+STM32U5单片的显示试验

试验要求&#xff1a; 1、通过串口&#xff0c;下发两个命令 STR和PIC&#xff1b; 2、STR模式&#xff1a; &#xff08;1&#xff09;串口输入什么&#xff0c;屏幕上显示什么 &#xff08;2&#xff09;如果屏幕满&#xff0c;自动下滚 &#xff08;3&#xff09;输入回车&a…...

Vue.js组件开发-如何使用moment.js

在Vue.js组件开发中&#xff0c;需要处理日期和时间&#xff0c;moment.js 是一个非常有用的库。moment.js 提供了丰富的API来解析、验证、操作和显示日期和时间。 步骤&#xff1a; 1. 安装moment.js 首先&#xff0c;需要通过npm或yarn安装moment.js。在项目根目录下运行以…...

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API&#xff0c;可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑&#xff0c;私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量&#xff0c;为了简化网络配置&#…...

全面掌握APT、Vim和GCC:Ubuntu软件管理与开发指南

文章目录 Ubuntu 软件包管理器Ubuntu 软件包管理的基本概念常用的软件包管理器APTAPT常用命令 vimVim 的基本概念Vim 的工作模式Vim 的基本操作 gcc/gUbuntu 安装 gcc / g编译知识使用方法动静态函数库 Ubuntu 软件包管理器 在 **Ubuntu** 系统中&#xff0c;软件包管理器用于…...

项目实战--网页五子棋(用户模块)(1)

接下来我将使用Java语言&#xff0c;和Spring框架&#xff0c;实现一个简单的网页五子棋。 主要功能包括用户登录注册&#xff0c;人机对战&#xff0c;在线匹配对局&#xff0c;房间邀请对局&#xff0c;积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …...

【Ubuntu与Linux操作系统:七、系统高级管理】

第7章 系统高级管理 7.1 Linux进程管理 进程是Linux系统中的基本运行单位&#xff0c;代表一个正在执行的程序。Linux通过进程管理实现多任务并发处理&#xff0c;支持用户高效利用系统资源。 1. 进程的基本概念&#xff1a; 进程状态&#xff1a;进程在运行过程中可能处于运…...

多线程面试相关

线程基础知识 线程与进程的区别 并行和并发的区别 创建线程的方式 Runnable和Callable有什么区别 run()方法和start()方法的区别 小结 线程包含哪些状态&#xff0c;各个状态之间如何变化 线程按顺序执行 notify()和notifyAll()的区别 Java中的wait方法和sleep方法的不同 如何…...

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…...

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 &#xff08;1&#xff09;元素选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器&#xff1a;必…...

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…...

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下&#xff0c;注意&#xff1a;socket 接收信息需要异步运行&#xff1a; // port 端口号自定义一个值&#xff0c;比如 8888&#xff0c;但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…...

基于微信小程序的食堂线上预约点餐系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

算法初学者(图的存储)链式前向星

知识储备&#xff1a;概念&#xff0c;存储&#xff0c;遍历&#xff0c;最短路&#xff0c;最小生成树&#xff0c;拓扑排序-关键路径 图的存储&#xff1a;邻接矩阵&#xff0c;邻接表&#xff0c;十字链表&#xff0c;多重邻接表&#xff0c;边集数组 其中&#xff1a;邻接…...

Github 2025-01-11 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10C项目1Swift项目1Yazi - 快速终端文件管理器 创建周期:210 天开发语言:Rust协议类型:MIT LicenseStar数量:5668 个Fork数量:122…...

Leetcode 3419. Minimize the Maximum Edge Weight of Graph

Leetcode 3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路 这一题我的思路就是二分法&#xff0c;找到能够完成遍历的临界值即可。 但是自己实际在…...

深入理解数据库索引及其优化策略

数据库作为现代应用系统的核心组件之一&#xff0c;如何高效地存储和检索数据成为开发者关注的焦点。 在处理大规模数据时&#xff0c;数据库索引 是提升查询性能的关键技术之一。本文将深入探讨数据库索引的工作原理、常见类型、创建索引的策略以及如何优化索引&#xff0c;以…...

安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用

吕梦怡 18706162527 摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发…...

css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)

两栏布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…...

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…...

IntelliJ IDEA 主题插件

在 IntelliJ IDEA 中&#xff0c;有很多优秀的主题插件可以帮助你改变 IDE 的外观和配色方案&#xff0c;使得开发过程更加愉悦和高效。以下是一些非常受欢迎和实用的 主题插件&#xff0c;以及如何安装和使用它们的步骤&#xff1a; &#x1f31f; 流行主题插件推荐 1️⃣ Ma…...

ASP.NET Core 中,Cookie 认证在集群环境下的应用

在 ASP.NET Core 中&#xff0c;Cookie 认证在集群环境下的应用通常会遇到一些挑战。主要的问题是 Cookie 存储在客户端的浏览器中&#xff0c;而认证信息&#xff08;比如 Session 或身份令牌&#xff09;通常是保存在 Cookie 中&#xff0c;多个应用实例需要共享这些 Cookie …...

k8s笔记29--使用kyverno提高运维效率

k8s笔记29--使用kyverno提高运维效率 介绍原理安装应用场景自动修正测试环境pod资源强制 Pod 标签限制容器镜像来源禁止特权容器其它潜在场景 注意事项说明 介绍 Kyverno是一个云原生的策略引擎&#xff0c;它最初是为k8s构建的&#xff0c;现在也可以在k8s集群之外用作统一的…...

快速上手Git——Windows系统下Git的安装与简单使用流程

一、Git的下载和安装 Git官网链接&#xff1a;https://git-scm.com/ 进入官网后选择Downloads 选择与系统相符合的版本下载&#xff0c;这里我使用的是windows系统 然后点击下载 根据流程安装完成后&#xff0c;使用以下命令查看git版本 git -v运行结果&#xff1a; 二、…...

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码&#xff0c;需要确保以下几点&#xff1a; 确保 eurekaSecurityEnabled 配置为 true&#xff1a;这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false&#xff0c;即使配置了用户名和密码&#xff0c;也不会启用安全认…...

linux--防火墙 iptables 双网卡 NAT 桥接

linux--防火墙 iptables 双网卡 NAT 桥接 1 介绍1.1 概述1.2 iptables 的结构 2 四表五链2.1 iptables 的四表filter 表&#xff1a;过滤规则表&#xff0c;默认表。nat 表&#xff1a;地址转换表。mangle 表&#xff1a;修改数据包内容。raw 表&#xff1a;原始数据包表。 2.2…...

C#反射的应用案例与讲解

C# 反射 文章目录 C# 反射前言案例展示将对象转为字典测试用例执行效果代码讲解 HasValue扩展测试用例执行效果代码讲解 反射的底层逻辑反射的原理反射的基本概念反射常用的API和方法GetType类Activator类PropertyInfo类EventInfo 类MemberInfo类MethodInfo类 反射的优缺点优点…...

Mysql常见知识点

Mysql是最常用的数据库了。 1、什么是关系型数据库&#xff1f; 关系型数据库&#xff08;RDB&#xff0c;Relational Database&#xff09;就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#…...

玩转 JMeter:Random Order Controller让测试“乱”出花样

嘿&#xff0c;各位性能测试的小伙伴们&#xff01;今天咱要来唠唠 JMeter 里超级有趣又超实用的 Random Order Controller&#xff08;随机顺序控制器&#xff09;&#xff0c;它就像是性能测试这场大戏里的“魔术棒”&#xff0c;轻轻一挥&#xff0c;就能让测试场景变得千变…...

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端&#xff0c;使用AMQP协议。 RabbitMQ是一个基于AMQP&#xff08;高级消息队列协议&#xff09;实现的开源消息组件&#xff0c;它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…...

计算机网络 (37)TCP的流量控制

前言 计算机网络中的TCP&#xff08;传输控制协议&#xff09;流量控制是一种重要机制&#xff0c;用于确保数据在发送方和接收方之间的传输既高效又稳定。 一、目的 TCP流量控制的主要目的是防止发送方发送数据过快&#xff0c;导致接收方无法及时处理&#xff0c;从而引起数据…...

Windows10下安装vue2.0项目所需环境

一、Node.js版本管理器NVM安装 1.下载NVM安装包 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。目前最新版…...

使用Cilium/eBPF实现大规模云原生网络和安全

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 抽象 1 Trip.com 云基础设施 1.1 分层架构 1.2 更多细节 2 纤毛在 Trip.com 2.1 推出时间表 2.2 自定义 2.3 优化和调整 2.3.1 解耦安装 2.3.2 避免重试/重启风暴 2.3.3 稳定性优先 2…...

SQL美化器优化

文章目录 1.目录2.代码 1.目录 2.代码 package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.*…...

网络基础1 http1.0 1.1 http/2的演进史

http1.0 1.1 http/2的演进史&#x1f60e; &#xff08;连接复用 队头阻塞 服务器推送 2进制分帧&#xff09; 概述 我们主要关注的是应用层 传输层 http协议发展历史 http的报文结构&#xff1a;起始行 Header Body http的典型特征 http存在的典型问题 Keep Alive机制 chun…...

MySQL不使用子查询的原因

MySQL不使用子查询的原因及优化案例 目录 MySQL不使用子查询的原因及优化案例 目录不推荐使用子查询和JOIN的原因解决方案优化案例 案例1&#xff1a;查询所有有库存的商品信息案例2&#xff1a;使用EXISTS优化子查询案例3&#xff1a;使用JOIN代替子查询案例4&#xff1a;优化…...

网络编程(1)

网络编程概述 Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;联网的底层细节被隐藏在 Java 的本机安装系统里&#…...

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…...

【python:文件->统计飞鸟集单词个数】

主函数.py fopen("飞鸟集.txt",r,encoding"UTF-8")#只读方式打开 contentf.read()# 提取全文,将文件内容字符串对象返回给content dccontent.split("\n")#对字符串调用分割符切割 print(dc) f.close() # 统计单词频率 ofnumcontent.count("…...

解决SpringBoot无法使用JDK8问题

解决SpringBoot无法使用JDK8问题 现状解决方案 现状 使用idea创建springboot项目无法选择java8。原因是23年11月的spring更新后就明确了不在支持java8版本的项目创建&#xff0c;但是目前为止很多公司开发还在用java8&#xff0c;导致会有问题的产生。 解决方案 使用idea创…...

论文导读 | 数据库系统中基于机器学习的基数估计方法

背景 基数估计任务是在一个查询执行之前预测其基数&#xff0c;基于代价的查询优化器&#xff08;Cost Based Optimizer&#xff09;将枚举所有可能的执行计划&#xff0c;并利用估计的基数选出期望执行代价最小的计划&#xff0c;从而完成查询优化的任务。 然而&#xff0c;…...

Shader->LinearGradient线性渐变着色器详解

XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…...

Unity打包+摄像机组件

转换场景 使用程序集&#xff1a;using UnityEngine.SceneManagement; 切换场景相关代码&#xff1a;SceneManager.LoadScene(1);//括号内可放入场景名称&#xff0c;场景索引等 //Application.LoadLevel(""); 老版本Unity加载场景方法 打包相关 Bundle Identi…...

Git 命令代码管理详解

一、Git 初相识&#xff1a;版本控制的神器 在当今的软件开发领域&#xff0c;版本控制如同基石般重要&#xff0c;而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造&#xff0c;最初是为了更好地管理 Linux 内核源代码。随着时间的推移&#xff0c;Git 凭借…...

游戏引擎学习第78天

Blackboard: Position ! Collision “网格” 昨天想到的一个点&#xff0c;可能本来就应该想到&#xff0c;但有时反而不立即思考这些问题也能带来一些好处。节目是周期性的&#xff0c;每天不需要全程关注&#xff0c;通常只是在晚上思考&#xff0c;因此有时我们可能不能那么…...

Centos9-SSH免密登录配置-修改22端口-关闭密码登录-提高安全性

Centos9-SSH免密登录配置-修改22端口-关闭密码登录 生成秘钥对将公钥信息存进authorized_keys测试登录查询访问记录、比对指纹更换22访问端口关闭账号密码登录生成秘钥对 生成密钥对,指定 备注 和 文件目录命令执行后,默认两次回车,不设置秘钥使用密码ssh-keygen -t rsa -b …...

汇总统计数据--SQL中聚集函数的使用

目录 1、为什么需要汇总数据 2、聚集函数 &#xff08;1&#xff09;AVG函数 &#xff08;2&#xff09;COUNT函数 &#xff08;3&#xff09;MAX和MIN函数 &#xff08;4&#xff09;SUM函数 3、聚集不同值--DISTINCT 4、组合聚集函数 5、小结 博主用的是mysql8 DBMS…...

pdf提取文本,表格以及转图片:spire.pdf

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380; 1. pdfbox1.1导入pdfbox 的maven依赖1.1 提取文本1.2 提取文本表格&#xff08;可自行加入逻辑处理&#xff09;1.3 pdf转换成图片代码&…...

【C#学习笔记】C#中委托

概述 C#的委托是一种类型安全的函数指针&#xff0c;用于引用方法&#xff0c;委托允许方法作为参数传递&#xff0c;或者将方法赋值给委托变量&#xff0c;并通过委托调用方法。 委托类型&#xff1a;委托定义了方法的的签名&#xff08;[方法的参数类型和返回值]&#xff0…...

C#的Task

优先使用Task.Run&#xff0c;除非有定制化需求才用Task.Factory.StartNew Task.Factory.StartNew的TaskScheduler参数颠覆你的认知&#xff1a; var cnt 0;var cancelToken new CancellationTokenSource();await Task.Factory.StartNew(() > {cnt;Debug.WriteLine($&quo…...

企业全文搜索-搜索权限,非侵入文档同步,权限同步 ,扩展字段

简介 企业全文搜索帮助员工高效快速定位所需的信息和资源,搜索权限控制是必须的,原因有二,首先,企业文档,包括公文,流程,技术文档等,带有敏感信息,搜索返回带片段,可能带出敏感信息;其次,若没有权限,用户搜索出来的文档可能不能阅读原文,体验非常差。onesearch有…...