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

📄 lcd_gui.c

📁 STM32+ov7670
💻 C
📖 第 1 页 / 共 2 页
字号:
				LCD_DATA_OUT(Bk_Clr);
			}
		#endif
		}
	}
	LCD_WR_END();
	
	LCD_SetWindow(0, 0, X_END, Y_END);		//恢复全屏作图区域					
}
void Set_HZWindow(unsigned int Start_X, unsigned int Start_Y)
{
	unsigned int X_Region	= 0;
	unsigned int Y_Region	= 0;
#if LCD_CHAR_HORIZONTAL > 0
	Start_X <<= 4;								//一个英文字符占区域为8*16			
	Start_Y <<= 4;
	
	X_Region = Start_X + 15;					//一行可以显示30个字符				
	Y_Region = Start_Y + 15;					//一列可以显示20个字符				
#else 
	Start_X <<= 4;								//一个英文字符占区域为8*16			
	Start_Y <<= 4;
	
	X_Region = Start_X + 15;					//一行可以显示15个字符				
	Y_Region = Start_Y + 15;					//一列可以显示40个字符	
#endif
	LCD_SetWindow(Start_X, Start_Y, X_Region, Y_Region);
}

void LCD_WriteHZ(unsigned int Start_X, unsigned int Start_Y,
				   	unsigned int Char_Clr,
				    unsigned int Bk_Clr,
				    unsigned char *p_str)
{
	
	unsigned char nowchar = *p_str ++;

	while( nowchar != 0 )	
	{	
	unsigned char show_cnt = 0;
	unsigned char bit_cnt = 0;
	signed char temp = 0;
	nowchar -= 48;	
	Set_HZWindow(Start_X, Start_Y);			//设置起始坐标,xy是16*16的方格坐标	
	LCD_WriteGRAM_EN();
	for(show_cnt = 0; show_cnt < 32; show_cnt ++)
	{										//->	1010 1100 	->				
											//->	1100 1000	->...	
		if(show_cnt & BIT(0))
		{
			temp = 1;
		}
		else
		{
			temp = -1;
		}
					
		for(bit_cnt = 0; bit_cnt < 8; bit_cnt ++)
		{
			
		#if LCD_CHAR_HORIZONTAL > 0
			if( HZtable[nowchar][show_cnt] & BIT(7 - bit_cnt) )
			{
				LCD_DATA_OUT(Char_Clr);
			}
			else
			{
				LCD_DATA_OUT(Bk_Clr);
			}
		#else
			if( HZtable[nowchar][31-show_cnt + temp] & BIT(7-bit_cnt) )
			{
				LCD_DATA_OUT(Char_Clr);
			}
			else
			{
				LCD_DATA_OUT(Bk_Clr);
			}
		#endif
		}
	}
	LCD_WR_END();
	LCD_SetWindow(0, 0, X_END, Y_END);		//恢复全屏作图区域
	nowchar = *p_str ++;
	Start_Y += 1;
	}				
}

void LCD_WriteString(unsigned char Start_X, unsigned char Start_Y,
					unsigned int Char_Clr,
				    unsigned int Bk_Clr,
					unsigned char *p_str,
					unsigned char is_transp)
{
	#if LCD_CHAR_HORIZONTAL > 0
	#else
		Start_X = CHAR_X_NUM - Start_X - 1;
		Start_X = (s8)Start_X;
	#endif
	while(*p_str)
	{
		//计算坐标							
		if(*p_str == '\n')					//换行								
		{
			Start_X = 0;
			Start_Y ++;
			p_str ++;						//调过换行符,不用显示				
			continue;						//查询下一个字符					
		}
		else 								//未遇到换行符则按正常显示坐标自加	
		{
			//显示字符							
			if(is_transp)					//如果字符不为0则限制显示定长个字符	
			{								//调用显示单个字符显示函数(较慢)	
				LCD_WriteMenuChar(Start_X, Start_Y,
					   	  	  Char_Clr, Bk_Clr,
				   	  		  *p_str);
			}
			else 
			{
				LCD_WriteChar(Start_X, Start_Y,	//调用显示普通字符显示函数(较快)	
					   	  Char_Clr, Bk_Clr,
				   	  	  *p_str);
			}
		#if LCD_CHAR_HORIZONTAL > 0
			Start_X ++;
			if(Start_X == CHAR_X_NUM)
			{
				Start_X = 0;
        		Start_Y ++;
				if(Start_Y == CHAR_Y_NUM)
				{
					Start_Y = 0;
				}
			}
		#else
			Start_Y ++;
			if(Start_Y == CHAR_Y_NUM)
			{
				Start_Y = 0;
        		Start_X --;
				if(Start_X < 0)
				{
					Start_X = CHAR_X_NUM - 1;
				}
			}
		#endif
			
		}
		
		//字符串指针自加					
		p_str ++;
	}
}
////////////////////////////////////////////
//文本输出函数,前景色和背景色已经固定,使用块
//写,目的是达到的最快的文本显示				
void LCD_Print(const unsigned char *p_str)
{
	static unsigned char XLine = 0;
	static unsigned char YLine = 0;
//设置画笔前景和背景色						
# define CHAR_CLR		0x0000
# define BK_CLR			0x07E0			
	while(*p_str)
	{
		//计算坐标							
		if(*p_str == '\n')					//换行								
		{
			XLine = 0;
			YLine ++;
			p_str ++;						//调过换行符,不用显示				
			continue;						//查询下一个字符					
		}
		else 								//未遇到换行符则按正常显示坐标自加	
		{
			//如果不是换行符则显示字符		
			LCD_WriteChar(XLine, YLine,		//调用显示普通字符显示函数(较快)	
					  CHAR_CLR, BK_CLR,
				   	  *p_str);
		#if LCD_CHAR_HORIZONTAL > 0
			XLine ++;						//行号加1							
			if(XLine == CHAR_X_NUM)
			{
				XLine = 0;					//写满一行后行号清零				
				YLine ++;					//写满一行后列号加1					
				if(YLine == CHAR_Y_NUM)
				{
					YLine = 0;
					LCD_Clear(BK_CLR);
				}
			}
		#else 
			YLine ++;						//行号加1							
			if(YLine == CHAR_Y_NUM)
			{
				YLine = 0;					//写满一行后行号清零				
				XLine ++;					//写满一行后列号加1					
				if(XLine == CHAR_X_NUM)
				{
					XLine = 0;
					LCD_Clear(BK_CLR);
				}
			}
		#endif
		}
		
		//字符串指针自加					
		p_str ++;
	}
}
//数字显示函数								
const unsigned char Number[] = {'0', '1', '2', '3','4', '5', '6', '7','8', '9', 
								'A', 'B', 'C', 'D', 'E', 'F'};
void LCD_WriteNumber(unsigned long data, unsigned char ch_Dot)
{
# define DIGIT_SHOW		10					//最多可以显示10位
	signed char digit_sum=0;
	signed char digit=0;
	
	static unsigned char NumberBuffer[] = "0123456789";
	for(digit_sum = 0; digit_sum < DIGIT_SHOW; digit_sum ++)
	{
		digit = data%10;					//求取最低位						
		data /= 10;							//十进制左移						
		NumberBuffer[digit_sum]=Number[digit];
		if(data == 0)
		{
			break;							//如果已经移到了最高位则跳出循环	
		}
	}
	for(digit = 0; digit <= digit_sum; digit ++)
	{
	#if LCD_CHAR_HORIZONTAL > 0
		LCD_WriteChar(digit,0,0,1234,NumberBuffer[digit_sum - digit]);
	#else
		LCD_WriteChar(0,digit,0,1234,NumberBuffer[digit_sum - digit]);
	#endif
	}
}
//
void LCD_WriteHexNumber(u16 x, u16 y, unsigned long data, unsigned char is_cap)
{
# define DIGIT_SHOW		10					//最多可以显示10位
	signed char digit_sum=0;
	signed char digit=0;
	
	static unsigned char NumberBuffer[] = "ff ff ff ff ff ff";
	for(digit_sum = 0; digit_sum < DIGIT_SHOW; digit_sum ++)
	{
		digit = data%16;					//求取最低位						
		data /= 16;							//十进制左移						
		
		if(!(digit_sum % 3))
		{
			NumberBuffer[digit_sum ++] = ' ';
		}
		NumberBuffer[digit_sum]=Number[digit];
		
		if(data == 0)
		{
			break;							//如果已经移到了最高位则跳出循环	
		}
	}
	if(digit_sum == 2)
	{
		NumberBuffer[digit_sum] = '0';
		digit_sum += 1;
	}
	for(digit = 0; digit <= digit_sum; digit ++)
	{
		LCD_WriteChar(x, y+digit,0,1234,NumberBuffer[digit_sum - digit]);
	}
}

⌨️ 快捷键说明

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