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

📄 hmi.c

📁 STM32,5110液晶显示超声波测距探鱼器200KHz,带电路图,精确到厘米
💻 C
📖 第 1 页 / 共 5 页
字号:
					  temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
				{
					sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End) | 
						((sta_LCD_Graphic_BUF[temp_i][temp_n - 1] << (HMI_ROW_WIDTH - tempRowRemain_End)) >> (HMI_ROW_WIDTH - tempRowRemain_End));
				}
			}
			sta_LCD_Graphic_BUF[temp_i][temp_n] = (sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End;
		}
		else
		{
			if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
			{
				memcpy((sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX),
						(sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX + 1), 
						temp_width - 1);
			}
			else
			{
				for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; 
					  temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
				{
					sta_LCD_Graphic_BUF[temp_i][temp_n] = sta_LCD_Graphic_BUF[temp_i][temp_n - 1];
				}
			}
			sta_LCD_Graphic_BUF[temp_i][temp_n] = 0;
		}
	}
	else
	{	// In this way, every row need to manipulate
		// First Row
		temp_i = tempStartRowIndex;
		if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
		{
			for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; 
				  temp_n < ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; temp_n++)
			{
				sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] << (HMI_ROW_WIDTH - tempRowRemain_Start)) >> (HMI_ROW_WIDTH - tempRowRemain_Start)) | 
					((sta_LCD_Graphic_BUF[temp_i][temp_n + 1] >> tempRowRemain_Start) << tempRowRemain_Start);
			}
			}
		else
		{
			for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; 
				  temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
			{
				sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] << (HMI_ROW_WIDTH - tempRowRemain_Start)) >> (HMI_ROW_WIDTH - tempRowRemain_Start)) | 
					((sta_LCD_Graphic_BUF[temp_i][temp_n - 1] >> tempRowRemain_Start) << tempRowRemain_Start);
			}
		}
		sta_LCD_Graphic_BUF[temp_i][temp_n] = (sta_LCD_Graphic_BUF[temp_i][temp_n] << (HMI_ROW_WIDTH - tempRowRemain_Start)) >> (HMI_ROW_WIDTH - tempRowRemain_Start);

		// Middle rows, if it has
		if (tempRowNUM > 2)
		{
			for (temp_i = tempStartRowIndex + 1; temp_i < tempLastRowIndex; temp_i++)
			{
				if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
				{
					memcpy((sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX),
							(sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX + 1), 
							temp_width - 1);
				}
				else
				{
					for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; 
						  temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
					{
						sta_LCD_Graphic_BUF[temp_i][temp_n] = sta_LCD_Graphic_BUF[temp_i][temp_n - 1];
					}
				}
				sta_LCD_Graphic_BUF[temp_i][temp_n] = 0;		
			}
		}

		// Last Row, if it has
		if (0 != tempRowRemain_End)
		{
			if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
			{
				for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; 
					  temp_n < ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; temp_n++)
				{
					sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End) | 
						((sta_LCD_Graphic_BUF[temp_i][temp_n + 1] << (HMI_ROW_WIDTH - tempRowRemain_End)) >> (HMI_ROW_WIDTH - tempRowRemain_End));
				}
			}
			else
			{
				for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; 
					  temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
				{
					sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End) | 
						((sta_LCD_Graphic_BUF[temp_i][temp_n - 1] << (HMI_ROW_WIDTH - tempRowRemain_End)) >> (HMI_ROW_WIDTH - tempRowRemain_End));
				}
			}
			sta_LCD_Graphic_BUF[temp_i][temp_n] = (sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End;
		}
		else
		{
			if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
			{
				memcpy((sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX),
						(sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX + 1), 
						temp_width - 1);
			}
			else
			{
				for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; 
					  temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
				{
					sta_LCD_Graphic_BUF[temp_i][temp_n] = sta_LCD_Graphic_BUF[temp_i][temp_n - 1];
				}
			}
			sta_LCD_Graphic_BUF[temp_i][temp_n] = 0;
		}
	}
	
	HMI_Data_TX(sta_LCD_Graphic_BUF[tempStartRowIndex] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX, 
				(tempRowNUM  - 1) * HMI_WIDTH_PIX + temp_width);

	return FINISHED;
}

ErrorStatus HMI_Draw_Image_Shift(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY, ImageShiftDirect direction)
{
	struct_HMI_Queue *foundQueueSlot_CMD = NULL;
	struct_HMI_Queue *foundQueueSlot_Data = NULL;
	struct_HMI_Draw_Para_Image_Shift *HMI_Draw_Para = NULL;
	struct_HMI_CMD_Para *HMI_CMD_Para = NULL;
	uint8_t *HMI_CMD_Stream = 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_IMAGE_SHIFT_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_Image_Shift));
	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->endX = endX;
	HMI_Draw_Para->endY = endY;
	HMI_Draw_Para->startX = startX;
	HMI_Draw_Para->startY = startY;
	HMI_Draw_Para->direction = direction;

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

	return SUCCESS;
}

ErrorStatus HMI_Display_Blank(void)
{
	struct_HMI_Queue *foundQueueSlot;
		// Fill in the HMI to do list queue with configuration task 
	foundQueueSlot = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
	if (foundQueueSlot != NULL)
	{
	//	sta_QueueIndex = foundQueueSlot - gHMI_Queue;	// sta_QueueIndex should start at gHMI_Queue (0), but ...
		foundQueueSlot->HMI_Func_Para = malloc(sizeof(struct_HMI_CMD_Para));
		if (NULL != foundQueueSlot->HMI_Func_Para)
		{
			foundQueueSlot->HMI_Function_Index = ENUM_HMI_CMD_STREAM;
			((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataList = (uint8_t *)const_HMI_Display_Blank;
			((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataLen = sizeof(const_HMI_Display_Blank);	//HMI_STARTUP_CONFIG_LEN;
		}
		else
		{
			foundQueueSlot->HMI_Function_Index = ENUM_HMI_NULL;
			FLAG_HEAP_FULL = SET;
			return ERROR;
		}
	}
	else
	{
		FLAG_HMI_QUEUE_FULL = SET;
		return ERROR;
	}
	return SUCCESS;
}

ErrorStatus HMI_StartUp_Logo(void)
{
	// And finally a logo task
	return HMI_Draw_Pic(HMI_STARTUP_LOGO_ID, 0, 0, HMI_WIDTH_PIX, HMI_HEIGHT_PIX);
}

ErrorStatus newBLBlink(uint16_t blinkInterval, uint16_t blinkNumber)
{
	struct_HMI_Queue *foundQueueSlot;
	// Add back light blink test task
	foundQueueSlot = HMI_Find_Queue_Slot(HMI_TASK_TYPE_NO_BUS);
	if (NULL == foundQueueSlot)
	{
		return ERROR;
	}
	foundQueueSlot->HMI_Func_Para = malloc(sizeof(struct_HMI_BL_Test));
	if (NULL != foundQueueSlot->HMI_Func_Para)
	{
		foundQueueSlot->HMI_Function_Index = ENUM_BL_BLINK;
		((struct_HMI_BL_Test *)(foundQueueSlot->HMI_Func_Para))->Interval = blinkInterval;
		((struct_HMI_BL_Test *)(foundQueueSlot->HMI_Func_Para))->Number = blinkNumber;
		HMI_BL_Test_Stage = 0;
	}
	else
	{
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	return SUCCESS;
}

ErrorStatus HMI_StartUp_BL_Test(void)
{
	return newBLBlink(MAX_BL_TEST_BLINK_INTER, MAX_BL_TEST_BLINK_NUM);
}


WorkingStatus HMI_BL_Blink(void *HMI_Draw_Para)
{
	static uint32_t sta_LastTime;
	
	if (0 == HMI_BL_Test_Stage)
	{
		sta_LastTime = gSystem_1ms_CNT;
		LCD_BACKLIGHT_ON;
		HMI_BL_Test_Stage++;
	}
	else
	{
		if (((uint32_t)(gSystem_1ms_CNT - sta_LastTime)) > (((struct_HMI_BL_Test *)HMI_Draw_Para)->Interval))
		{
			sta_LastTime = gSystem_1ms_CNT;
			if (LSB_MASK & HMI_BL_Test_Stage)
			{
				LCD_BACKLIGHT_OFF;
			}
			else
			{
				LCD_BACKLIGHT_ON;
			}
			HMI_BL_Test_Stage++;
		}
	}
	
	if (HMI_BL_Test_Stage > (((struct_HMI_BL_Test *)HMI_Draw_Para)->Number))
	{
		LCD_BACKLIGHT_OFF;
		return FINISHED;
	}
	else
	{
		return WORKING;
	}
}

ErrorStatus HMI_Set_Color_Type(char *const_HMI_Color_Type_CMD)
{
	struct_HMI_Queue *foundQueueSlot;

	foundQueueSlot = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
	if (NULL == foundQueueSlot)
	{
		return ERROR;
	}

	foundQueueSlot->HMI_Func_Para = malloc(sizeof(struct_HMI_CMD_Para));
	if (NULL != foundQueueSlot->HMI_Func_Para)
	{
		foundQueueSlot->HMI_Function_Index = ENUM_HMI_CMD_STREAM;
		((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataList = (uint8_t *)const_HMI_Color_Type_CMD;
		((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataLen = strlen(const_HMI_Color_Type_CMD);	//HMI_STARTUP_CONFIG_LEN;
	}
	else
	{
		foundQueueSlot->HMI_Function_Index = ENUM_HMI_NULL;
		FLAG_HEAP_FULL = SET;
		return ERROR;
	}
	return SUCCESS;
}

// The one end with ex will NOT clear GRAM in STM32
// One task
void ClearScreen(HMIDrawColor style)
{
	memset(sta_LCD_Graphic_BUF[0], (style == HMI_COLOR_WHITE ? NULL : 0xFF), MAX_DISPLAY_BUF);
	HMI_Display_Blank();
}

void HMI_Initial(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	uint8_t temp_QueueIndex;
	// Pull up RST Pin
	GPIO_SetBits(LCD_RST_PORT, LCD_RST_PIN);	
	// Empty the HMI to do list queue
	sta_QueueIndex = 0;
	sta_QueueIndex_NoBus = 0;
	Flag_HMI_General_G01 = 0;
	FLAG_HMI_QUE

⌨️ 快捷键说明

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