//6*12大小 //在指定位置显示一个字符 //x:0~234 //y:0~308 //num:要显示的字符:" "--->"~" void TFT_ShowChar(u8 x,u16 y,u8 num) { #define MAX_CHAR_POSX 232 #define MAX_CHAR_POSY 304 u8 temp; u8 pos,t; if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return; //设定一个字符所占的大小 //开辟空间 LCD_WR_CMD(0x0050, x); // Horizontal GRAM Start Address LCD_WR_CMD(0x0051, x+5); // Horizontal GRAM End Address LCD_WR_CMD(0x0052, y); // Vertical GRAM Start Address LCD_WR_CMD(0x0053, y+11); // Vertical GRAM Start Address LCD_WR_CMD(32, x); LCD_WR_CMD(33, y); LCD_WR_REG(34); num=num-' '; for(pos=0;pos<12;pos++) { temp=asc2_1206[num][pos]; for(t=0;t<6;t++) { if(temp&0x01)LCD_WR_Data(POINT_COLOR); else LCD_WR_Data(BACK_COLOR); temp>>=1; } } }
//演示程序 void LCD_Test(unsigned char a) { unsigned long n; n=0; //初始化屏幕起始坐标 LCD_Control(100, 149, 100, 149, 'U'); while(n < 700) { LCD_WR_Data(a); n++; } }
/* 320 * ------------------- *| | *| | *| | 240 *| | *| | * ------------------- */ void ImagDisp(void) { uint16_t i, j; uint16_t Camera_Data; for(i = 0; i < 240; i++) { for(j = 0; j < 320; j++) { READ_FIFO_PIXEL(Camera_Data); /* 从FIFO读出一个rgb565像素到Camera_Data变量 */ LCD_WR_Data(Camera_Data); } } }
//画点 //x:0~239 //y:0~319 //POINT_COLOR:此点的颜色 void TFT_DrawPoint(u8 x,u16 y) { LCD_WR_CMD(0x0050, x); // Horizontal GRAM Start Address LCD_WR_CMD(0x0051, 0x00EF); // Horizontal GRAM End Address LCD_WR_CMD(0x0052, y); // Vertical GRAM Start Address LCD_WR_CMD(0x0053, 0x013F); // Vertical GRAM Start Address LCD_WR_CMD(32, x); // Horizontal GRAM Start Address LCD_WR_CMD(33, y); // Vertical GRAM Start Address LCD_WR_REG(34); LCD_WR_Data(POINT_COLOR); }
void TFT_Clear(u8 x,u16 y,u8 len,u16 wid) { u32 n,temp; LCD_WR_CMD(0x0050, x); // Horizontal GRAM Start Address LCD_WR_CMD(0x0051, x+len-1); // Horizontal GRAM End Address LCD_WR_CMD(0x0052, y); // Vertical GRAM Start Address LCD_WR_CMD(0x0053, y+wid-1); // Vertical GRAM Start Address LCD_WR_REG(34); temp=(u32)len*wid; for(n=0;n<temp;n++) LCD_WR_Data(BACK_COLOR); }
/*** 说 明:图片取模格式为水平扫描,16位颜色模式,取模软件img2LCD ***/ static void LCD_DrawPicture(uint16_t StartX, uint16_t StartY, uint8_t Dir, uint8_t *Pic) { uint16_t temp; uint16_t x = 0, y = 0; uint32_t i = 8, len = 0; x = ((uint16_t)(Pic[2] << 8) + Pic[3]) - 1; //从图像数组里取出图像的宽度 y = ((uint16_t)(Pic[4] << 8) + Pic[5]) - 1; //从图像数组里取出图像的高度 if (Dir == 0) { LCD_WR_CMD(0x0003, 0x1030); //图像显示方向为左上起,行递增,列增加 LCD_WR_CMD(0x0210, StartX); //水平显示区起始地址 0 LCD_WR_CMD(0x0211, StartX + x); //水平显示区结束地址 239 LCD_WR_CMD(0x0212, StartY); //垂直显示区起始地址 0 LCD_WR_CMD(0x0213, StartY + y); //垂直显示区结束地址 399 LCD_WR_CMD(0x0200, StartX); //水平显示区地址 0 LCD_WR_CMD(0x0201, StartY); //垂直显示区地址 0 } else if (Dir == 1) { LCD_WR_CMD(0x0003, 0x1018); //图像显示方向为左下起,行递增,列递减 LCD_WR_CMD(0x0210, StartY); //水平显示区起始地址 0 LCD_WR_CMD(0x0211, StartY + y); //水平显示区结束地址 239 LCD_WR_CMD(0x0212, StartX); //垂直显示区起始地址 0 LCD_WR_CMD(0x0213, StartX + x); //垂直显示区结束地址 239 LCD_WR_CMD(0x0200, StartY); //水平显示区地址 LCD_WR_CMD(0x0201, StartX + x); //垂直显示区地址 } LCD_WR_REG(0x0202); //写数据到显示区 len = 2 * (x + 1) * (y + 1); //计算出图像所占的字节数 while (i < (len + 8)) //从图像数组的第9位开始递增 { temp = (uint16_t)((Pic[i] << 8) + Pic[i+1]); //16位总线,需要一次发送2个字节的数据 LCD_WR_Data(temp); //将取出的16位像素数据送入显示区 i += 2; //取模位置加2,以为获取下一个像素数据 } }
//初始化函数 void LCD_Init(void) { unsigned long colori=0; LCD_GPIO_Init(); FSMC_LCD_Init(); LCD_Rst(); LCD_WR_CMD(0x00E3, 0x3008); // Set internal timing LCD_WR_CMD(0x00E7, 0x0012); // Set internal timing LCD_WR_CMD(0x00EF, 0x1231); // Set internal timing LCD_WR_CMD(0x0000, 0x0001); // Start Oscillation LCD_WR_CMD(0x0001, 0x0100); // set SS and SM bit LCD_WR_CMD(0x0002, 0x0700); // set 1 line inversion LCD_WR_CMD(0x0003, 0x1030); // set GRAM write direction and BGR=0,262K colors,1 transfers/pixel. LCD_WR_CMD(0x0004, 0x0000); // Resize register LCD_WR_CMD(0x0008, 0x0202); // set the back porch and front porch LCD_WR_CMD(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0] LCD_WR_CMD(0x000A, 0x0000); // FMARK function LCD_WR_CMD(0x000C, 0x0000); // RGB interface setting LCD_WR_CMD(0x000D, 0x0000); // Frame marker Position LCD_WR_CMD(0x000F, 0x0000); // RGB interface polarity //Power On sequence LCD_WR_CMD(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB LCD_WR_CMD(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] LCD_WR_CMD(0x0012, 0x0000); // VREG1OUT voltage LCD_WR_CMD(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude Lcd_Delay(200); // Dis-charge capacitor power voltage LCD_WR_CMD(0x0010, 0x1690); // SAP, BT[3:0], AP, DSTB, SLP, STB LCD_WR_CMD(0x0011, 0x0227); // R11h=0x0221 at VCI=3.3V, DC1[2:0], DC0[2:0], VC[2:0] Lcd_Delay(50); // Delay 50ms LCD_WR_CMD(0x0012, 0x001C); // External reference voltage= Vci; Lcd_Delay(50); // Delay 50ms LCD_WR_CMD(0x0013, 0x1800); // R13=1200 when R12=009D;VDV[4:0] for VCOM amplitude LCD_WR_CMD(0x0029, 0x001C); // R29=000C when R12=009D;VCM[5:0] for VCOMH LCD_WR_CMD(0x002B, 0x000D); // Frame Rate = 91Hz Lcd_Delay(50); // Delay 50ms LCD_WR_CMD(0x0020, 0x0000); // GRAM horizontal Address LCD_WR_CMD(0x0021, 0x0000); // GRAM Vertical Address // ----------- Adjust the Gamma Curve ----------// LCD_WR_CMD(0x0030, 0x0007); LCD_WR_CMD(0x0031, 0x0302); LCD_WR_CMD(0x0032, 0x0105); LCD_WR_CMD(0x0035, 0x0206); LCD_WR_CMD(0x0036, 0x0808); LCD_WR_CMD(0x0037, 0x0206); LCD_WR_CMD(0x0038, 0x0504); LCD_WR_CMD(0x0039, 0x0007); LCD_WR_CMD(0x003C, 0x0105); LCD_WR_CMD(0x003D, 0x0808); //------------------ Set GRAM area ---------------// LCD_WR_CMD(0x0050, 0x0000); // Horizontal GRAM Start Address LCD_WR_CMD(0x0051, 0x00EF); // Horizontal GRAM End Address LCD_WR_CMD(0x0052, 0x0000); // Vertical GRAM Start Address LCD_WR_CMD(0x0053, 0x013F); // Vertical GRAM Start Address LCD_WR_CMD(0x0060, 0xA700); // Gate Scan Line LCD_WR_CMD(0x0061, 0x0001); // NDL,VLE, REV LCD_WR_CMD(0x006A, 0x0000); // set scrolling line //-------------- Partial Display Control ---------// LCD_WR_CMD(0x0080, 0x0000); LCD_WR_CMD(0x0081, 0x0000); LCD_WR_CMD(0x0082, 0x0000); LCD_WR_CMD(0x0083, 0x0000); LCD_WR_CMD(0x0084, 0x0000); LCD_WR_CMD(0x0085, 0x0000); //-------------- Panel Control -------------------// LCD_WR_CMD(0x0090, 0x0010); LCD_WR_CMD(0x0092, 0x0000); LCD_WR_CMD(0x0093, 0x0003); LCD_WR_CMD(0x0095, 0x0110); LCD_WR_CMD(0x0097, 0x0000); LCD_WR_CMD(0x0098, 0x0000); LCD_WR_CMD(0x0007, 0x0133); // 262K color and display ON LCD_WR_CMD(32, 0); LCD_WR_CMD(33, 0x013F); *(__IO uint16_t *) (Bank1_LCD_C)= 34; for(colori=0;colori<76800;colori++) { LCD_WR_Data(BACK_COLOR); } }
static inline void LCD_WR_CMD(unsigned int index,unsigned int val) { LCD_WR_REG(index); LCD_WR_Data(val); }
void lcdSetPixel_FSMC(JsGraphics *gfx, short x, short y, unsigned int col) { if (x<0 || y<0 || x>=gfx->data.width || y>=gfx->data.height) return; lcdSetCursor(gfx,x,y); LCD_WR_REG(34); LCD_WR_Data(col); }
/* 320 * ------------------- *| | *| | *| | 240 *| | *| | * ------------------- */ void ImagDisp(void) { uint16_t i,j,m=0; uint16_t Camera_Data; for(i = 0; i < 240; i++){ for(j = 0; j < 320; j++){ READ_FIFO_PIXEL(Camera_Data); /* 从FIFO读出一个rgb565像素到Camera_Data变量 */ if((i == Mid[4].y) && (j > Mid[4].x) && (j <= Mid[4].x + pointNum)) ColorData4[0][j-Mid[4].x] = Camera_Data; if((i == Mid[4].y) && (j < Mid[4].x) && (j >= Mid[4].x - pointNum)) ColorData4[1][Mid[4].x-j] = Camera_Data; if((j == Mid[4].x) && (i >= Mid[4].y - pointNum) && (i < Mid[4].y)) ColorData4[2][Mid[4].y-i] = Camera_Data; if((j == Mid[4].x) && (i > Mid[4].y) && ( i <= Mid[4].y + pointNum)) ColorData4[3][i-Mid[4].y] = Camera_Data; if((i == Mid[2].y) && (j > Mid[2].x) && (j <= Mid[2].x + pointNum)) ColorData4[0][j-Mid[2].x] = Camera_Data; if((i == Mid[2].y) && (j < Mid[2].x) && (j >= Mid[2].x - pointNum)) ColorData4[1][Mid[2].x-j] = Camera_Data; if((j == Mid[2].x) && (i >= Mid[2].y - pointNum) && (i < Mid[2].y)) ColorData4[2][Mid[2].y-i] = Camera_Data; if((j == Mid[2].x) && (i > Mid[2].y) && ( i <= Mid[2].y + pointNum)) ColorData4[3][i-Mid[2].y] = Camera_Data; // // if(i==Mid[6].y&&j>Mid[6].x&&j<=Mid[6].x+pointNum) // ColorData6[0][j-Mid[6].x]=Camera_Data; // if(i==Mid[6].y&&j<Mid[6].x&&j>=Mid[6].x-pointNum) // ColorData6[1][Mid[6].x-j]=Camera_Data; // if(j==Mid[6].x&&i>=Mid[6].y-pointNum&&i<Mid[6].y) // ColorData6[2][Mid[6].y-i]=Camera_Data; // if(j==Mid[6].x&&i>Mid[6].y&&i<=Mid[6].y+pointNum) // ColorData6[3][i-Mid[6].y]=Camera_Data; if(i==65&&j==135) { MidColorData[0][0]=Camera_Data; Camera_Data=0; } if(i==65&&j==170) { MidColorData[0][1]=Camera_Data; Camera_Data=0; } if(i==65&&j==202) { MidColorData[0][2]=Camera_Data; Camera_Data=0; } if(i==100&&j==135) { MidColorData[1][0]=Camera_Data; Camera_Data=0; } if(i==100&&j==170) { MidColorData[1][1]=Camera_Data; Camera_Data=0; } if(i==100&&j==202) { MidColorData[1][2]=Camera_Data; Camera_Data=0; } if(i==135&&j==135) { MidColorData[2][0]=Camera_Data; Camera_Data=0; } if(i==135&&j==170) { MidColorData[2][1]=Camera_Data; Camera_Data=0; } if(i==135&&j==202) { MidColorData[2][2]=Camera_Data; Camera_Data=0; } LCD_WR_Data(Camera_Data); } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ RGBtoHSL(MidColorData[i][j],hsl_l+m); outcolor(hsl_l+m); m++; } } if(ColorDataCompare(ColorData4)) { // if(ColorDataCompare(ColorData2)) Judgerubik=1; // else // Judgerubik=0; } else Judgerubik=0; }
/*** 3寸TFT(R61509)初始化函数 ***/ void LCD_Init(void) { uint16_t i = 0; GPIO_ResetBits(GPIOE, GPIO_Pin_1); Delay(0x1AFFF); GPIO_SetBits(GPIOE, GPIO_Pin_1); Delay(0x1AFFF); LCD_WR_CMD(0x0000, 0x00000); LCD_WR_CMD(0x0000, 0x00000); LCD_WR_CMD(0x0000, 0x00000); LCD_WR_CMD(0x0000, 0x00000); LCD_WR_CMD(0x0400, 0x06200); LCD_WR_CMD(0x0008, 0x00808); LCD_WR_CMD(0x0300, 0x00C00); //gamma LCD_WR_CMD(0x0301, 0x05A0B); LCD_WR_CMD(0x0302, 0x00906); LCD_WR_CMD(0x0303, 0x01017); LCD_WR_CMD(0x0304, 0x02300); LCD_WR_CMD(0x0305, 0x01700); LCD_WR_CMD(0x0306, 0x06309); LCD_WR_CMD(0x0307, 0x00C09); LCD_WR_CMD(0x0308, 0x0100C); LCD_WR_CMD(0x0309, 0x02232); LCD_WR_CMD(0x0010, 0x00016); //69.5Hz LCD_WR_CMD(0x0011, 0x00101); LCD_WR_CMD(0x0012, 0x00000); LCD_WR_CMD(0x0013, 0x00001); LCD_WR_CMD(0x0100, 0x00330); //BT,AP LCD_WR_CMD(0x0101, 0x00237); //DC0,DC1,VC LCD_WR_CMD(0x0103, 0x00F00); //VDV LCD_WR_CMD(0x0280, 0x06100); //VCM LCD_WR_CMD(0x0102, 0x0C1B0); //VRH,VCMR,PSON,PON LCD_WR_CMD(0x0001, 0x00100); LCD_WR_CMD(0x0002, 0x00100); LCD_WR_CMD(0x0003, 0x01030); LCD_WR_CMD(0x0009, 0x00001); LCD_WR_CMD(0x000C, 0x00000); LCD_WR_CMD(0x0090, 0x08000); LCD_WR_CMD(0x000F, 0x00000); LCD_WR_CMD(0x0210, 0x00000); LCD_WR_CMD(0x0211, 0x000EF); LCD_WR_CMD(0x0212, 0x00000); LCD_WR_CMD(0x0213, 0x0018F); //432=1AF, 400=18F LCD_WR_CMD(0x0500, 0x00000); LCD_WR_CMD(0x0501, 0x00000); LCD_WR_CMD(0x0502, 0x0005F); LCD_WR_CMD(0x0401, 0x00001); LCD_WR_CMD(0x0404, 0x00000); LCD_WR_CMD(0x0007, 0x00100); //BASEE LCD_WR_CMD(0x0200, 0x00000); LCD_WR_CMD(0x0201, 0x00000); LCD_WR_CMD(0x0200, 0x00000); LCD_WR_CMD(0x0201, 0x00000); Bank1_LCD_C = 0X0202; //准备写数据显示区 for (i=0; i<9600; i++) { LCD_WR_Data(0xFFFF); //用黑色清屏 } }
/* * 显示bmp图片, 24位真彩色 * 图片宽度和高度根据图片大小而定 */ void Lcd_show_bmp(unsigned short int x, unsigned short int y,unsigned char *pic_name) { int i, j, k; int width, height, l_width; BYTE red,green,blue; BITMAPFILEHEADER bitHead; BITMAPINFOHEADER bitInfoHead; WORD fileType; unsigned int read_num; unsigned char tmp_name[20]; sprintf((char*)tmp_name,"0:%s",pic_name); f_mount(0, &bmpfs[0]); BMP_DEBUG_PRINTF("file mount ok \r\n"); bmpres = f_open( &bmpfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ); /*-------------------------------------------------------------------------------------------------------*/ if(bmpres == FR_OK) { BMP_DEBUG_PRINTF("Open file success\r\n"); /* 读取文件头信息 两个字节*/ f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num); /* 判断是不是bmp文件 "BM"*/ if(fileType != 0x4d42) { BMP_DEBUG_PRINTF("file is not .bmp file!\r\n"); return; } else { BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n"); } /* 读取BMP文件头信息*/ f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num); showBmpHead(&bitHead); /* 读取位图信息头信息 */ f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num); showBmpInforHead(&bitInfoHead); } else { BMP_DEBUG_PRINTF("open file failed!\r\n"); return; } /*-------------------------------------------------------------------------------------------------------*/ width = bitInfoHead.biWidth; height = bitInfoHead.biHeight; /* 计算位图的实际宽度并确保它为32的倍数 */ l_width = WIDTHBYTES(width* bitInfoHead.biBitCount); if(l_width > 960) { BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)\n"); return; } /* 设置Lcd Gram 扫描方向为: 右下角->左上角 */ Lcd_GramScan( 3 ); /* 开一个图片大小的窗口*/ LCD_OpenWindow(x, y, width, height); /* 判断是否是24bit真彩色图 */ if(bitInfoHead.biBitCount >= 24) { for(i=0;i< height; i++) { /* 读取一行bmp的数据到数组pColorData里面 */ #if 0 for(j=0; j< l_width; j++) { f_read(&bmpfsrc,pColorData+j,1,&read_num); } #elif 1 f_read(&bmpfsrc,pColorData,l_width/2,&read_num); f_read(&bmpfsrc,pColorData+l_width/2,l_width/2,&read_num); #else f_read(&bmpfsrc,pColorData,l_width,&read_num); #endif for(j=0; j<width; j++) //一行有效信息 { k = j*3; //一行中第K个像素的起点 red = pColorData[k+2]; green = pColorData[k+1]; blue = pColorData[k]; LCD_WR_Data(RGB24TORGB16(red,green,blue)); //写入LCD-GRAM } } } else { BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 24BITS REAL COLOR"); return ; } f_close(&bmpfsrc); }
void LCD_Clear(u16 Color) { u32 i; for(i=0;i<76800;i++) LCD_WR_Data(Color); }
void MyLCD_Init(void) { LCD_LineConf(); LCD_FSMCConf(); delay_ms(5); lcdid=LCD_ReadReg(0x00); lcdid = 0x9341; if(lcdid == 0x9341) { LCD_WR_REG(0xEF); LCD_WR_Data (0x03); LCD_WR_Data(0x80); LCD_WR_Data (0X02); LCD_WR_REG(0xCF); LCD_WR_Data (0x00); LCD_WR_Data (0xBA); LCD_WR_Data (0XB0); LCD_WR_REG(0xED); LCD_WR_Data (0x67); LCD_WR_Data(0x03); LCD_WR_Data(0X12); LCD_WR_Data (0X81); LCD_WR_REG(0xE8); LCD_WR_Data (0x85); LCD_WR_Data (0x11); LCD_WR_Data (0x79); LCD_WR_REG(0xCB); LCD_WR_Data (0x39); LCD_WR_Data (0x2C); LCD_WR_Data (0x00); LCD_WR_Data (0x34); LCD_WR_Data (0x06); LCD_WR_REG(0xF7); LCD_WR_Data (0x20); LCD_WR_REG(0xEA); LCD_WR_Data (0x00); LCD_WR_Data (0x00); LCD_WR_REG(0xC0); //Power control LCD_WR_Data (0x1D); //VRH[5:0] LCD_WR_REG(0xC1); //Power control LCD_WR_Data (0x12); //SAP[2:0];BT[3:0] LCD_WR_REG(0xC5); //VCM control LCD_WR_Data (0x44); LCD_WR_Data(0x3c); LCD_WR_REG(0xC7); //VCM control LCD_WR_Data (0x9E); LCD_WR_REG(0x3A); // Memory Access Control LCD_WR_Data (0x55); LCD_WR_REG(0x36); // Memory Access Control LCD_WR_Data (0x48); LCD_WR_REG(0xB1); LCD_WR_Data (0x00); LCD_WR_Data (0x17); LCD_WR_REG(0xB6); // Display Function Control LCD_WR_Data (0x0A); LCD_WR_Data(0x82);//A2 LCD_WR_REG(0xF2); // 3Gamma Function Disable LCD_WR_Data (0x00); LCD_WR_REG(0x26); //Gamma curve selected LCD_WR_Data (0x01); LCD_WR_REG(0xE0); //Set Gamma LCD_WR_Data (0x0F); LCD_WR_Data (0x22); LCD_WR_Data(0x1C); LCD_WR_Data (0x1B); LCD_WR_Data(0x08); LCD_WR_Data(0x0F); LCD_WR_Data (0x48); LCD_WR_Data(0xB8); LCD_WR_Data (0x34); LCD_WR_Data(0x05); LCD_WR_Data (0x0C); LCD_WR_Data(0x09); LCD_WR_Data(0x0F); LCD_WR_Data (0x07); LCD_WR_Data(0x00); LCD_WR_REG(0XE1); //Set Gamma LCD_WR_Data (0x00); LCD_WR_Data (0x23); LCD_WR_Data (0x24); LCD_WR_Data (0x07); LCD_WR_Data (0x10); LCD_WR_Data (0x07); LCD_WR_Data (0x38); LCD_WR_Data (0x47); LCD_WR_Data (0x4B); LCD_WR_Data (0x0A); LCD_WR_Data (0x13); LCD_WR_Data (0x06); LCD_WR_Data (0x30); LCD_WR_Data (0x38); LCD_WR_Data (0x0F); LCD_WR_REG(0x11); //Exit Sleep delay_ms(500); LCD_WR_REG(0x29); //Display on LCD_Mode(0); LCD_WR_REG(0x2c); } }