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

📄 240_320tft_lcd.c

📁 利用三星s3c2410的LCD接口实现TFT彩色LCD的显示
💻 C
📖 第 1 页 / 共 2 页
字号:
		}	
	}
	else //dx<0
	{   dx=-dx;		//dx=abs(dx)
		if(dy >= 0){ // dy>=0
			if(dx>=dy){ // 4/8 octant
			   e=dy-dx/2;
			   while(x1>=x2){PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;}	 x1-=1; e+=dy;}
		      }
		    else{		// 3/8 octant
				e=dx-dy/2;
				while(y1<=y2){PutPixel(x1,y1,color);if(e>0){x1-=1;e-=dy;}	y1+=1;e+=dx;}
			}
		}
		else		   // dy<0
		{		dy=-dy;   // dy=abs(dy)
			if(dx>=dy) // 5/8 octant
			{ e=dy-dx/2;
			  while(x1>=x2){ PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;}	x1-=1; e+=dy;
				}
			}
			else		// 6/8 octant
			{
				e=dx-dy/2;
				while(y1>=y2)
				{
					PutPixel(x1,y1,color);
					if(e>0){x1-=1;e-=dy;}	
					y1-=1;
					e+=dx;
				}
			}
		}	
	}
}

/**************************************************************
在LCD屏幕上画一个矩形
**************************************************************/
/*
static void Glib_Rectangle(int x1,int y1,int x2,int y2,int color)
{
    Glib_Line(x1,y1,x2,y1,color);
    Glib_Line(x2,y1,x2,y2,color);
    Glib_Line(x1,y2,x2,y2,color);
    Glib_Line(x1,y1,x1,y2,color);
}
*/
/**************************************************************
在LCD屏幕上用颜色填充一个矩形 (x1,y1) (x2,y2)对角线
**************************************************************/
void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color)
{
    int i;

    for(i=y1;i<=y2;i++)
	Glib_Line(x1,i,x2,i,color);
}



 void Glib_Rectangle(int x1,int y1,int x2,int y2,int color)
{
	Glib_Line(x1,y1,x2,y1,color);
	Glib_Line(x2,y1,x2,y2,color);
	Glib_Line(x2,y2,x1,y2,color);
	Glib_Line(x1,y2,x1,y1,color);
}



void Lcd_Tft_240_320_Init( void )
{
    Lcd_Port_Init();
    Lcd_Init();
    Lcd_EnvidOnOff(1);		//turn on vedio

	Lcd_ClearScr(0xffff);		//fill all screen with some color
	
	#define LCD_BLANK		16
	#define C_UP		( LCD_XSIZE_TFT_240_320 - LCD_BLANK*2 )
	#define C_RIGHT		( LCD_XSIZE_TFT_240_320 - LCD_BLANK*2 )
	#define V_BLACK		( ( LCD_YSIZE_TFT_240_320 - LCD_BLANK*4 ) / 6 )
	
//static void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color)	
/*    Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT_240_320 - LCD_BLANK ), ( LCD_YSIZE_TFT_240_320 - LCD_BLANK ),0x0000);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff);		//fill a Rectangle with some color
  */ 
    Lcd_MoveViewPort(0,0);

}

/**************************************************************
**************************************************************/
void Test_Lcd_Tft_240_320( void )
{
	#ifdef DEBUG
    	Uart_Printf("\nTest 240*320 TFT LCD !\n");
	#endif	

    Lcd_Port_Init();
    Lcd_Init();
    Lcd_EnvidOnOff(1);		//turn on vedio

	Lcd_ClearScr(0xffff);		//fill all screen with some color
	#define C_UP		( LCD_XSIZE_TFT_240_320 - LCD_BLANK*2 )
	#define C_RIGHT		( LCD_XSIZE_TFT_240_320 - LCD_BLANK*2 )
	#define V_BLACK		( ( LCD_YSIZE_TFT_240_320 - LCD_BLANK*4 ) / 6 )
	
	Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT_240_320 - LCD_BLANK ), ( LCD_YSIZE_TFT_240_320 - LCD_BLANK ),0x0000);		//fill a Rectangle with some color

	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f);		//fill a Rectangle with some color
	Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff);		//fill a Rectangle with some color
    Uart_Printf( "LCD color test, please look! press any key to continue!\n" );
    Uart_Getch() ;		//wait uart input

    Lcd_ClearScr(0xffff);		//fill all screen with some color
    //Paint_Bmp( 0,0,240,320, bitmap0 ) ;		//paint a bmp
    MoveViewPort();
    Lcd_MoveViewPort(0,0);
    
}
//*************************************************************
















//===============================[LCD 字体显示]==========================================

// 功能: 16*16字模点阵LCD点打出程序 
// 输入: 字模地址

void LCD_16_16_block_show(int x,int y,U32 zimo_address,U16 color)
 { U8 i,j,k;
   int piex_x_addr;        //LCD打点的行地址
   int piex_y_addr;        //LCD打点的列地址 
   for(i=0;i<16;i++){      //16*16点阵的16行 
       for(j=0;j<2;j++){   //一行的2个8byte
         for(k=0;k<8;k++){ //一个byte的八个LCD点
             piex_x_addr = x + k+ 8*j;     
             piex_y_addr = y + i ;
             if ( (piex_x_addr < SCR_XSIZE_TFT_240_320) && (piex_y_addr < SCR_YSIZE_TFT_240_320) )
                {  if((piex_x_addr>=0)&&(piex_y_addr>=0))
                      { if(CHINESE_RAM_BUFFER[zimo_address+2*i+j] & (0x80>>k))
	                       { LCD_BUFER[piex_y_addr][piex_x_addr] = color;
	                         }  
	                    else LCD_BUFER[piex_y_addr][piex_x_addr] =LCD_WINDOWS_COPY[piex_y_addr][piex_x_addr];   
	                   }
	            }   
         }//third for
      }   //second for
   }      //first for
 }

void LCD_16_16_block_show_backcolor(int x,int y,U32 zimo_address,U16 color)
 { U8 i,j,k;
   int piex_x_addr;        //LCD打点的行地址
   int piex_y_addr;        //LCD打点的列地址 
   for(i=0;i<16;i++){      //16*16点阵的16行 
       for(j=0;j<2;j++){   //一行的2个8byte
         for(k=0;k<8;k++){ //一个byte的八个LCD点
             piex_x_addr = x + k+ 8*j;     
             piex_y_addr = y + i ;
             if ( (piex_x_addr < SCR_XSIZE_TFT_240_320) && (piex_y_addr < SCR_YSIZE_TFT_240_320) )
                {  if((piex_x_addr>=0)&&(piex_y_addr>=0))
                      { if(CHINESE_RAM_BUFFER[zimo_address+2*i+j] & (0x80>>k))
	                       { LCD_BUFER[piex_y_addr][piex_x_addr] = color;
	                         }  
	                    else LCD_BUFER[piex_y_addr][piex_x_addr] =LCD_BUFER[piex_y_addr][piex_x_addr];   
	                   }
	            }   
         }//third for
      }   //second for
   }      //first for
 }
 
void LCD_Puts(int x,int y,char *pt,U16 color)
{  U8 i=0;
   U32 chinese;
   int addr_x = x;
   int addr_y = y;
   while(pt[i])
   {    
       if(pt[i]>128){ //为汉字
          chinese =((pt[i]-0xa1)*94 + (pt[i+1]-0xa1))*32;
          LCD_16_16_block_show(addr_x,addr_y,chinese,color);
          addr_x += 16;
          i +=2;
        }
       else{                                                          //为ASC码
            if(pt[i]==32)  LCD_16_16_block_show(addr_x,addr_y,0,color); //空格
            else if(pt[i]=='\n') {                                      //回车换行
              addr_y += 16; 
              }
            else if(pt[i]>32 && pt[i]<127){//为英文字
             //为ASC码字符表和GB2312-80编码表 相差三个区,三十二位!!
             LCD_16_16_block_show(addr_x,addr_y,((3-1)*94+(pt[i]-32-1))*32,color);
             }
            else LCD_16_16_block_show(addr_x,addr_y,((3-1)*94+(31-1))*32,color); //GB2312-80区位编码表 ? 第三区第三十一位(?)
            addr_x += 16;
            i++;
         }
   }
}



//=====================================================================
//If you don't use vsprintf(), the code size is reduced very much.
typedef int *__va_list[1];
int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);


void LCD_String_Set(int x ,int y,U16 color)
{
  LCD_string_start_addr_x = x;
  LCD_string_start_addr_y = y;
  LCD_string_color =color;
}

// 配合LCD_string_set使用。
void LCD_Printf(char *fmt, ...)
{  
    char LCD_string[256];   //LCD 汉字显示字符串。
    va_list ap;
    va_start(ap,fmt);
    vsprintf(LCD_string,fmt,ap); 
    LCD_Puts( LCD_string_start_addr_x,LCD_string_start_addr_y,LCD_string,LCD_string_color);   
    va_end(ap);
}



void Load_HZK16_Whole( U32  HZK16_start_address)
{
    int bad_block;
    U32 chinese_size;
    U32 CHINESE_RAM_BUFFER_offset = 0;
             
    if(HZK16_start_address<=0x04000000)
         {  for(chinese_size=0 ; chinese_size<=HZK_16_SIZE ; ) 
               {
                bad_block = ReadOnePageFromNandFlash(HZK16_start_address,CHINESE_RAM_BUFFER+CHINESE_RAM_BUFFER_offset);
                HZK16_start_address +=512*(1 + bad_block);
                CHINESE_RAM_BUFFER_offset +=512;
                chinese_size += 512;                  
               }         
         } 
}


void LCD_Windows_Backup(void)
{   int i;
    int j;
    lcd_window_start_point  lcd_window_start_point1;
    lcd_window_start_point1=Get_LcdViewPort_StartPoint();
    
    for(i=0;i<LCD_YSIZE_TFT_240_320;i++) 
      for(j=0;j<LCD_XSIZE_TFT_240_320;j++) 
         LCD_WINDOWS_COPY[i][j]=LCD_BUFER[lcd_window_start_point1.Y+i][lcd_window_start_point1.X+j];   
}


⌨️ 快捷键说明

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