📄 240_320tft_lcd.c
字号:
}
}
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 + -