STM32CUBEIDE的使用【五】TFT_LCD

硬件平台: 正点原子潘多拉开发板 STM32L475
软件平台: STM3232CubeMX 、STM32CUBEIDE

屏幕尺寸为1.3寸 分辨率240*240 16位真彩色

使用SPI接口驱动TFT_LCD 用来显示ASCII 字符图像和彩色功能

CubeMX配置

在这里插入图片描述在这里插入图片描述

Source Code

创建app_lcd.c文件

#include "app_lcd.h"
#include "app_font.h"
#include "spi.h"extern SPI_HandleTypeDef hspi3;#define LCD_SPI hspi3
#define delay_ms(x) HAL_Delay(x)//LCD缓存大小设置,修改此值时请注意!!!!修改这两个值时可能会影响以下函数	LCD_Clear/LCD_Fill/LCD_DrawLine
#define LCD_TOTAL_BUF_SIZE	(240*240*2)
#define LCD_Buf_Size 1152
static uint8_t lcd_buf[LCD_Buf_Size];uint16_t	POINT_COLOR = BLACK;	//画笔颜色	默认为黑色
uint16_t	BACK_COLOR 	= WHITE;	//背景颜色	默认为白色/*** @brief	LCD控制接口初始化** @param   void** @return  void*/
static void LCD_Gpio_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOB_CLK_ENABLE();/*LCD_PWR:	PB7LCD_RST:	PB6LCD_DC:		PB4LCD_CS:		PD7*/GPIO_InitStruct.Pin = GPIO_PIN_4 ;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
//
//    GPIO_InitStruct.Pin = GPIO_PIN_7;
//    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
//    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);LCD_CS(0);LCD_PWR(0);LCD_RST(0);delay_ms(120);LCD_RST(1);//    SPI3_Init();	//初始化SPI3接口
}/*** @brief	LCD底层SPI发送数据函数** @param   data	数据的起始地址* @param   size	发送数据大小** @return  void*/
static void LCD_SPI_Send(uint8_t *data, uint32_t size)
{uint32_t i;uint32_t delta;delta = size/0xFFFF;for(i = 0; i<=delta; i++){if( i==delta )  /* 发送最后一帧数据 */HAL_SPI_Transmit(&LCD_SPI,&data[i*0xFFFF], size%0xFFFF,1000);else    /* 超长数据一次发送0xFFFF字节数据 */HAL_SPI_Transmit(&LCD_SPI,&data[i*0xFFFF], 0xFFFF,1000);}
}/*** @brief	写命令到LCD** @param   cmd		需要发送的命令** @return  void*/
static void LCD_Write_Cmd(uint8_t cmd)
{LCD_DC(0);LCD_SPI_Send(&cmd, 1);
}/*** @brief	写数据到LCD** @param   cmd		需要发送的数据** @return  void*/
static void LCD_Write_Data(uint8_t data)
{LCD_DC(1);LCD_SPI_Send(&data, 1);
}/*** @brief	写半个字的数据到LCD** @param   cmd		需要发送的数据** @return  void*/
void LCD_Write_HalfWord(const uint16_t da)
{uint8_t data[2] = {0};data[0] = da >> 8;data[1] = da;LCD_DC(1);LCD_SPI_Send(data, 2);
}/*** 设置数据写入LCD缓存区域** @param   x1,y1	起点坐标* @param   x2,y2	终点坐标** @return  void*/
void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{LCD_Write_Cmd(0x2a);LCD_Write_Data(x1 >> 8);LCD_Write_Data(x1);LCD_Write_Data(x2 >> 8);LCD_Write_Data(x2);LCD_Write_Cmd(0x2b);LCD_Write_Data(y1 >> 8);LCD_Write_Data(y1);LCD_Write_Data(y2 >> 8);LCD_Write_Data(y2);LCD_Write_Cmd(0x2C);
}/*** 打开LCD显示** @param   void** @return  void*/
void LCD_DisplayOn(void)
{LCD_PWR(1);
}
/*** 关闭LCD显示** @param   void** @return  void*/
void LCD_DisplayOff(void)
{LCD_PWR(0);
}/*** 以一种颜色清空LCD屏** @param   color	清屏颜色** @return  void*/
void LCD_Clear(uint16_t color)
{uint16_t i, j;uint8_t data[2] = {0};data[0] = color >> 8;data[1] = color;LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1);for(j = 0; j < LCD_Buf_Size / 2; j++){lcd_buf[j * 2] =  data[0];lcd_buf[j * 2 + 1] =  data[1];}LCD_DC(1);for(i = 0; i < (LCD_TOTAL_BUF_SIZE / LCD_Buf_Size); i++){LCD_SPI_Send(lcd_buf, LCD_Buf_Size);}
}/*** 用一个颜色填充整个区域** @param   x_start,y_start     起点坐标* @param   x_end,y_end			终点坐标* @param   color       		填充颜色** @return  void*/
void LCD_Fill(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t color)
{uint16_t i = 0;uint32_t size = 0, size_remain = 0;size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;if(size > LCD_Buf_Size){size_remain = size - LCD_Buf_Size;size = LCD_Buf_Size;}LCD_Address_Set(x_start, y_start, x_end, y_end);while(1){for(i = 0; i < size / 2; i++){lcd_buf[2 * i] = color >> 8;lcd_buf[2 * i + 1] = color;}LCD_DC(1);LCD_SPI_Send(lcd_buf, size);if(size_remain == 0)break;if(size_remain > LCD_Buf_Size){size_remain = size_remain - LCD_Buf_Size;}else{size = size_remain;size_remain = 0;}}
}/*** 用颜色缓冲区填充区域** @param   x_start,y_start     起点坐标* @param   x_end,y_end			终点坐标* @param   clr_buf       		颜色缓冲区** @return  void*/
void LCD_Fill_Buf(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t* clr_buf)
{uint16_t i = 0;uint32_t size = 0, size_remain = 0;size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;if(size > LCD_Buf_Size){size_remain = size - LCD_Buf_Size;size = LCD_Buf_Size;}LCD_Address_Set(x_start, y_start, x_end, y_end);while(1){for(i = 0; i < size / 2; i++){lcd_buf[2 * i] = clr_buf[i] >> 8;lcd_buf[2 * i + 1] = clr_buf[i];}LCD_DC(1);LCD_SPI_Send(lcd_buf, size);if(size_remain == 0)break;if(size_remain > LCD_Buf_Size){size_remain = size_remain - LCD_Buf_Size;}else{size = size_remain;size_remain = 0;}}
}/*** 画点函数** @param   x,y		画点坐标** @return  void*/
void LCD_Draw_Point(uint16_t x, uint16_t y)
{LCD_Address_Set(x, y, x, y);LCD_Write_HalfWord(POINT_COLOR);
}/*** 画点带颜色函数** @param   x,y		画点坐标** @return  void*/
void LCD_Draw_ColorPoint(uint16_t x, uint16_t y,uint16_t color)
{LCD_Address_Set(x, y, x, y);LCD_Write_HalfWord(color);
}/*** @brief	画线函数(直线、斜线)** @param   x1,y1	起点坐标* @param   x2,y2	终点坐标** @return  void*/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{uint16_t t;int xerr = 0, yerr = 0, delta_x, delta_y, distance;int incx, incy, row, col;uint32_t i = 0;if(y1 == y2){/*快速画水平线*/LCD_Address_Set(x1, y1, x2, y2);for(i = 0; i < x2 - x1; i++){lcd_buf[2 * i] = POINT_COLOR >> 8;lcd_buf[2 * i + 1] = POINT_COLOR;}LCD_DC(1);LCD_SPI_Send(lcd_buf, (x2 - x1) * 2);return;}delta_x = x2 - x1;delta_y = y2 - y1;row = x1;col = y1;if(delta_x > 0)incx = 1;else if(delta_x == 0)incx = 0;else{incx = -1;delta_x = -delta_x;}if(delta_y > 0)incy = 1;else if(delta_y == 0)incy = 0;else{incy = -1;delta_y = -delta_y;}if(delta_x > delta_y)distance = delta_x;else distance = delta_y;for(t = 0; t <= distance + 1; t++){LCD_Draw_Point(row, col);xerr += delta_x ;yerr += delta_y ;if(xerr > distance){xerr -= distance;row += incx;}if(yerr > distance){yerr -= distance;col += incy;}}
}/*** @brief	画一个矩形** @param   x1,y1	起点坐标* @param   x2,y2	终点坐标** @return  void*/
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{LCD_DrawLine(x1, y1, x2, y1);LCD_DrawLine(x1, y1, x1, y2);LCD_DrawLine(x1, y2, x2, y2);LCD_DrawLine(x2, y1, x2, y2);
}/*** @brief	画一个圆** @param   x0,y0	圆心坐标* @param   r       圆半径** @return  void*/
void LCD_Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r)
{int a, b;int di;a = 0;b = r;di = 3 - (r << 1);while(a <= b){LCD_Draw_Point(x0 - b, y0 - a);LCD_Draw_Point(x0 + b, y0 - a);LCD_Draw_Point(x0 - a, y0 + b);LCD_Draw_Point(x0 - b, y0 - a);LCD_Draw_Point(x0 - a, y0 - b);LCD_Draw_Point(x0 + b, y0 + a);LCD_Draw_Point(x0 + a, y0 - b);LCD_Draw_Point(x0 + a, y0 + b);LCD_Draw_Point(x0 - b, y0 + a);a++;if(di < 0)di += 4 * a + 6;else{di += 10 + 4 * (a - b);b--;}LCD_Draw_Point(x0 + a, y0 + b);}
}/*** @brief	显示一个ASCII码字符** @param   x,y		显示起始坐标* @param   chr		需要显示的字符* @param   size	字体大小(支持16/24/32号字体)** @return  void*/
void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t chr, uint8_t size)
{uint8_t temp, t1, t;uint8_t csize;		//得到字体一个字符对应点阵集所占的字节数uint16_t colortemp;uint8_t sta;chr = chr - ' '; //得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)if((x > (LCD_Width - size / 2)) || (y > (LCD_Height - size)))	return;LCD_Address_Set(x, y, x + size / 2 - 1, y + size - 1);//(x,y,x+8-1,y+16-1)if((size == 16) || (size == 32) )	//16和32号字体{csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2);for(t = 0; t < csize; t++){if(size == 16)temp = asc2_1608[chr][t];	//调用1608字体else if(size == 32)temp = asc2_3216[chr][t];	//调用3216字体else return;			//没有的字库for(t1 = 0; t1 < 8; t1++){if(temp & 0x80) colortemp = POINT_COLOR;else colortemp = BACK_COLOR;LCD_Write_HalfWord(colortemp);temp <<= 1;}}}else if  (size == 12)	//12号字体{csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2);for(t = 0; t < csize; t++){temp = asc2_1206[chr][t];for(t1 = 0; t1 < 6; t1++){if(temp & 0x80) colortemp = POINT_COLOR;else colortemp = BACK_COLOR;LCD_Write_HalfWord(colortemp);temp <<= 1;}}}else if(size == 24)		//24号字体{csize = (size * 16) / 8;for(t = 0; t < csize; t++){temp = asc2_2412[chr][t];if(t % 2 == 0)sta = 8;else sta = 4;for(t1 = 0; t1 < sta; t1++){if(temp & 0x80) colortemp = POINT_COLOR;else colortemp = BACK_COLOR;LCD_Write_HalfWord(colortemp);temp <<= 1;}}}
}/*** @brief	m^n函数** @param   m,n		输入参数** @return  m^n次方*/
static uint32_t LCD_Pow(uint8_t m, uint8_t n)
{uint32_t result = 1;while(n--)result *= m;return result;
}/*** @brief	显示数字,高位为0不显示** @param   x,y		起点坐标* @param   num		需要显示的数字,数字范围(0~4294967295)* @param   len		需要显示的位数* @param   size	字体大小** @return  void*/
void LCD_ShowNum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size)
{uint8_t t, temp;uint8_t enshow = 0;for(t = 0; t < len; t++){temp = (num / LCD_Pow(10, len - t - 1)) % 10;if(enshow == 0 && t < (len - 1)){if(temp == 0){LCD_ShowChar(x + (size / 2)*t, y, ' ', size);continue;}else enshow = 1;}LCD_ShowChar(x + (size / 2)*t, y, temp + '0', size);}
}/*** @brief	显示数字,高位为0,可以控制显示为0还是不显示** @param   x,y		起点坐标* @param   num		需要显示的数字,数字范围(0~999999999)* @param   len		需要显示的位数* @param   size	字体大小* @param   mode	1:高位显示0		0:高位不显示** @return  void*/
void LCD_ShowxNum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode)
{uint8_t t, temp;uint8_t enshow = 0;for(t = 0; t < len; t++){temp = (num / LCD_Pow(10, len - t - 1)) % 10;if(enshow == 0 && t < (len - 1)){if(temp == 0){if(mode)LCD_ShowChar(x + (size / 2)*t, y, '0', size);elseLCD_ShowChar(x + (size / 2)*t, y, ' ', size);continue;}else enshow = 1;}LCD_ShowChar(x + (size / 2)*t, y, temp + '0', size);}
}/*** @brief	显示字符串** @param   x,y		起点坐标* @param   width	字符显示区域宽度* @param   height	字符显示区域高度* @param   size	字体大小* @param   p		字符串起始地址** @return  void*/
void LCD_ShowString(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, char *p)
{uint8_t x0 = x;width += x;height += y;while((*p <= '~') && (*p >= ' ')) //判断是不是非法字符!{if(x >= width){x = x0;y += size;}if(y >= height)break; //退出LCD_ShowChar(x, y, *p, size);x += size / 2;p++;}
}/*** @brief	显示图片** @remark	Image2Lcd取模方式:	C语言数据/水平扫描/16位真彩色(RGB565)/高位在前		其他的不要选** @param   x,y		起点坐标* @param   width	图片宽度* @param   height	图片高度* @param   p		图片缓存数据起始地址** @return  void*/
void LCD_Show_Image(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *p)
{if(x + width > LCD_Width || y + height > LCD_Height){return;}LCD_Address_Set(x, y, x + width - 1, y + height - 1);LCD_DC(1);LCD_SPI_Send((uint8_t *)p, width * height * 2);
}/*** @brief	LCD初始化** @param   x,y		显示坐标** @return  void*/
void Display_ALIENTEK_LOGO(uint16_t x, uint16_t y)
{LCD_Show_Image(x, y, 240, 82, ALIENTEK_LOGO);
}/*** @brief	LCD初始化** @param   void** @return  void*/
void LCD_Init(void)
{LCD_Gpio_Init();	//硬件接口初始化delay_ms(120);/* Sleep Out */LCD_Write_Cmd(0x11);/* wait for power stability */delay_ms(120);/* Memory Data Access Control */LCD_Write_Cmd(0x36);LCD_Write_Data(0x00);/* RGB 5-6-5-bit  */LCD_Write_Cmd(0x3A);LCD_Write_Data(0x65);/* Porch Setting */LCD_Write_Cmd(0xB2);LCD_Write_Data(0x0C);LCD_Write_Data(0x0C);LCD_Write_Data(0x00);LCD_Write_Data(0x33);LCD_Write_Data(0x33);/*  Gate Control */LCD_Write_Cmd(0xB7);LCD_Write_Data(0x72);/* VCOM Setting */LCD_Write_Cmd(0xBB);LCD_Write_Data(0x3D);   //Vcom=1.625V/* LCM Control */LCD_Write_Cmd(0xC0);LCD_Write_Data(0x2C);/* VDV and VRH Command Enable */LCD_Write_Cmd(0xC2);LCD_Write_Data(0x01);/* VRH Set */LCD_Write_Cmd(0xC3);LCD_Write_Data(0x19);/* VDV Set */LCD_Write_Cmd(0xC4);LCD_Write_Data(0x20);/* Frame Rate Control in Normal Mode */LCD_Write_Cmd(0xC6);LCD_Write_Data(0x0F);	//60MHZ/* Power Control 1 */LCD_Write_Cmd(0xD0);LCD_Write_Data(0xA4);LCD_Write_Data(0xA1);/* Positive Voltage Gamma Control */LCD_Write_Cmd(0xE0);LCD_Write_Data(0xD0);LCD_Write_Data(0x04);LCD_Write_Data(0x0D);LCD_Write_Data(0x11);LCD_Write_Data(0x13);LCD_Write_Data(0x2B);LCD_Write_Data(0x3F);LCD_Write_Data(0x54);LCD_Write_Data(0x4C);LCD_Write_Data(0x18);LCD_Write_Data(0x0D);LCD_Write_Data(0x0B);LCD_Write_Data(0x1F);LCD_Write_Data(0x23);/* Negative Voltage Gamma Control */LCD_Write_Cmd(0xE1);LCD_Write_Data(0xD0);LCD_Write_Data(0x04);LCD_Write_Data(0x0C);LCD_Write_Data(0x11);LCD_Write_Data(0x13);LCD_Write_Data(0x2C);LCD_Write_Data(0x3F);LCD_Write_Data(0x44);LCD_Write_Data(0x51);LCD_Write_Data(0x2F);LCD_Write_Data(0x1F);LCD_Write_Data(0x1F);LCD_Write_Data(0x20);LCD_Write_Data(0x23);/* Display Inversion On */LCD_Write_Cmd(0x21);LCD_Write_Cmd(0x29);LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1);LCD_Clear(WHITE);/*打开显示*/LCD_PWR(1);
}

app_lcd.h文件

#ifndef __APP_LCD_H__
#define __APP_LCD_H__
#include "main.h"#include "stdint.h"
#include "stdio.h"
extern uint16_t	POINT_COLOR;		//默认画笔颜色
extern uint16_t	BACK_COLOR;		//默认背景颜色//LCD的宽和高定义
#define LCD_Width 	240
#define LCD_Height 	240//画笔颜色
#define WHITE         	 0xFFFF
#define BLACK         	 0x0000
#define BLUE         	 0x001F
#define BRED             0XF81F
#define GRED 			 0XFFE0
#define GBLUE			 0X07FF
#define RED           	 0xF800
#define MAGENTA       	 0xF81F
#define GREEN         	 0x07E0
#define CYAN          	 0x7FFF
#define YELLOW        	 0xFFE0
#define BROWN 			 0XBC40 //棕色
#define BRRED 			 0XFC07 //棕红色
#define GRAY  			 0X8430 //灰色
//GUI颜色#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色
#define GRAYBLUE       	 0X5458 //灰蓝色
//以上三色为PANEL的颜色#define LIGHTGREEN     	 0X841F //浅绿色
//#define LIGHTGRAY        0XEF5B //浅灰色(PANNEL)
#define LGRAY 			 0XC618 //浅灰色(PANNEL),窗体背景色#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)/*LCD_PWR:	PB7LCD_RST:	PB6LCD_DC:		PB4LCD_CS:		PD7
*/
#define	LCD_PWR(n)		(n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET))
#define	LCD_RST(n)		(n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET))
#define	LCD_DC(n)		(n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET))
#define	LCD_CS(n)		(n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_RESET))void LCD_Init(void);																	//初始化
void LCD_DisplayOn(void);																//开显示
void LCD_DisplayOff(void);																//关显示
void LCD_Write_HalfWord(const uint16_t da);													//写半个字节数据到LCD
void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);									//设置数据显示区域
void LCD_Clear(uint16_t color);																//清屏
void LCD_Fill(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t color);				//填充单色
void LCD_Fill_Buf(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t* clr_buf);		//填充BUF
void LCD_Draw_Point(uint16_t x, uint16_t y);														//画点
void LCD_Draw_ColorPoint(uint16_t x, uint16_t y,uint16_t color);										//画带颜色点
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);										//画线
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);									//画矩形
void LCD_Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r);												//画圆
void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t chr, uint8_t size);										//显示一个字符
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size);									//显示一个数字
void LCD_ShowxNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size,uint8_t mode);							//显示数字
void LCD_ShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t size,char *p);					//显示字符串
void LCD_Show_Image(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *p);					//显示图片
void Display_ALIENTEK_LOGO(uint16_t x,uint16_t y);												//显示ALIENTEK LOGO#endif

调用函数LCD_Init 进行初始化后就能使用显示的函数了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15372.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python数据分析NumPy和pandas(三十二、数据拆分-应用-合并)

最常用的 GroupBy 方法是 apply&#xff0c;apply 将正在操作的对象拆分为多个片段&#xff0c;在每个片段上调用传递给它函数&#xff0c;然后尝试连接这些片段。 还是用前面的小费数据集tips.csv&#xff0c;它的内容如下图&#xff1a; 假设我们想按smoker进行分组并选择前…

【毫米波雷达(九)】前雷达软件开发遇到的问题汇总及解决方法

前雷达软件开发遇到的问题汇总及解决方法 一、CAN/CANFD通信1、雷达CAN未能正常发出数据2、雷达在车上接收不到车身信息3、程序下载失败4、DV试验发送数据偶发断连5、发送感知信息丢帧或者丢报文6、上电发出第一帧的报文时间长7、ZCANPRO有错误帧二、协议转换&#xff08;以太网…

linux 下调试 bmp280 气压传感器

供自己备忘&#xff1b; linux 下有自带的 bmp280 驱动&#xff0c;实际测试数据抖动不理想&#xff1b; 于是自己重写一个 bmp280 驱动&#xff0c;实际测试数据依旧抖动&#xff0c;不理想&#xff1b; 考虑使用 SPL06 来测试看看效果&#xff1b; 1. 参考资料&#xff1…

『VUE』26. props实现子组件传递数据给父组件(详细图文注释)

目录 本节内容示例代码总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 本节内容 父组件传子组件–props 子组件传父组件–自定义事件 本节讲子组件传父组件–通过props里的方法传递,就是父亲写了一个函数,给子组件调用,然后…

Linux编辑/etc/fstab文件不当,不使用快照;进入救援模式

目录 红帽镜像9救援模式 现象 解决 第一步&#xff1a;修改启动参数以进入救援模式 第二步&#xff1a;进入救援模式、获取root权限、编辑/etc/fstab文件 第三步&#xff1a;编辑好后在重启 下面是ai给的模板 红帽镜像9救援模式 编辑/etc/fstab不当时 17 /dev/nvme0n3p1…

异地情侣远程玩游戏?GameViewer远程串流轻松实现!

情侣之间偶尔想远程玩游戏增进感情却苦于找不到合适的软件&#xff1f;想要寻找一款低门槛好上手操作便捷的串流软件 &#xff1f; 在这里向你推荐 网易GameViewer远程 &#xff01; GameViewer是专为游戏玩家的设计远程控制软件&#xff0c;可以帮助异地情侣实现这一需求。它让…

1990-2020年中国人工林和天然林空间分布数据集

数据介绍 植树已被认为是减缓气候变化的潜在有效解决方案。自上世纪70年代以来&#xff0c;中国实施了世界上最大的造林和再造林工程&#xff0c;但中国人工林的高分辨率地图仍然无法获得。在这项研究中&#xff0c;我们探索了使用多源遥感图像和众包样本来制作第一张高分辨率…

[Docker#10] network | 架构 | CRUD | 5种常见网络类型 (实验)

目录 1. Docker 为什么需要网络管理 2. Docker 网络架构简介 CNM&#xff08;Container Network Model&#xff09; Libnetwork 驱动 3. ⭕常见网络类型&#xff08;5 种&#xff09; 4. Docker 网络管理命令 一. bridge 网络 1. 操作案例&#xff1a;容器间网络通信 …

Spring Cloud Gateway快速入门Demo

1.什么是Spring Cloud Gateway&#xff1f; Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 构建的 API 网关服务。它提供了一种简单而有效的方式来路由请求、提供跨领域的关注点&#xff08;如安全、监控/指标和弹性&#xff09;以及其他功能。Spring Clo…

【AI换脸整合包及教程】Rope:AI 换脸工具的功能、原理、应用

在人工智能技术迅猛发展的当下&#xff0c;AI 换脸技术无疑是近年来备受瞩目的焦点之一。其中&#xff0c;Rope 作为一款开源的 AI 换脸工具&#xff0c;因其出色的易用性和强大的功能而广受青睐。本文将对 Rope 的功能、技术原理、应用场景以及所面临的法律和伦理问题进行详细…

Yocto项目 - VIRTUAL-RUNTIME,它有什么用?

Yocto 项目是一个完整的 Linux 分布构建工具集&#xff0c;提供了构建完全自定义小型核心或完整应用的能力。在这样一个构建系统中&#xff0c;VIRTUAL-RUNTIME这个概念是应用构建和选择处理中的重要部分。这篇文章将从概念、优势、应用场景和实战案例几个方面&#xff0c;全面…

BB1-NHS ester被用于将各种生物活性分子与蛋白质或其他生物大分子进行共轭连接,2082771-52-4

CAS号&#xff1a;2082771-52-4 中文名&#xff1a;BB1-琥珀酰亚胺酯&#xff0c;BB1-活性酯 英文名&#xff1a;BB1-NHS ester&#xff0c;或BB1-Succinimidyl Ester 分子式&#xff1a;C32H32N6O4 分子量&#xff1a;564.63 纯度&#xff1a;≥95% 供应商&#xff1a;陕…

初级数据结构——栈

目录 前言一、栈的基本概念二、栈的实现方式三、栈的性能分析四、栈的应用场景五、栈的变体六、出栈入栈的动态图解七、代码模版八、总结结语 前言 数据结构栈&#xff08;Stack&#xff09;是一种线性的数据结构&#xff0c;它只允许在序列的一端&#xff08;称为栈顶&#x…

Jdbc学习笔记(四)--PreparedStatement对象、sql攻击(安全问题)

目录 &#xff08;一&#xff09;使用PreparedStatement对象的原因&#xff1a; 使用Statement对象编写sql语句会遇到的问题 ​编辑 &#xff08;二&#xff09;sql攻击 1.什么是sql攻击 2.演示sql攻击 &#xff08;三&#xff09;防止SQL攻击 1.PreparedStatement是什么 …

前端开发必备!2024年最全工具和框架资源大汇总

在前端开发的过程中&#xff0c;我们会使用各种工具、框架和库来提升开发效率和用户体验。随着技术的不断发展&#xff0c;前端生态系统逐渐丰富&#xff0c;开发者面临着越来越多的选择。本文将分享一些常见的前端资源&#xff0c;帮助开发者根据项目需求选择合适的工具。 1.…

备份可以起到什么作用?

在数字化时代&#xff0c;数据已经成为企业最宝贵的资产。然而&#xff0c;数据丢失和系统故障可能给企业带来巨大的损失。华为云备份服务作为一款全面的数据保护解决方案&#xff0c;致力于帮助企业保障数据安全&#xff0c;确保业务的连续性。九河云来给大家说一下华为云备份…

labview实现导出excel表格

有些项目数据读写在数据库里&#xff0c;有时客户会要求读写出来&#xff0c;这样就用到了labview把数据导出来&#xff0c;一般在测试程序界面&#xff0c;我们会把测试数据放在多列列表框里&#xff0c;这里我们需要对多列列表框进行操作。把多列列表框中的项名拆分出来。 接…

深度解读AI在数字档案馆中的创新应用:高效识别与智能档案管理

一、项目背景介绍 在信息化浪潮推动下&#xff0c;基于OCR技术的纸质档案电子化方案成为解决档案管理难题的有效途径。该方案通过先进的OCR技术&#xff0c;能够统一采集各类档案数据&#xff0c;无论是手写文件、打印文件、复古文档还是照片或扫描的历史资料&#xff0c;都能实…

vue3 vant4 NumberKeyboard 根据焦点输入

说明&#xff1a; 使用该组件时焦点在最后&#xff0c;客户要求可更改前面输错信息 实现逻辑 1.获取输入框焦点位置&#xff0c;此次采用的是ref&#xff0c;也可使用document相关 const inputElement numberKeyboardRef.value;if (inputElement) {cursorPosition.value i…

DHT22温湿度传感器(Espressif驱动)

DHT22&#xff1a; 温度范围&#xff1a;-40-80C温度精度&#xff1a;0.5C湿度范围&#xff1a;0-100%RH湿度精度&#xff1a;2-5%RH分辨率&#xff1a;0.1C / 0.1%RH #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE#include <stdio.h> #include <freertos/FreeRTOS.h>…