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

📄 lcd320240.h

📁 LCD320240的AVR单片机驱动程序,显示的字模需行列式取模,液晶驱动芯片是1335
💻 H
📖 第 1 页 / 共 2 页
字号:
            contain <<= (8-x_end_mode); 
        
            for(j=locate_y;j<y_end;j++)
            {
                data_begin=read_data(x_begin,j,area);//因为前后都是同一个字节 
                data_end=data_begin;
                data_begin >>= (x_begin_mode);
                data_begin <<= (x_begin_mode); 
                data_end <<= (x_end_mode);
                data_end >>= (x_end_mode);
                display_char( x_begin,j,area,contain|(data_begin|data_end) );
            }    
        } 
        else  
        for(j=locate_y;j<y_end;j++)
        {
            data_begin=read_data(x_begin,j,area);
        
            data_begin >>= (x_begin_mode);
            data_begin <<= (x_begin_mode);
        
            contain_begin=contain;
            contain_begin <<= (8-x_begin_mode);
            contain_begin >>= (8-x_begin_mode);
                
            display_char( x_begin, j, area, contain_begin|data_begin );
            
            LCD_locate_xy(x_begin+1,j,area);	
            for(i=x_begin+1;i<x_end;i++)
            {  
                LCD_write_cmd( MWRITE );                    // 当前位置写入数据指令 
                LCD_write_data( contain );                // 写入显示字符代码       
            }
         
            data_end=read_data(x_end,j,area);
        
            data_end <<= (x_end_mode);
            data_end >>= (x_end_mode);
        
            contain_end=contain;
            contain_end >>= (8-x_end_mode);
            contain_end <<= (8-x_end_mode);
                
            display_char( x_end, j, area, contain_end|data_end );
        }
    }
    else
    {
        for(j=locate_y;j<locate_y+y;j++)
        for(i=locate_x;i<locate_x+x;i++)
        {
            display_char(i,j,1,0);
        }
    }
}        
//----------------------------------------------------------------------------- 

//在(locate_x,locate_y),(范围为40*240)处显示分辨率为x*y的图片
//-------------------------------------------------------------------------------
void draw_picture_flash(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar flash *bmp)
{
    uint i,j,k=0; 
    uint col=locate_x+x/8;
    uint row=locate_y+y;    
    
    for(i=locate_x;i<col;i++)    
    {        
        for(j=locate_y;j<row;j++)
        {
            LCD_locate_xy(i,j,area); 
            LCD_write_cmd( MWRITE ); 
		    LCD_write_data( bmp[k] );        
            k++;
        } 
    }
}
//--------------------------------------------------------------------------------  

//在(locate_x,locate_y),(范围达320*240)处显示分辨率为x*y的图片
//-------------------------------------------------------------------------------
void draw_anywhere(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar col_num,uchar flash *bmp)
{    
   uint  i,j,across;    
    uchar row_count=0;//已写行数
    uchar x_begin=locate_x>>3, x_end=x_begin+col_num; //算出长的前后地址
    uchar y_end=locate_y+y;                          //算出宽的末地址
    uchar x_begin_mode=0, x_end_mode=0;  //x前后端余数
    uchar data_begin=0, data_end=0;      //每一行的前后两端的字节数据 
    uchar bmp_begin=0,bmp_end=0;         //图片的开头结尾暂存
    uint  page_count=0,addr_exc=0,whole_exc=0;
    uchar row_buffer1[30],row_buffer2[30];//行显存 
    for(i=0;i<30;i++)
    {
        row_buffer1[i]=0;
        row_buffer2[i]=0;
    }

    /////////求出前后边沿偏移量///////////
    x_begin_mode = (8-locate_x%8);
    x_end_mode = 8-x_begin_mode; 
    
    for(j=locate_y;j<y_end;j++)
    { 
        ////////////读取前后边沿数据//////////////////////////
        data_begin=read_data(x_begin,j,area);  //读取开头边沿值       
        data_begin >>= x_begin_mode;
        data_begin <<= x_begin_mode;        
               
        data_end=read_data(x_end,j,area); //读取结尾边沿值      
        data_end <<= x_end_mode;
        data_end >>= x_end_mode;        
        
        //////////////////////循环横向跨写,写入显存row_buffer1///////////////////////////
		for(across=0; across<col_num; across++ )
		{   		    
		    whole_exc=across*y+row_count;
			row_buffer1[across] = bmp[whole_exc];
		}
		
		bmp_begin=row_buffer1[0];
        bmp_begin >>= (8-x_begin_mode);
        
        bmp_end=row_buffer1[across-1];
        bmp_end <<= 8-x_end_mode;
		
		//////////////////////////数据移位放进显存row_buffer2并写进LCD//////////////////////////////////////
		row_buffer2[0] = data_begin|bmp_begin;
		for(across=1; across<col_num; across++)//将缓冲区(一行)内容作右移
		{
		    row_buffer2[across] = (row_buffer1[across-1]<<x_begin_mode)|(row_buffer1[across]>>(8-x_begin_mode));
		}
		row_buffer2[across] = data_end|bmp_end;
				                   	              
		for(across=0;across<=col_num;across++)//将右移后的内容写入LCD	
		   display_char(x_begin+across,j,2,row_buffer2[across]);
		row_count++;		    
    }          
}
//--------------------------------------------------------------------------------  

//图像方式显示一串字符
//-------------------------------------------------------------------------------
void show_string ( uchar x, uchar y,uchar flash *string)
{
    uint i=0,temp;
    while(string[i])
    {
        temp=string[i]-32;
        temp<<=4;
        draw_picture_flash(x,y,2,8,16,ASCALL+temp);
        i++;
        x++;
    }    
}   
//-------------------------------------------------------------------------------

//显示整型数据n
//---------------------------------------------------------------------
void number(unsigned char x,unsigned char y,unsigned int n)
{
    unsigned char i=0,length=0,a[7]={0,0,0,0,0,0,0};
	unsigned int nx=n,j=0,temp;
	for(i=0;i<6;i++)
	{
	    if(nx>0)length++;
	    nx/=10;
	}
	nx=n;
    for(i=length;i>0;i--)
    {
        a[i-1]=nx%10+48;
        nx=nx/10;
    }
    if(n==0)a[0]='0';
    while(a[j])
    {
        temp=a[j]-32;
        temp<<=4;
        draw_picture_flash(x,y,2,8,16,ASCALL+temp);
        j++;
        x++;
    }    
} 
//--------------------------------------------------------------------- 

//功能:在第y行,x列处显示16进制数据n
//------------------------------------------------------------------------------------------ 
void number16(unsigned char x,unsigned char y,unsigned int n)
{
	unsigned char i=0,a[7]={0,0,0,0,0,0,0};
	unsigned int nx=n,j=0,temp;
	if(nx<=0xFF)
	{
		a[3]=nx%16;
		nx/=16;
		a[2]=nx%16;
		for(i=2;i<4;i++)
		{
			if(a[i]<10)a[i]+=48;
			else a[i]+=55;
		}
		a[4]=0x00;
	}
	else
	{
		a[5]=nx%16;
		nx/=16;
		a[4]=nx%16;
		nx/=16;
		a[3]=nx%16;
		nx/=16;
		a[2]=nx%16;
		for(i=2;i<6;i++)
		{
			if(a[i]<10)a[i]+=48;
			else a[i]+=55;
		}
	}
	a[1]='x';
	a[0]='0';
	while(a[j])
    {
        temp=a[j]-32;
        temp<<=4;
        draw_picture_flash(x,y,2,8,16,ASCALL+temp);
        j++;
        x++;
    }    
}  
//------------------------------------------------------------------------------------------ 

//显示浮点数
//---------------------------------------------------------------------
void number_float(unsigned char x,unsigned char y,float n)
{
	uchar i=0,numlength=0,xlength=0,zlength=0,flag=0;//numlength是数长,xlength是小数长度,zlength是整数长度
	uchar a[10]={0,0,0,0,0,0,0,0,0,0}; 
	uint  j,temp;
	float ftemp;
	long int ltemp=0;
	if(n<0)
	{
		n=-n;
		flag=1;
	}
	ftemp=n;
	//该循环计算出小数长度
	for(i=0;i<6;i++)
	{
		ltemp=ftemp;			//去掉小数
		if(ftemp>ltemp)
		{
			ftemp=ftemp*10;
			ltemp=ftemp;
			xlength++;
		}
	}
	ltemp=n;						//去掉小数
	//该循环计算出整数长zlength
	for(i=0;i<6;i++)
	{
		if(ltemp>=1)
		{
			ltemp=ltemp/10;
			zlength++;
		}
	}
	if(n<1)
		zlength=1;
	numlength=zlength+xlength;	//计算原数字及小数点的长度
	//将n去掉小数点放进ftemp
	ftemp=n;
	for(i=xlength;i>0;i--)
		ftemp=ftemp*10;
	//如果是负数,则置负号
	if(flag==1)
	{
		numlength++;
		zlength++;
	}
	//将ftemp变为长整型放进字符数组a[]
	ltemp=ftemp;
	for(i=numlength;i>zlength;i--)
	{
		a[i]=ltemp%10+48;
		ltemp/=10;
	}
	a[zlength]='.';
	for(i=zlength;i>0;i--)
	{
		a[i-1]=ltemp%10+48;
		ltemp/=10;
	}
	a[numlength+1]=0;
	ltemp=n;
	if(ltemp==n)a[numlength]=0x00;	//如果该n是整数则去掉小数点
	if(flag==1)a[0]='-';
	while(a[j])
    {
        temp=a[j]-32;
        temp<<=4;
        draw_picture_flash(x,y,2,8,16,ASCALL+temp);
        j++;
        x++;
    }    
}

//汉字显示
//------------------------------------------------------------------------------------------ 
void hanzi(uchar locate_x,uchar locate_y,uchar x,uchar y,uchar n,uchar flash *zi)
{  
    uchar i;
    uint zikuan=x/8,zichang=zikuan*y;
    for(i=0;i<n;i++)
    {
        draw_picture_flash(locate_x+zikuan*i,locate_y,2,x,y,zi+zichang*i);
    }
}   
//------------------------------------------------------------------------------------------ 

//在第y行,x列画一点
//------------------------------------------------------------------------------------------ 
void draw_dot(uint x,uint y)//会对文字模式进行返白
{
    uchar row,col,b,dot;
    uchar data;//读取该处原先的内容   
    col=x/8;
    row=y;    
    b=x%8;
    dot=0x80>>b;
    data=read_data(col,row,2);
    display_char(col,row,2,data|dot);
}
//------------------------------------------------------------------------------------------ 

//在第y行,x列擦除一点
//------------------------------------------------------------------------------------------ 
void clear_dot(uint x,uint y)
{
    uchar row,col,b,dot;
    uchar data;//读取该处原先的内容   
    col=x/8;
    row=y;    
    b=x%8;
    dot=0x80>>b;
    dot=~dot;
    data=read_data(col,row,2);
    display_char(col,row,2,data&dot);
}    
//------------------------------------------------------------------------------------------ 

//取绝对值
//------------------------------------------------------------------------------------------   
uint my_abs(float x)
{
    if(x>=0)return x;
    else return (-x);
}

//在第(x1,y1),(x2,y2)之间画直线
//------------------------------------------------------------------------------------------ 
void line(float x1,float y1,float x2,float y2)
{     
    int i=x1,j=y1;
    float a=(y2-y1)/(x2-x1),b=(y1-y2)*x1/(x2-x1)+y1;//方程y=ax+b的系数
    int step_x,step_y;
       
    if(x1<x2)step_x=1;
        else step_x=-1;  
    if(y1<y2)step_y=1;
        else step_y=-1;    
             
    if(my_abs(x2-x1)>=my_abs(y2-y1))  
    {
        for(i=x1;i!=x2;i+=step_x)
        {
            j=a*i+b;
            draw_dot(i,j);
        }    
    }
    else
    for(j=y1;j!=y2;j+=step_y)
    {
        i=(j-b)/a;
        draw_dot(i,j);
    }    
}
//------------------------------------------------------------------------------------------ 


//在第(x1,y1),(x2,y2)之间画矩形
//------------------------------------------------------------------------------------------ 
void box(uint x1,uint y1,uint x2,uint y2)
{     
    int x=x1,y=y1;
    int step_x,step_y;
       
    if(x1<x2)step_x=1;
        else step_x=-1;  
    if(y1<y2)step_y=1;
        else step_y=-1;
       
    for(x=x1;x!=x2;x+=step_x)
    {
        draw_dot(x,y1); 
        draw_dot(x,y2);
    }    
    for(y=y1;y!=y2+1;y+=step_y)
    {
        draw_dot(x1,y);
        draw_dot(x2,y);
    }  
}
//------------------------------------------------------------------------------------------   

//画圆
//------------------------------------------------------------------------------------------ 
void circuit(uint x1,uint y1,uint r)
{
    uint x,y,h;
    for(x=x1-r;x<=x1+r;x++)
    {   
        h=sqrt(r*r-(x-x1)*(x-x1));
        y=y1+h;
        draw_dot(x,y); 
        y=y1-h;
        draw_dot(x,y);
    }  
    for(y=y1-r;y<=y1+r;y++)
    {   
        h=sqrt(r*r-(y-y1)*(y-y1));
        x=x1+h;
        draw_dot(x,y); 
        x=x1-h;
        draw_dot(x,y);
    }
}

/*=========================================================================================*/ 

#endif  





























⌨️ 快捷键说明

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