基于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单片的显示试验
试验要求: 1、通过串口,下发两个命令 STR和PIC; 2、STR模式: (1)串口输入什么,屏幕上显示什么 (2)如果屏幕满,自动下滚 (3)输入回车&a…...

最短路径算法
关注:算法思路,时间复杂度,适用情况(单源/多源,负边权/负边权回路) 复习弗雷德算法--基于动态规划--多源--负边权--时间复杂度O(v^3) int的最大值是0x7fffffff #include <iostream> using namesp…...

如何用 ESP32-CAM 做一个实时视频流服务器
文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用?GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…...
Centos7 解决Maven scope=system依赖jar包没有打包到启动jar包中的问题(OpenCV-4.10)
最近项目中遇到问题,OpenCV的Jar包在程序打包后,找不到相关的类,比如MAT,这个时候怀疑OpenCV_4.10的Jar没有和应用程序一起打包,后面排查到确实是没有打包进去,特此记录,便于日后查阅。 <!-- 加载lib目录下的opencv包 --> <dependency><groupId>org…...
iOS实际开发中使用Alamofire实现多文件上传(以个人相册为例)
引言 在移动应用中,图片上传是一个常见的功能,尤其是在个人中心或社交平台场景中,用户经常需要上传图片到服务器,用以展示个人风采或记录美好瞬间。然而,实现多图片上传的过程中,如何设计高效的上传逻辑并…...
如何将分割的mask转为为分割标签
将分割的mask转换为分割标签通常涉及将每个像素的类别标识(在mask中以不同的灰度值或颜色表示)转换为整数标签。这些标签通常用于机器学习或深度学习模型的训练、验证和测试阶段。 使用方式,控制台或者命令行使用以下命令: pyth…...

【动手学电机驱动】STM32-MBD(5)Simulink 模型开发之 PWM 输出
STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 STM32-MBD(4)Simulink 状态机实现按键控制 STM32-MBD&…...

MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024小结:在写作分享上,这里特别感谢CSDN社区提供平台,支持大家持续学习分享交流,共同进步。社区诚意满满的干货,让大家收获满满。 对我而言,珍惜每一篇投稿分享,每一篇内容字数大概6000字左右&…...

vue2日历组件
这个代码可以直接运行,未防止有组件库没安装,将组件库的代码,转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…...
【PyQt】多行纯文本框
[toc]qt多行纯文本框 QPlainTextEdit QPlainTextEdit 是可以多行的纯文本编辑框 文本浏览框 内置了一个** QTextDocument **类型的对象 ,存放文档。 1.信号:文本被修改 当文本框中的内容被键盘编辑,被点击就会发出 textChanged 信号&…...
workerman5.0篇〡异步非阻塞协程HTTP客户端
概述 workerman/http-client 是一个异步http客户端组件。所有请求响应异步非阻塞,内置连接池,消息请求和响应符合PSR7规范。 Workerman 5.0 版本中的异步HTTP协程客户端组件是一个基于PHP协程的高性能HTTP客户端,它能够充分利用PHP的异步特…...

JavaScript 延迟加载的方法( 7种 )
JavaScript脚本的延迟加载(也称为懒加载)是指在网页的主要内容已经加载并显示给用户之后,再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度,改善用户体验,并减少服务器的压力。 以下是几种常见的延…...

python+pymysql
python操作mysql 一、python操作数据库 1、下载pymysql 库, 方法一:pip3 install pymysql 或pip install pymysql 方法二:在pycharm中setting下载pymysql 2、打开虚拟机上的数据库 3、pymysql连接 dbpymysql.Connection(host&qu…...
基于 Selenium 实现上海大学校园网自动登录
基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具: Selenium:一个用于自动化测试的工具,能够模拟用户在浏览器上的操作。Edge WebDriver:用于控制 Edge 浏览器的驱动程序。 功能设计: 检测网络状…...

啥!GitHub Copilot也免费使用了
文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近,GitHub 给开发者们带来了一个好消息:他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了!以前,每个月要花 10 美元才能享受的服务,现在对所…...
Spring配置文件中:密码明文改为密文处理方式(通用方法)
目录 一、背景 二、思路 A) 普通方式 B) 适合bootstrap.properties方式 三、示例 A) 普通方式(连接Redis集群) A) 普通方式(连接RocketMQ) B) 适合bootstrap.properties方式 四、总结 一、背景 SpringBoot和Sprin…...

Linux下ext2文件系统
文章目录 一 :penguin:基本概述二 :star: ext2文件系统:star: 1. :star:Boot Block(引导块)位置与作用 三 Block Group(块组):star:1.:star: Super Block(超级块):star:2.:star: Group Descriptor(块组描述符):star:…...

BUUCTF:web刷题记录(1)
目录 [极客大挑战 2019]EasySQL1 [极客大挑战 2019]Havefun1 [极客大挑战 2019]EasySQL1 根据题目以及页面内容,这是一个sql注入的题目。 直接就套用万能密码试试。 admin or 1 # 轻松拿到flag 换种方式也可以轻松拿到flag 我们再看一下网页源码 这段 HTML 代码…...

【微服务】面试题 6、分布式事务
分布式事务面试题讲解 一、问题背景与解决方案概述 因微服务项目涉及远程调用可能引发分布式事务问题,需解决。主流解决方案有阿里 Seata 框架(含 XA、AT、TCC 模式)和 MQ。 二、Seata 框架关键角色 事务协调者(TC)&…...

【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)
一、问题描述 题目描述 均衡串定义:字符串中只包含两种字符,且这两种字符的个数相同。 给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。 约定:字符串中只包含大写的 X 和 Y 两种字符。 输入描述 输入一个均衡串…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 允许出现允许…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...