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

📄 -

📁 实验19 LCD12864_串行方式
💻
📖 第 1 页 / 共 2 页
字号:
** 函数说明 :可以有半屏显示和全屏显示两种模式,可以自行修改
** 画图方式为从左到右扫描,从上到下,每写一个字节后行地址加一,每写玩16个字节,即128个点(如果半屏显示8个字节,64个点)列地址加一
** 点阵取点方式为从左到右,从上到下,高位在前,低为在后
** 入口参数 :绘画的图片的首地址
** 出口参数 :无
*********************************************************************************************************/
void PHO_Display(const unsigned char *s) 
{ 
	uchar COUNT3 = 0X02,COUNT1,COUNT2,LCD_X = 0X80,LCD_Y;
		 
	for (;COUNT3 != 0;COUNT3 --) 
	{ 
		LCD_Y = 0X80; //上半屏
		COUNT2 = 0X20;//32 
		for(;COUNT2 != 0;COUNT2 --) 
		{ 
	//		COUNT1 = 0X10;//8个16*16点阵单元 显示全屏		
			COUNT1 = 0X08;//4个16*16点阵单元 显示半屏 华师logo
			Write_12864_Com(0x34); 
			Write_12864_Com(LCD_Y); 
			Write_12864_Com(LCD_X); 
			Write_12864_Com(0x30); 
			for (;COUNT1 != 0;COUNT1 --) 
			{ 
				Write_12864_Data(*s ++); 		
			} 
			LCD_Y += 1; 
		} 
		LCD_X = 0X88; //下半屏
	} 
	Write_12864_Com(0x36); 
	Write_12864_Com(0x30); 
}
/*另外一种打点画图程序*/
void img_displeft(const unsigned char *img)  //  注意0---31,0---31上下分半
{
	unsigned char i,j,m,n;
	for(j = 0;j < 32;j ++)
	{
		for(i = 0;i < 4;i ++)
		{
			 Write_12864_Com(0x34); //扩展指令,显示绘图
			 Write_12864_Com(0x80 + j); //更新坐标
			 Write_12864_Com(0x80 + i);
			 Write_12864_Com(0x30); //基本指令集
			 Write_12864_Data(img[j * 8 + i *2 ]);  //高字节
			 Write_12864_Data(img[j * 8 + i * 2 + 1]); //低字节
		}
	}  
	for(n = 0;n < 32;n ++)
	{
		for(m = 0;m < 4;m ++)
		{
			 Write_12864_Com(0x34); //扩展指令,显示绘图
			 Write_12864_Com(0x80 + n); //更新坐标
			 Write_12864_Com(0x88 + m);
			 Write_12864_Com(0x30); //基本指令集
			 Write_12864_Data(img[n * 8 + 256 + m * 2]);  //高字节
			 Write_12864_Data(img[n * 8 + 256 + m * 2 + 1]); //低字节
		}
	}
	Write_12864_Com(0x36); //扩充功能指令,开绘图开关。
}

/*********************************************************************************************************
** 函数功能 :整屏显示竖条
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void LcdFill_Vertical()
{  
	uchar x,y,i;
	for(i=0;i<9;i=i+8)   
	for(y=0;y<0x20;y++)
	{     
		for(x=0;x<8;x++)
		{ 
			Write_12864_Com(0x36);   //扩充指令 绘图显示
			Write_12864_Com(y+0x80);       //行地址
			Write_12864_Com(x+0x80+i);     //列地址     
			Write_12864_Data(0x55);   //写数据 D15-D8 
			Write_12864_Data(0x55);   //写数据 D7-D0  
			Write_12864_Com(0x30);
		}
	} 
}
/*********************************************************************************************************
** 函数功能 :整屏显示横条
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void LcdFill_Level()
{ 
	uchar x,y,i;
	uchar k;   
	for(i=0;i<9;i+=8)    
	for(y=0;y<0x20;y++)
	{     
		if((y%2)==1) k=0xff;
		else k=0;
		for(x=0;x<8;x++)
		{  
			Write_12864_Com(0x36);   //扩充指令 绘图显示
			Write_12864_Com(y+0x80); //行地址
			Write_12864_Com(x+0x80+i); //列地址            
			Write_12864_Data(k);
			Write_12864_Data(k);
			Write_12864_Com(0x30);
		}
	}     
}

/*********************************************************************************************************
** 函数功能 :整屏充满亮点或暗点
** 函数说明 :当i=0时显示上面128×32,当i=8时显示下面128×32
**			  当i=0时显示上面128×32,当i=8时显示下面128×32
** 入口参数 :state: 0x00 正屏显示亮点
**			  state: 0xFF 正屏显示暗点
** 出口参数 :无
*********************************************************************************************************/
void Lcd_Fill(uchar state)
{  
	uchar x,y,i;
	for(i=0;i<9;i=i+8)   
	for(y=0;y<0x20;y++)
	{     
		for(x=0;x<8;x++)
		{ 
			Write_12864_Com(0x36);   //扩充指令 绘图显示
			Write_12864_Com(y+0x80);       //行地址
			Write_12864_Com(x+0x80+i);     //列地址     
			Write_12864_Data(state);   //写数据 D15-D8 
			Write_12864_Data(state);   //写数据 D7-D0  
			Write_12864_Com(0x30);
		}
	} 
}

/*********************************************************************************************************
** 函数功能 :清除12864内部的CGRAM
** 函数说明 :当屏幕之前通过CGRAM绘图,可以调用此函数来清除CGRAM中的内容
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void Clear_12864(void)
{
	uchar COUNT3 = 0X02,COUNT1,COUNT2,LCD_X = 0X80,LCD_Y;
		 
	for (;COUNT3 != 0;COUNT3 --) 
	{ 
		LCD_Y = 0X80; 
		COUNT2 = 0X20;//32 
		for(;COUNT2 != 0;COUNT2 --) 
		{ 
			COUNT1 = 0X10;//16 
			Write_12864_Com(0x34); 
			Write_12864_Com(LCD_Y); 
			Write_12864_Com(LCD_X); 
			Write_12864_Com(0x30); 
			for (;COUNT1 != 0;COUNT1 --) 
			{ 
				Write_12864_Data(0x00); 		
			} 
			LCD_Y += 1; 
		} 
		LCD_X = 0X88; 
	} 
	Write_12864_Com(0x36); 
	Write_12864_Com(0x30); 	
}
/*********************************************************************************************************
** 函数功能 :在屏幕上打上一个点,屏幕像素是128*64
** 函数说明 :打点范围不要超过坐标范围,这个函数用来为后面的画直线和其他函数服务
** 入口参数 :待写入的整数
** 出口参数 :无
*********************************************************************************************************/
void Set_12864_Point(uchar x,uchar y)
{
	uchar x_byte,x_bit,y_byte,y_bit;
	uchar date1,date2;//存储读回的数据
	x &= 0x7F;//限制在液晶屏幕的范围内
	y &= 0x3F;

	x_byte = x / 16;//算出在那个字节
	x_bit = x & 0x0f;	//算出是哪一位

	y_byte = y / 32;
	y_bit = y & 0x3f;

	Write_12864_Com(extern_commod);	
	Write_12864_Com(0x80 + y_bit);
	Write_12864_Com(0x80 + x_byte + 8 * y_byte);

	Read_12864_Data();//先空读一次?不知道为什么
	date1=Read_12864_Data();
	date2=Read_12864_Data();
	Write_12864_Com(extern_commod);
	Write_12864_Com(0x80 + y_bit);
	Write_12864_Com(0x80 + x_byte + 8 * y_byte);
	if(x_bit < 8)
	{
		Write_12864_Data(date1 | (0x01 << (7-x_bit) ) );
		Write_12864_Data(date2);
	}
	else 
	{
		Write_12864_Data(date1);	
		Write_12864_Data(date2 | (0x01 << (15-x_bit) ) );
	}
	Write_12864_Com(draw_on);
	Write_12864_Com(basic_commod);	
}
/*********************************************************************************************************
** 函数名称 :void LCD_12864_DrawLine(uint x1, uint y1, uint x2, uint y2)
** 函数功能 :在12864屏幕上画一条直线
** 函数说明 :因分辨率较低,斜线并不完美
** 入口参数 :x1:起点横坐标
			  y1:起点纵坐标
			  x2:终点横坐标		   
			  y2:终点纵坐标
** 出口参数 :当前的键盘值
*********************************************************************************************************/
void LCD_12864_DrawLine(uint x1, uint y1, uint x2, uint y2)
{
	uint t; 
	int xerr = 0,yerr = 0,delta_x,delta_y,distance; 
	int incx,incy,uRow,uCol; 

	delta_x = x2-x1; //计算坐标增量 
	delta_y = y2-y1; 
	uRow = x1; 
	uCol = 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 ++ )//画线输出 
	{  
		Set_12864_Point(uRow,uCol);//画点 
		xerr += delta_x ; 
		yerr += delta_y ; 
		if(xerr > distance) 
		{ 
			xerr -= distance; 
			uRow += incx; 
		} 
		if(yerr > distance) 
		{ 
			yerr -= distance; 
			uCol += incy; 
		} 
	}  
}  	 

⌨️ 快捷键说明

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