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

📄 lcd.c~

📁 UCOS-II ATMEGA128 移殖
💻 C~
📖 第 1 页 / 共 2 页
字号:
void Lcd_disp_a_h(unsigned char *data_str,unsigned char x,unsigned char y,unsigned char mode)
{
	unsigned int data_hz;
	unsigned char data_ascii;
	while (*data_str)
	{

		if(y>112||x>6)
			continue;		
		if(chkbit(*data_str,7))
		{
			data_hz = *data_str++;
			data_hz = (data_hz<<8)|*data_str++; 
			Lcd_disp_hz(data_hz,x,y,mode);
			y += 16;
		}
		else
		{
			data_ascii = *data_str++;
			Lcd_disp_ascii(data_ascii,x,y,mode);
			y += 8;
		}
	}

} 


void Lcd_dispf_a_h(unsigned char flash *data_str,unsigned char x,unsigned char y,unsigned char mode)
{
	unsigned int data_hz;
	unsigned char data_ascii;
	while (*data_str)
	{

		if(y>112||x>6)
			return;		
		if(chkbit(*data_str,7))
		{
			data_hz = *data_str++;
			data_hz = (data_hz<<8)|*data_str++; 
			Lcd_disp_hz(data_hz,x,y,mode);
			y += 16;
		}
		else
		{
			data_ascii = *data_str++;
			Lcd_disp_ascii(data_ascii,x,y,mode);
			y += 8;
		}
	}
	while (y<=128)
	{
		Lcd_disp_ascii(' ',x,y,mode);
		y += 8;
	}
	

}

/******************************************************************************************
				在一个矩形窗口内显示一串文本
 in	:	data_str	-	要显示的汉字内码字符串
 		x1,y1		-	窗口左上角的坐标 (0~6,0~127)
 		x2,y2		-	窗口右下角的坐标 (0~6,0~127)
 		mode		-	显示模式
 						0正常模式
 						1反显模式
 						2裁减模式-超出窗口长度部分裁减
 						4闪烁模式
 					注:显示模式可以组合 eg:0x00|0x01|0x02|0x04
******************************************************************************************/
void Lcd_outtextxyf(unsigned char flash *data_str,unsigned char x1,unsigned char y1,
			unsigned char x2,unsigned char y2,unsigned char mode)
{
	unsigned int data;
	unsigned char x,y;
	
	if((y1>127)||(x1>7))
		return;
	if(y2>127)
		y2 = 127;
	if(x2>7)
		x2 = 7;
	x = x1;
	y = y1;
	while(*data_str)
	{		
		data = *data_str++;
		data = (data<<8)|*data_str++;
		if(y > (y2-16))
		{
			y = y1;
			x += 2;
		}
		if(((x > x2) && chkbit(mode,1)) || (x>6))
			continue;		
		Lcd_disp_hz(data,x,y,mode);
		y += 16;
	}
}


/******************************************************************************************
				显示图象
				
 note	:	x1,x2,y1,y2应与实际的图象大小匹配,否则无法正确显示
 
 in	:	pic_data_ptr	-	图象数据指针
 		data_len	-	图象数据长度
 		x1,y1		-	图象左上角坐标(0~7,0~127)
 		x2,y2		-	图象右下角坐标(0~7,0~127)
 		mode		-	显示模式(0正常,1反显)
******************************************************************************************/
void Lcd_disp_picf(unsigned char flash *pic_data_ptr,unsigned int data_len,unsigned char x1,
			unsigned char y1,unsigned char x2,unsigned char y2,unsigned char mode)
{
	unsigned char i,j;
	unsigned char data;
	unsigned char cs_bck,cs;
	
	#asm("wdr");
	
	if((y1>127)||(x1>7))
		return;
	if(y2>127)
		y2 = 127;
	if(x2>7)
		x2 = 7;
	if(y1>63)
		cs_bck = 2;
	else	cs_bck = 1;
	
	for(i=x1;i<x2+1;i++)
	{
		cs = cs_bck;
		Lcd_set_addr(i,cs,0);
		Lcd_set_addr(y1,cs,1);
		for(j=y1;j<y2+1;j++)
		{
			if(data_len == 0)
				return;
			data_len--;
			data = *pic_data_ptr++;
			if(chkbit(mode,0))
				data = ~data;
			if((j>63)&&(cs == 1))
			{
				cs = 2;
				Lcd_set_addr(i,cs,0);
				Lcd_set_addr(j-64,cs,1);
			}
			Lcd_write_data(data,cs);
		}
	}
} 

void Lcd_disp_buffer(unsigned char *pic_data_ptr,unsigned int data_len,unsigned char x1,
			unsigned char y1,unsigned char x2,unsigned char y2,unsigned char mode)
{
	unsigned char i,j;
	unsigned char data;
	unsigned char cs_bck,cs;
	
	if((y1>127)||(x1>7))
		return;
	if(y2>127)
		y2 = 127;
	if(x2>7)
		x2 = 7;
	if(y1>63)
		cs_bck = 2;
	else	cs_bck = 1;
	
	for(i=x1;i<x2+1;i++)
	{
		cs = cs_bck;
		Lcd_set_addr(i,cs,0);
		Lcd_set_addr(y1,cs,1);
		for(j=y1;j<y2+1;j++)
		{
			if(data_len == 0)
				return;
			data_len--;
			data = *pic_data_ptr++;
			if(chkbit(mode,0))
				data = ~data;
			if((j>63)&&(cs == 1))
			{
				cs = 2;
				Lcd_set_addr(i,cs,0);
				Lcd_set_addr(j-64,cs,1);
			}
			Lcd_write_data(data,cs);
		}
	}
}

/******************************************************************************************
				闪烁显示预处理
 note	:	1.目前只支持16X16字符的闪烁显示
 		2.以像素为单位的图象的闪烁显示暂不支持(太耗代码空间hehe)
 		3.本函数应用到全局变量Flash_data_buf与Flash_data_pos
 		4.部分重叠的两个闪烁字符后一个会覆盖前一个
 		5.x,y指的是字符左上角的像素坐标
 		6.本函数模块内专用,上层程序不要调用本函数
 
 in	:	code	-	汉字内码
 		x	-	闪烁字符页地址 0~7(bit7活动位)
 		y	-	闪烁字符Y地址 0~127
 		mode	-	显示模式
******************************************************************************************/
void Lcd_flash_preproc(unsigned int code,unsigned char x,unsigned char y,unsigned char mode)
{
	unsigned char i;
	unsigned char write_flag=0;
	unsigned char write_pos;
	unsigned char empty_flag=0;
	unsigned char search_flag=0;
	
	
	for(i=0;i<32;i++)
	{
		if(chkbit(Flash_data_buf[i].x,7))
		{
			if((abs_c(clrbit(Flash_data_buf[i].x,7)-x)<16)&&
				(abs_c(Flash_data_buf[i].y - y)<16))
			{				
				if(chkbit(mode,2))
				{
					if(search_flag == 0)
					{
						write_pos = i;
						search_flag = 1;
					}
					else
					{
						Flash_data_buf[i].x = clrbit(Flash_data_buf[i].x,7);
					}
				}
				else
				{
					Flash_data_buf[i].x = clrbit(Flash_data_buf[i].x,7);
				}
			}			
		}
		else
		{
			if(empty_flag == 0)
			{
				empty_flag = 1;
				write_pos = i;
				write_flag = 1;
			}
		}
	}
	if(chkbit(mode,2))
	{
		if((write_flag)||(search_flag))
		{
			Flash_data_buf[write_pos].code = code;
			Flash_data_buf[write_pos].x = setbit(x,7);
			Flash_data_buf[write_pos].y = y;
			Flash_data_buf[write_pos].mode = clrbit(mode,2);
		}
	}
}        



void Lcd_flash_preproc_ascii(unsigned char code,unsigned char x,unsigned char y,unsigned char mode)
{
	unsigned char i;
	unsigned char write_flag=0;
	unsigned char write_pos;
	unsigned char empty_flag=0;
	unsigned char search_flag=0;
	
	
	for(i=0;i<64;i++)
	{
		if(chkbit(Flash_data_buf_ascii[i].x,7))
		{
			if((abs_c(clrbit(Flash_data_buf_ascii[i].x,7)-x)<16)&&
				(abs_c(Flash_data_buf_ascii[i].y - y)<8))
			{				
				if(chkbit(mode,2))
				{
					if(search_flag == 0)
					{
						write_pos = i;
						search_flag = 1;
					}
					else
					{
						Flash_data_buf_ascii[i].x = clrbit(Flash_data_buf_ascii[i].x,7);
					}
				}
				else
				{
					Flash_data_buf_ascii[i].x = clrbit(Flash_data_buf_ascii[i].x,7);
				}
			}			
		}
		else
		{
			if(empty_flag == 0)
			{
				empty_flag = 1;
				write_pos = i;
				write_flag = 1;
			}
		}
	}
	if(chkbit(mode,2))
	{
		if((write_flag)||(search_flag))
		{
			Flash_data_buf_ascii[write_pos].code = code;
			Flash_data_buf_ascii[write_pos].x = setbit(x,7);
			Flash_data_buf_ascii[write_pos].y = y;
			Flash_data_buf_ascii[write_pos].mode = clrbit(mode,2);
		}
	}
}

/******************************************************************************************
				清除一个16X16大小的区域
******************************************************************************************/
void Lcd_clr(unsigned char x,unsigned char y)
{
	unsigned char i,j;
	unsigned char d_data;
	unsigned char cs;
	unsigned char cs_bck=1;
	unsigned char draw_y;
	
	if(y>127)
		return;
	else if(y>63)
	{
		y -= 64;
		cs_bck = 2;
	}
	x = clrbit(x,7);	
	for(i=0;i<2;i++)
	{
		draw_y = y;
		cs = cs_bck;
		x += i;
		if(x>7)
			break;
		Lcd_set_addr(x,cs,0);
		Lcd_set_addr(y,cs,1);
		for(j=0;j<8;j++)
		{
			d_data = 0x00;
			Lcd_write_data(d_data,cs);
			draw_y++;
			if((draw_y > 63)&&(cs == 1))
			{
				cs = 2;
				Lcd_set_addr(x,cs,0);
				Lcd_set_addr(draw_y-64,cs,1);
			}
			else if((draw_y >63)&&(cs == 2)&&(cs_bck == 2))
			{
				break;
			}
		}
	}
}


/******************************************************************************************
				闪烁显示
 note	:	1.该函数必须应用于主循环中
 		2.本函数应用到的全局变量
 			Flash_data_buf
 			Flash_state
 			Lcd_flash_timer
 		3.闪烁频率定为500ms闪烁一次
******************************************************************************************/
void Lcd_flash(void)
{
	unsigned char i;
	
	unsigned char x,y,mode;
	unsigned int code;
	
	if(Lcd_flash_timer)
		return;
	Lcd_flash_timer = 100;
	
	if(Flash_state)
	{
		for(i=0;i<64;i++)
		{
			if(chkbit(Flash_data_buf[i].x,7))
				Lcd_clr(Flash_data_buf[i].x,Flash_data_buf[i].y);
		}
	}
	else
	{
		for(i=0;i<64;i++)
		{
			if(chkbit(Flash_data_buf[i].x,7))
			{
				x = Flash_data_buf[i].x;
				y = Flash_data_buf[i].y;
				code = Flash_data_buf[i].code;
				mode = Flash_data_buf[i].mode;
				Lcd_disp_hz(Flash_data_buf[i].code,Flash_data_buf[i].x,Flash_data_buf[i].y,Flash_data_buf[i].mode);
			}
		}
	}
	Flash_state = !Flash_state;	
}   

void Lcd_flash_ascii(void)
{
	unsigned char i;
	
	unsigned char x,y,mode;
	unsigned char code;
	
	if(Lcd_flash_timer)
		return;
	Lcd_flash_timer = 100;
	
	if(Flash_state_ascii)
	{
		for(i=0;i<64;i++)
		{
			if(chkbit(Flash_data_buf_ascii[i].x,7))
				Lcd_clr(Flash_data_buf_ascii[i].x,Flash_data_buf_ascii[i].y);
		}
	}
	else
	{
		for(i=0;i<64;i++)
		{
			if(chkbit(Flash_data_buf_ascii[i].x,7))
			{
				x = Flash_data_buf_ascii[i].x;
				y = Flash_data_buf_ascii[i].y;
				code = Flash_data_buf_ascii[i].code;
				mode = Flash_data_buf_ascii[i].mode;
				Lcd_disp_ascii(Flash_data_buf_ascii[i].code,Flash_data_buf_ascii[i].x,Flash_data_buf_ascii[i].y,Flash_data_buf_ascii[i].mode);
			}
		}
	}
	Flash_state_ascii = !Flash_state_ascii;	
} 

/*
*********************************************************************************
*	data_str:   显示字符串地址
*	x,y			字符串显示起始位置
*	mode:		显示模式(	0x0		|	0x01	|	0x02)
*						    正常			反显			是否换行
*	
*********************************************************************************
*/

void char_disp_buffer(unsigned char flash *data_str,unsigned char x,unsigned char y, unsigned char mode)
{
	unsigned char hz_pos;    
	unsigned int code;
	unsigned char x_bck,y_bck;
	unsigned char i;
	x_bck = x;
	y_bck = y;
	
	while(*data_str)
	{ 
		x_bck = x;
		//y_bck = y;
		if(chkbit((*data_str),7)&&(y<112))
		{
			code = *data_str++;
			code = (code<<8)|*data_str++;
			for(hz_pos=0;hz_pos<Db_len;hz_pos++)
			{
				if(code == Hz_16[hz_pos].index)
				{
					for(i=0;i<32;i++)
					{
						if(i==16)
						{
							x_bck++;
		  					y_bck=y;
		  				}
		  				if(chkbit(mode,1))
		  					Disp_buffer[x_bck][y_bck++] = ~Hz_16[hz_pos].data[i];
		  				else
		  					Disp_buffer[x_bck][y_bck++] = Hz_16[hz_pos].data[i];
		  			}
					break;
				}
			}
			if(hz_pos == Db_len)
				continue;
			y += 16;
		}
		else 
		{
			for(i=0;i<16;i++)
			{
				if(i==8)
				{
					x_bck++;
					y_bck=y;
				}
				if(chkbit(mode,1))
					Disp_buffer[x_bck][y_bck++] = ~Ascii_16[*data_str][i];
				else
					Disp_buffer[x_bck][y_bck++] = Ascii_16[*data_str][i];
			}
			*data_str++;
          	y += 8;
		}
		if((chkbit((*data_str),7)&&(y>=112))||(y>=120))
			break;
	}
	if(y<128)
	{
		x_bck = x;
		y_bck = y;
		for(i=0;i<2;i++)
		{
			while(y_bck<128)
			{
				if(chkbit(mode,1))
				Disp_buffer[x_bck][y_bck++] = 0xff;
				else
				Disp_buffer[x_bck][y_bck++] = 0x0;
			}
			x_bck++;
			y_bck=y;
		}
	} 
}

⌨️ 快捷键说明

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