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

📄 dsp_lcd.c

📁 2812触摸屏的底层操作子函数!已经通过使用!
💻 C
字号:
void Dot(unsigned int x, unsigned int y, unsigned int color)
{
	//----------------------------------------------
   	// 画点时,先输入x和y的坐标值,再输入颜色值
   	// 当x或y的值写入行列地址寄存器时,需要加上偏移量
   	//----------------------------------------------
	Lcd.x = X_bias + x;	
	Lcd.y = Y_bias + y;	
	Lcd.data = color;
}

void Line(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1,
		  unsigned int color)
{
	unsigned int j, tmp;
	int dx, dy, n, k, i, x, y, f;
	
		
	if(y0 == y1)
	{
		
		if(x0 >= x1)	{	tmp = x0;	x0 = x1;	x1 = tmp;	}		
				
		// 初始化起始点、终止点、和线的颜色值
	   	
	   	Lcd.x = X_bias + x0-1;
		Lcd.y = Y_bias + y0;		 
		Lcd.cmd.all = bit6 + bit1;
		for(j = x0; j <=x1; j++)
		{	
			Lcd.data = color;			
			asm(" RPT	#32 || NOP ");			// 延时语句		
		}
	}
	else
	{
	    dx = abs(x1 - x0);    dy = abs(y1 - y0);    n = dx + dy;
	    if(x1 >= x0)    { k = y1 >= y0 ? 1 : 4; x = x0; y = y0; }
	    else            { k = y1 >= y0 ? 2 : 3; x = x0; y = y1; }
	    for(i = 0, f = 0; i < n; i++)
	    {
	    	if(f >= 0)
	            switch(k){
	                       case 1: Dot(x++, y, color); f -= dy; if(dx == 0){ x--; i--; } break;
	                       case 2: Dot(x, y++, color); f -= dx; if(dy == 0){ y--; i--; } break;
	                       case 3: Dot(x--, y, color); f -= dy; break;
	                       case 4: Dot(x, y--, color); f -= dx; break;
	                     }
	        else
	            switch(k){
	                       case 1: Dot(x, y++, color); f += dx; break;
	                       case 2: Dot(x--, y, color); f += dy; break;
	                       case 3: Dot(x, y--, color); f += dx; break;
	                       case 4: Dot(x++, y, color); f += dy; break;
	                     }
	    }
	}		
}

void Clearlcd(unsigned int color)
{
	unsigned int x, y;	
	
	for(y = 0; y < 480; y++)				// (行*列) 640 * 480 
	{
		//----------------------------------------------
	   	// 采用自动功能写时,每行要提前1,当读时要后延1
	   	// 下面采用的是行自动加1功能
	   	//----------------------------------------------
		Lcd.x = X_bias-1;		//系统硬件决定
		Lcd.y = Y_bias + y;		 
		Lcd.cmd.all = bit6 + bit1;
		for(x = 0; x < 640; x++)
		{	
			Lcd.data = color;			
			asm(" RPT	#32 || NOP ");
		}
	}
}

void Disp_pho(unsigned int x0, unsigned int y0, const unsigned int * sta_addr,
				unsigned int color)
{
    unsigned int char_byte, high, wide, i, j, p = 0, k, tmp, T;
    int x = x0, y = y0;
    
    // 获取字模特征字,然后字模指针加一,进入字模首字
    tmp = *sta_addr++;	
    
    // 特征字中,高字节为字宽,低字节为字高		
    wide = (tmp & 0xFF00) >> 8;	
    high = tmp & 0x00FF; 
    
    // 从第一行开始写点作用
    for( k = 0; k < high; k++)			// 高即为行
    {   
    	// 从第一列开始写点     
        for( j = 0; j < wide; j++,p++)	// 宽即为列
        {
        	// 仅当为第一行时,取字模的首字	
        	if(!k) { T = *sta_addr;	}         	
        	
        	if((p >> 3) % 2 == 0) 		// 取当前字的高字节
        	{ char_byte = (T & 0xFF00) >> 8; }        	
        	
        	else						// 取当前字的低字节,字模指针下移一个字
        	{ char_byte = T & 0x00FF; T = *(++sta_addr); }        	
        	
            for( i = 0; i < 8; i++)		// 从左到右依次写点
            {
            	// 仅当当前字节的当前位为真时,写点
                if((char_byte & 0x80) == 0x80) 	Dot(x, y, color);
                char_byte = char_byte << 1;     x++; 
                if(i < 7) { j++; p++; }	// 之所以到6,是因为上一级循环体中也会加一
            }
        }
        x = x0; y++;
    }
}

void Rect(int x0, int y0, int x1, int y1, unsigned int color)
{
	
    Line(x0, y0, x1, y0, color);
    
    Line(x1, y0, x1, y1, color);

    Line(x0, y0, x0, y1, color);

    Line(x0, y1, x1, y1, color);    
}

void color_fill(int x0, int y0, int x1, int y1, unsigned int color)
{
	int i;
	for(i=y0;i<=y1;i++)
	Line(x0, i, x1, i, color);
}

//---------------------------------------------------------
void Button(int x0,unsigned int color)
{
	Line(x0,6,x0,25,color);
	Line(x0,6,x0+6,0,color);
	Line(x0+5,0,x0+80,0,color);
	Line(x0+80,0,x0+86,6,color);
	Line(x0+86,6,x0+86,25,color);
}

void Check_Mold(int x0,int y0,int flag) //flag:1感叹 2错误 3完成
{
//	Rect(x0,y0,x0+300,y0+120,lime);
//	Rect(x0+1,y0+1,x0+299,y0+119,lime);
	color_fill(x0,y0,x0+300,y0+120,aqua);
//	Rect(x0+2,y0+21,x0+298,y0+118,black);
	color_fill(x0+2,y0+21,x0+298,y0+118,black);
	if(flag==1)
	{
		Disp_pho(x0+10,y0+30,tx3,yellow);
		Disp_pho(x0+26,y0+41,tx4,black);
		
		Rect(x0+50,y0+90,x0+112,y0+110,white);
		Rect(x0+185,y0+90,x0+247,y0+110,white);
		Disp_pho(x0+65,y0+92,hz21,blue);
		Disp_pho(x0+200,y0+92,hz22,blue);
	}
	else if(flag==2)
	{
		Disp_pho(x0+10,y0+30,tx5,red);
		Rect(x0+119,y0+90,x0+181,y0+110,white);
		Disp_pho(x0+134,y0+92,hz21,blue);

	}
	else if(flag==3)
	{
		Disp_pho(x0+10,y0+30,tx6,green);
		Rect(x0+119,y0+90,x0+181,y0+110,white);
		Disp_pho(x0+134,y0+92,hz21,blue);

	}

}






⌨️ 快捷键说明

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