⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hmi.c

📁 STM32,5110液晶显示超声波测距探鱼器200KHz,带电路图,精确到厘米
💻 C
📖 第 1 页 / 共 5 页
字号:
	else
	{
		FLAG_HMI_QUEUE_FULL = SET;
		return ERROR;
	}

	foundQueueSlot_Data = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
	if (foundQueueSlot_Data != NULL)
	{
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_DRAW_RECT_DATA;
	}
	else
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		FLAG_HMI_QUEUE_FULL = SET;
		return ERROR;
	}

	// To here queue slots are available and occupied
	HMI_CMD_Stream = malloc(HMI_LOCATE_CMD_STREAM_SIZE);
	if (NULL == HMI_CMD_Stream)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	HMI_CMD_Para = malloc(sizeof(struct_HMI_CMD_Para));
	if (NULL == HMI_CMD_Para)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		free(HMI_CMD_Stream);
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	HMI_Draw_Para = malloc(sizeof(struct_HMI_Draw_Para_Rect));
	if (NULL == HMI_Draw_Para)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		free(HMI_CMD_Stream);
		free(HMI_CMD_Para);
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}

	// All conditions are OK, we can start to work
	*HMI_CMD_Stream = startX | X_COORDINATE_MASK;
	*(HMI_CMD_Stream + 1)= (startY / HMI_ROW_WIDTH) | Y_COORDINATE_MASK;
	HMI_CMD_Para->DataLen = HMI_LOCATE_CMD_STREAM_SIZE;
	HMI_CMD_Para->DataList = HMI_CMD_Stream;

	HMI_Draw_Para->color = color;
	HMI_Draw_Para->startX = startX;
	HMI_Draw_Para->startY = startY;
	HMI_Draw_Para->endX = endX;
	HMI_Draw_Para->endY = endY;

	foundQueueSlot_CMD->HMI_Func_Para = HMI_CMD_Para;
	foundQueueSlot_Data->HMI_Func_Para = HMI_Draw_Para;

	return SUCCESS;
}

WorkingStatus HMI_Draw_Char_Data(void *HMI_Draw_Para)
{
	uint8_t tempRowRemain_Start, tempStartRowIndex, tempRowNUM, temp_i;
	uint8_t tempRow[ASCII5X8_CHAR_WIDTH];

	// Robust Check, make sure no out border
	if (((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + ASCII5X8_CHAR_WIDTH >= HMI_WIDTH_PIX)
	{
		((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX = 0;
	}
	if (((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY + ASCII5X8_CHAR_HEIGHT >= HMI_HEIGHT_PIX)
	{
		((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY = 0;
	}	

	GPIO_SetBits(LCD_DC_PORT, LCD_DC_PIN);	// Pull up D/_C to enter data mode

	tempRowRemain_Start = ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY % HMI_ROW_WIDTH;
	tempStartRowIndex = ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY / HMI_ROW_WIDTH;
	if (0 == tempRowRemain_Start)
	{
		for (temp_i = 0; temp_i < ASCII5X8_CHAR_WIDTH; temp_i++)
		{
			if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->color)
			{
				sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i] = 
					~ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i];
			}
			else
			{
				sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i] = 
					ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i];
			}
		}
	}
	else
	{
		for (temp_i = 0; temp_i < ASCII5X8_CHAR_WIDTH; temp_i++)
		{	// First Row
			if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->color)
			{
				tempRow[temp_i] = GRAM_ByteAnd_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), 0, 
										  ~ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i], tempRowRemain_Start);
			}
			else
			{
				tempRow[temp_i] = GRAM_ByteOr_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), 0, 
										  ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i], tempRowRemain_Start);
			}
		}
		for (temp_i = 0; temp_i < ASCII5X8_CHAR_WIDTH; temp_i++)
		{	// Second Row
			if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->color)
			{
				GRAM_ByteAnd_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i], 
							0xFF, tempRowRemain_Start);
			}
			else
			{
				GRAM_ByteOr_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i], 
							0, tempRowRemain_Start);
			}
		}
	}

	tempRowNUM = (0 == tempRowRemain_Start ? 1 : 2);
	HMI_Data_TX(sta_LCD_Graphic_BUF[tempStartRowIndex] + ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX, 
				(tempRowNUM  - 1) * HMI_WIDTH_PIX + ASCII5X8_CHAR_WIDTH);

	return FINISHED;
}

ErrorStatus HMI_Draw_Char(uint8_t startX, uint8_t startY, char ASCIIChar, HMIDrawColor color)
{
	struct_HMI_Queue *foundQueueSlot_CMD = NULL;
	struct_HMI_Queue *foundQueueSlot_Data = NULL;
	struct_HMI_Draw_Para_Char *HMI_Draw_Para = NULL;
	struct_HMI_CMD_Para *HMI_CMD_Para = NULL;
	uint8_t *HMI_CMD_Stream = NULL;
	char *HMI_Draw_Para_Char = NULL;

	// Prepare to get all necessary space
	foundQueueSlot_CMD = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
	if ((foundQueueSlot_CMD != NULL))
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_CMD_STREAM;
	}
	else
	{
		FLAG_HMI_QUEUE_FULL = SET;
		return ERROR;
	}

	foundQueueSlot_Data = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
	if (foundQueueSlot_Data != NULL)
	{
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_DRAW_CHAR_DATA;
	}
	else
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		FLAG_HMI_QUEUE_FULL = SET;
		return ERROR;
	}

	// To here queue slots are available and occupied
	HMI_CMD_Stream = malloc(HMI_LOCATE_CMD_STREAM_SIZE);
	if (NULL == HMI_CMD_Stream)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	HMI_CMD_Para = malloc(sizeof(struct_HMI_CMD_Para));
	if (NULL == HMI_CMD_Para)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		free(HMI_CMD_Stream);
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	HMI_Draw_Para = malloc(sizeof(struct_HMI_Draw_Para_Char));
	if (NULL == HMI_Draw_Para)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		free(HMI_CMD_Stream);
		free(HMI_CMD_Para);
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	HMI_Draw_Para_Char = malloc(sizeof(char));
	if (NULL == HMI_Draw_Para_Char)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		free(HMI_CMD_Stream);
		free(HMI_CMD_Para);
		free(HMI_Draw_Para);
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	// All conditions are OK, we can start to work
	*HMI_CMD_Stream = startX | X_COORDINATE_MASK;
	*(HMI_CMD_Stream + 1)= (startY / HMI_ROW_WIDTH) | Y_COORDINATE_MASK;
	HMI_CMD_Para->DataLen = HMI_LOCATE_CMD_STREAM_SIZE;
	HMI_CMD_Para->DataList = HMI_CMD_Stream;

	*HMI_Draw_Para_Char = ASCIIChar;
	HMI_Draw_Para->color = color;
	HMI_Draw_Para->startX = startX;
	HMI_Draw_Para->startY = startY;
	HMI_Draw_Para->ASCIIChar = HMI_Draw_Para_Char;

	foundQueueSlot_CMD->HMI_Func_Para = HMI_CMD_Para;
	foundQueueSlot_Data->HMI_Func_Para = HMI_Draw_Para;

	return SUCCESS;
}

WorkingStatus HMI_Draw_String_Data(void *HMI_Draw_Para)
{
	uint8_t tempRowRemain_Start, tempStartRowIndex, tempRowNUM, temp_i, tempStringWidth;
	uint8_t tempRow[HMI_WIDTH_PIX];

	// Robust Check, make sure no out border
	tempStringWidth = ASCII5X8_CHAR_WIDTH * strlen(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString);
	tempStringWidth = tempStringWidth > HMI_WIDTH_PIX ? HMI_WIDTH_PIX : tempStringWidth;

	if (((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + tempStringWidth >= HMI_WIDTH_PIX)
	{
		((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX = 0;
	}
	if (((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY + ASCII5X8_CHAR_HEIGHT >= HMI_HEIGHT_PIX)
	{
		((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY = 0;
	}	

	GPIO_SetBits(LCD_DC_PORT, LCD_DC_PIN);	// Pull up D/_C to enter data mode

	tempRowRemain_Start = ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY % HMI_ROW_WIDTH;
	tempStartRowIndex = ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY / HMI_ROW_WIDTH;
	if (0 == tempRowRemain_Start)
	{
		for (temp_i = 0; temp_i < tempStringWidth; temp_i++)
		{
			if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->color)
			{
				sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i] = 
					~ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH];
			}
			else
			{
				sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i] = 
					ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH];
			}
		}
	}
	else
	{
		for (temp_i = 0; temp_i < tempStringWidth; temp_i++)
		{	// First Row
			if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->color)
			{
				tempRow[temp_i] = GRAM_ByteAnd_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), 0, 
											   ~ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH], 
											   tempRowRemain_Start);
			}
			else
			{
				tempRow[temp_i] = GRAM_ByteOr_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), 0, 
											  ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH], 
											  tempRowRemain_Start);
			}
		}
		for (temp_i = 0; temp_i < tempStringWidth; temp_i++)
		{	// Second Row
			if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->color)
			{
				GRAM_ByteAnd_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i], 
							0xFF, tempRowRemain_Start);
			}
			else
			{
				GRAM_ByteOr_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i], 
							0, tempRowRemain_Start);
			}
		}
	}

	tempRowNUM = (0 == tempRowRemain_Start ? 1 : 2);
	HMI_Data_TX(sta_LCD_Graphic_BUF[tempStartRowIndex] + ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX, 
				(tempRowNUM  - 1) * HMI_WIDTH_PIX + tempStringWidth);

	return FINISHED;
}

ErrorStatus HMI_Draw_String(uint8_t startX, uint8_t startY, char *ASCIIString, HMIDrawColor color)
{
	struct_HMI_Queue *foundQueueSlot_CMD = NULL;
	struct_HMI_Queue *foundQueueSlot_Data = NULL;
	struct_HMI_Draw_Para_String *HMI_Draw_Para = NULL;
	struct_HMI_CMD_Para *HMI_CMD_Para = NULL;
	uint8_t *HMI_CMD_Stream = NULL;
	char *HMI_Draw_Para_String = NULL;

	// Prepare to get all necessary space
	foundQueueSlot_CMD = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
	if ((foundQueueSlot_CMD != NULL))
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_CMD_STREAM;
	}
	else
	{
		FLAG_HMI_QUEUE_FULL = SET;
		return ERROR;
	}

	foundQueueSlot_Data = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
	if (foundQueueSlot_Data != NULL)
	{
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_DRAW_STRING_DATA;
	}
	else
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		FLAG_HMI_QUEUE_FULL = SET;
		return ERROR;
	}

	// To here queue slots are available and occupied
	HMI_CMD_Stream = malloc(HMI_LOCATE_CMD_STREAM_SIZE);
	if (NULL == HMI_CMD_Stream)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
		foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	HMI_CMD_Para = malloc(sizeof(struct_HMI_CMD_Para));
	if (NULL == HMI_CMD_Para)
	{
		foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -