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

📄 12864.h

📁 12864液晶操作C语言程序.rar
💻 H
字号:
void delay(uint x)//11.0592M延时函数10uS
{
	uint a,b;
	for(a=x;a>0;a--)
	for(b=8;b>0;b--);
}
/*写指令到LCD*/
/*RS=L,RW=L,E=H脉冲,D0--D7=指令码。*/
void write_cmd(uchar cmd)
{
	LCD_EN=0;
	busyloop();
	LCD_RS=0;
	LCD_RW=0;
	LCD_EN=0;
	P0=cmd;
	delay(2);
	LCD_EN=1;
	LCD_EN=0;
}
/*写数据到LCD*/
/*RS=H,RW=L,E=H脉冲,D0--D7=指令码。*/
void write_dat(uchar dat)
{
	LCD_EN=0;
	busyloop();
	LCD_RS=1;
	LCD_RW=0;
	P0=dat;
	delay(1);
	LCD_EN=1;
	LCD_EN=0;
}
/*读数据*/
/*RS=H,RW=H,E=H脉冲,D0--D7=指令码。*/
uchar read_dat()
{
	uchar dat;
	LCD_EN = 0;
	busyloop();
	LCD_RS = 1; 
	LCD_RW = 1;
 	LCD_EN = 1;
	dat=P0;
	return (dat);
}

/*设定显示位置*/
void lcd_pos(uchar X,uchar Y)//X行 Y列
{
   uchar pos;
   if(X==0)
     {X=0x80;}
   else if(X==1)
     {X=0x90;}
   else if(X==2)
     {X=0x88;}
   else if(X==3)
     {X=0x98;}
   	pos=X+Y;
   write_cmd(pos);//显示地址
}  

/*LCD初始化设置*/
void lcd_int()
{  
   RST=1;
   LCD_PSB=1;//并口方式
   write_cmd(0x30);//基本操作
   write_cmd(0x0c);//开显示,关光标
   write_cmd(0x01);//清屏
}
void busyloop() //忙检测
{  
	LCD_RS=0; 
   	LCD_RW=1; 
   	LCD_EN=1; 
   	Lcd=0xff; 
   	while((Lcd&0x80)==0x80); 
   	LCD_EN=0; 
} 
void photodisplay1(uchar *bmp) //由下向上移动显示
{ 
	uchar i,j,*add;
	//write_cmd(0x34); //写数据时,关闭图形显示
	for(i=32;i>0;i--)//下半平面显示
	{ 
		add=bmp+16*(i+31);
		write_cmd(0x80+i-1);
		write_cmd(0x88);
		for(j=0;j<16;j++) 
		{
			write_dat(*add++);
 			//delay(300);//调节显示快慢
		}
	}
	for(i=32;i>0;i--)
	{  	
		add=bmp+16*(i-1);// 上平面显示
		write_cmd(0x80+i-1); //先写入水平坐标值
		write_cmd(0x80); //写入垂直坐标值
		for(j=0;j<16;j++) //再写入两个8位元的数据 
		{
			write_dat(*add++);
			//delay(300); 
		}
	}
	//write_cmd(0x36); //写完数据,开图形显示 	
}

void photodisplay(uchar *bmp)//由上下移动显示 
{ 
	uchar i,j;
	//write_cmd(0x34); //写数据时,关闭图形显示	
	for(i=0;i<32;i++)// 上平面显示
	{
		write_cmd(0x80+i); //先写入水平坐标值
		write_cmd(0x80); //写入垂直坐标值
		for(j=0;j<16;j++) //再写入两个8位元的数据 
		{
			write_dat(*bmp++);
			//delay(300); 
		}
	}

	for(i=0;i<32;i++)//下半平面显示
	{ 
		write_cmd(0x80+i);
		write_cmd(0x88);
		for(j=0;j<16;j++) 
		{
			write_dat(*bmp++); 
			//delay(300);
		}
	}
	//write_cmd(0x36); //写完数据,开图形显示 
}
void play() //清屏
{ 
	uchar i,j;
	write_cmd(0x34); //写数据时,关闭图形显示	
	for(i=0;i<32;i++)
	{
		write_cmd(0x80+i); //先写入水平坐标值
		write_cmd(0x80); //写入垂直坐标值
		for(j=0;j<16;j++) //再写入两个8位元的数据 
		write_dat(0); 
	}
	for(i=0;i<32;i++)
	{ 
		write_cmd(0x80+i);
		write_cmd(0x88);
		for(j=0;j<16;j++) 
		write_dat(0); 
	}
	write_cmd(0x36); //写完数据,开图形显示 
}

void Point(uchar x,uchar y,uchar flag)//画点  (0,0,127,63)
{       
	uchar x_Dyte,x_byte,GDRAM_hbit;                       //定义列地址的字节位,及在字节中的哪1位  
	uchar y_Dyte,y_byte,GDRAM_lbit;                       //定义为上下两个屏(取值为0,1),行地址(取值为0~31) 
	write_cmd(0x36);                       //绘图模式命令 
	/***X,Y坐标互换,即普通的X,Y坐标***/ 
	x_Dyte=x/16;                               //计算在16个字节中的哪一个 
	x_byte=x&0x0f;                             //计算在该字节中的哪一位 
	y_Dyte=y/32;                               //0为上半屏,1为下半屏 
	y_byte=y&0x1f;                             //计算在0~31当中的哪一行 
	
	write_cmd(0x80+y_byte);                //设定行地址(y坐标) 
	write_cmd(0x80+x_Dyte+8*y_Dyte);       //设定列地址(x坐标),并通过8*y_Dyte选定上下屏                     
	read_dat(); 
	GDRAM_hbit=read_dat();                    //读取当前显示高8位数据 
	GDRAM_lbit=read_dat();                    //读取当前显示低8位数据   
	if(flag==1) 
	{  
		write_cmd(0x80+y_byte);                //设定行地址(y坐标) 
	 	write_cmd(0x80+x_Dyte+8*y_Dyte);       //设定列地址(x坐标),并通过8*y_Dyte选定上下屏 
	 	if(x_byte<8)                                   //判断其在高8位,还是在低8位 
	 	{ 
	      	write_dat(GDRAM_hbit|(0X01<<(7-x_byte)));   //显示GDRAM区高8位数据 
	  		write_dat(GDRAM_lbit);                      //显示GDRAM区低8位数据  
	 	} 
	    else 
	    { 
	    	write_dat(GDRAM_hbit); 
	      	write_dat(GDRAM_lbit|(0x01<<(15-x_byte))); 
	    }  
	} 
	else 
	{ 
		write_cmd(0x80+y_byte);                //设定行地址(y坐标) 
		write_cmd(0x80+x_Dyte+8*y_Dyte);       //设定列地址(x坐标),并通过8*y_Dyte选定上下屏                     
	    if(x_byte<8)                                             //判断其在高8位,还是在低8位 
	    { 
	    	write_dat(GDRAM_hbit & ~(0X01<<(7-x_byte)));     //显示GDRAM区高8位数据 
	        write_dat(GDRAM_lbit);                             //显示GDRAM区低8位数据  
	    } 
	    else 
	    { 
	        write_dat(GDRAM_hbit); 
	        write_dat(GDRAM_lbit & ~(0x01<<(15-x_byte))); 
	    }  
	}
}  

int fabs1(char a)//求绝对值函数
{   
	char b;
	if(a>=0)b=a;
	else b=-a;
	return (b);	
}

void Line(uchar x0,uchar y0,uchar x1,uchar y1)//划线(0,0,127,63) 
{ 
	int temp; 
	int dx,dy;               //定义起点到终点的横、纵坐标增加值 
	int s1,s2,status,i; 
	int Dx,Dy,sub; 	
	dx=x1-x0; 
	if(dx>=0)s1=1;                  //X的方向是增加的 
	else s1=-1;                //X的方向是降低的 	      
	dy=y1-y0;                 //判断Y的方向是增加还是降到的 
	if(dy>=0)s2=1;
	else s2=-1;	   
	Dx=fabs1(x1-x0);           //计算横、纵标志增加值的绝对值 
	Dy=fabs1(y1-y0); 
	if(Dy>Dx)               //                
	{                     //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0  
		temp=Dx; 
		Dx=Dy; 
		Dy=temp; 
		status=1; 
	}  
	else status=0;	 	
	/********判断垂直线和水平线*****/
	//if(dx==0)                 //横向上没有增量,画一条水平线 
	  //GUI_XLine(x0,y0,y1,1); 
	//if(dy==0)                 //纵向上没有增量,画一条垂直线 
	  //GUI_YLine(x0,y0,x1,1); 	
	/*********Bresenham算法画任意两点间的直线***/
	sub=2*Dy-Dx;               //第1次判断下个点的位置 
	for(i=0;i<Dx;i++) 
	{  
		Point(x0,y0,1);           //画点  
		if(sub>=0)                              
		{  
			if(status==1)x0+=s1;              //在靠近Y轴区,x值加1 			 
			else  y0+=s2;                //在靠近X轴区,y值加1              			  
			sub-=2*Dx;               //判断下下个点的位置  
		}  
		if(status==1)y0+=s2; 	  
		else x0+=s1;      	 
		sub+=2*Dy;  	     
	}  
}  
/**************************************************************************** 
* 名称:plotC(int x,int y,int xc,int yc,unsigned char colour) 
* 功能:八分点画圆函数 
* 入口参数:x                指定线起点所在行的位置 
*           y           指定线起点所在列的位置 
*          color             显示颜色(对于黑白色LCM,为0时灭,为1时显示) 
* 出口参数:无 
****************************************************************************/ 
void plotC(int x,int y,int xc,int yc,unsigned char colour) 
{ 
	Point(xc+x,yc+y,colour); 
	Point(xc+x,yc-y,colour); 
	Point(xc-x,yc+y,colour); 
	Point(xc-x,yc-y,colour); 
	Point(xc+y,yc+x,colour); 
	Point(xc+y,yc-x,colour); 
	Point(xc-y,yc+x,colour); 
	Point(xc-y,yc-x,colour); 
} 
void Circle(int xc,int yc,int r,unsigned char colour)//画圆  xc, yc圆心 r半径 
{ 
    int x,y,d; 
    y = r; 
    d = 3 - (r + r); 
    x = 0; 
    while(x <= y) 
    { 
        plotC(x,y,xc,yc,colour); 
        if(d < 0) d += (x + x + x + x) + 6;           
        else 
        { 
            d+=((x - y) + (x - y) + (x - y) + (x - y)) + 10; 
            y = y - 1; 
        } 
        x = x + 1; 
    } 
} 
void Draw(uchar x,uchar y,const uchar *pin) 
{                              //画16x16的图画。X,Y   图画左上角坐标
	uchar i,j; 
	uchar X_byte=x/16;       //计算在列的那个位元上(一行共16个位元) 
	uchar Y_Dyte=y/31;         //上下屏标志位 
	uchar Y_byte=y&0x1f;        //0~31行中哪一行   
  	for(j=0;j<16;j++) 
  	{  
    	write_cmd(0x80+Y_byte+j);       //计算行地址 
    	write_cmd(0x80+X_byte+8*Y_Dyte);   //8*Y_Dyte上下屏标志,确定列地址  
        delay(1);   
        write_dat(*pin++);         //显示高8位数据 
        write_dat(*pin++);         //显示低8位数据 
  	}   
} 



⌨️ 快捷键说明

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