//#include #include "lcd.h" #include "stdlib.h" #include "font.h" #include "usart.h" #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //Mini STM32开发板 //2.4/2.8寸TFT液晶驱动 //支持驱动IC型号包括:ILI9325/RM68021/ILI9320/ILI9328/LGDP4531/SPFD5408/SSD1289等 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2011/1/13 //版本:V1.4 //版权所有,盗版必究。 //Copyright(C) 正点原子 2009-2019 //All rights reserved //******************************************************************************** //V1.2修改说明 //支持了SPFD5408的驱动,另外把液晶ID直接打印成HEX格式.方便查看LCD驱动IC. //V1.3 //加入了快速IO的支持 //修改了背光控制的极性(适用于V1.8及以后的开发板版本) //V1.4 //修改了LCD_ShowChar函数,使用画点功能画字符。 //加入了横竖屏显示的支持 ////////////////////////////////////////////////////////////////////////////////// //画笔颜色,背景颜色 u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF; u16 DeviceCode; //lcd控制器类型标识 void DATAOUT(u16 x) { // u16 D0_1,D2_3,D4_12,D13_15; GPIOD->ODR|=((0X0003&x)<<14);//D0-1送入GPIOD->ODR对应位 GPIOD->ODR|=((0X00C0&x)>>2); //D2-3送入GPIOD->ODR对应位 GPIOD->ODR|=((0XE000&x)>>5); //D13-15送入GPIOD->ODR对应位 GPIOE->ODR|=((0X1FF0&x)<<3); //D4-12与PE7--15对应 /* D2_3=(GPIOD->ODR>>0)&0X03; D13_15=(GPIOD->ODR>>8)&0X07; D0_1=(GPIOD->ODR>>14)&0X03; D4_12=(GPIOE->ODR>>7)&0X01FF; x=(D13_15<<13)+(D4_12<<4)+(D2_3<<2)+(D0_1<<0); */ } u16 DATAIN(void) { u16 D0_1,D2_3,D4_12,D13_15,x; D2_3=(GPIOD->IDR>>0)&0X0003; D13_15=(GPIOD->IDR>>8)&0X0007; D0_1=(GPIOD->IDR>>14)&0X0003; D4_12=(GPIOE->IDR>>7)&0X01FF; x=(D13_15<<13)+(D4_12<<4)+(D2_3<<2)+(D0_1<<0); return x; } #ifdef LCD_FAST_IO //写寄存器函数 void LCD_WR_REG(u8 data) //快速IO,将数据(无论类型/功能,只为reg能识别)传入reg //void LCD_WR_REG(u16 data) //正常IO { LCD_RS_CLR; //写地址 LCD_CS_CLR; //清除片选为0,实则是低电平片选选中 DATAOUT(data); LCD_WR_CLR; LCD_WR_SET; LCD_CS_SET; } #else //写寄存器函数 void LCD_WR_REG(u8 data) //正常IO //void LCD_WR_REG(u16 data) //正常IO { LCD_RS=0;//写地址 LCD_CS=0; DATAOUT(data); LCD_WR=0; LCD_WR=1; LCD_CS=1; } #endif //写寄存器 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue) //向寄存器写入控制指令 { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } //读寄存器 u16 LCD_ReadReg(u8 LCD_Reg) { u16 t; LCD_WR_REG(LCD_Reg); //写入要读的 寄存器号 /* GPIOB->CRL=0X88888888; //PB0-7 上拉输入 GPIOB->CRH=0X88888888; //PB8-15 上拉输入 GPIOB->ODR=0XFFFF; //全部输出高 */ GPIOD->CRL|=0X00000088; //PD0-1 上拉输入 GPIOD->CRH|=0X88000888; //PD8-10,14-15 上拉输入 GPIOD->ODR|=0XC703; //上述管脚出高 GPIOE->CRL|=0X80000000; //PE7 上拉输入 GPIOE->CRH=0X88888888; //PE8-15 上拉输入 GPIOE->ODR|=0XFF80; //上述管脚输出高 #ifdef LCD_FAST_IO //快速IO LCD_RS_SET; LCD_CS_CLR; //读取数据(读寄存器时,并不需要读2次) LCD_RD_CLR; delay_us(5);//FOR 8989,延时5us LCD_RD_SET; // t=DATAIN; t=DATAIN(); LCD_CS_SET; #else LCD_RS=1; //选择对数据进行读/写 LCD_CS=0; //读取数据(读寄存器时,并不需要读2次) LCD_RD=0; LCD_RD=1; // t=DATAIN; t=DATAIN(); LCD_CS=1; #endif /* GPIOB->CRL=0X33333333; //PB0-7 上拉输出 GPIOB->CRH=0X33333333; //PB8-15 上拉输出 GPIOB->ODR=0XFFFF; //全部输出高 */ GPIOD->CRL|=0X00000033; //PD0-1 上拉输出 GPIOD->CRH|=0X33000333; //PD8-10,14-15 上拉输出 GPIOD->ODR|=0XC703; //上述管脚输出高 GPIOE->CRL|=0X30000000; //PE7 上拉输出 GPIOE->CRH=0X33333333; //PE8-15 上拉输出 GPIOE->ODR|=0XFF80; //上述管脚输出高 return t; } //开始写GRAM void LCD_WriteRAM_Prepare(void) { LCD_WR_REG(R34); //使写数据到GRAM时,地址计数器能自动增减 } //LCD写GRAM void LCD_WriteRAM(u16 RGB_Code) { LCD_WR_DATA(RGB_Code);//写十六位GRAM } //从ILI93xx读出的数据为BGR(16bit,各占565从低位到高位)格式,而我们写入的时候为RGB格式。 //通过该函数转换 //c:GBR格式的颜色值 //返回值:RGB格式的颜色值 u16 LCD_BGR2RGB(u16 c) { u16 r,g,b,rgb; b=(c>>0)&0x1f; //低5位,表示蓝色的数据 g=(c>>5)&0x3f; //中间6位 r=(c>>11)&0x1f; rgb=(b<<11)+(g<<5)+(r<<0); return(rgb); } //读取个某点的颜色值 //x:0~239 //y:0~319 //返回值:此点的颜色 u16 LCD_ReadPoint(u16 x,u16 y) { u16 t; if(x>=LCD_W||y>=LCD_H)return 0;//超过了范围,直接返回 LCD_SetCursor(x,y); //光标定位 LCD_WR_REG(R34); //选择GRAM地址 /* GPIOB->CRL=0X88888888; //PB0-7 上拉输入 GPIOB->CRH=0X88888888; //PB8-15 上拉输入 GPIOB->ODR=0XFFFF; //全部输出高 */ GPIOD->CRL|=0X00000088; //PD0-1 上拉输入 GPIOD->CRH|=0X88000888; //PD8-10,14-15 上拉输入 GPIOD->ODR|=0XC703; //上述管脚输出高 GPIOE->CRL|=0X80000000; //PE7 上拉输入 GPIOE->CRH=0X88888888; //PE8-15 上拉输入 GPIOE->ODR|=0XFF80; //上述管脚输出高 #ifdef LCD_FAST_IO //快速IO LCD_RS_SET; LCD_CS_CLR; //读取数据(读GRAM时,需要读2次) LCD_RD_CLR; LCD_RD_SET; delay_us(2);//FOR 9320,延时2us //dummy READ LCD_RD_CLR; delay_us(2);//FOR 8989,延时2us LCD_RD_SET; // t=DATAIN; t=DATAIN(); LCD_CS_SET; #else LCD_RS=1; LCD_CS=0; //读取数据(读GRAM时,需要读2次) LCD_RD=0; LCD_RD=1; //dummy READ LCD_RD=0; LCD_RD=1; // t=DATAIN; t=DATAIN(); LCD_CS=1; #endif /* GPIOB->CRL=0X33333333; //PB0-7 上拉输出 GPIOB->CRH=0X33333333; //PB8-15 上拉输出 GPIOB->ODR=0XFFFF; //全部输出高 */ GPIOD->CRL|=0X00000033; //PD0-1 上拉输出 GPIOD->CRH|=0X33000333; //PD8-10,14-15 上拉输出 GPIOD->ODR|=0XC703; //上述管脚输出高 GPIOE->CRL|=0X30000000; //PE7 上拉输出 GPIOE->CRH=0X33333333; //PE8-15 上拉输出 GPIOE->ODR|=0XFF80; //上述管脚输出高 if(DeviceCode==0X4531||DeviceCode==0X8989)return t;//4531/8989驱动IC else return LCD_BGR2RGB(t); } //LCD开启显示 void LCD_DisplayOn(void) { LCD_WriteReg(R7, 0x0173); //26万色显示开启 } //LCD关闭显示 void LCD_DisplayOff(void) { LCD_WriteReg(R7, 0x0);//关闭显示 } //设置光标位置 //Xpos:横坐标 //Ypos:纵坐标 __inline void LCD_SetCursor(u16 Xpos, u16 Ypos) //用inline定义内联函数,类似于宏定义 { #ifdef USE_HORIZONTAL if(DeviceCode==0X8989) { LCD_WriteReg(0X4E, Ypos); LCD_WriteReg(0X4F, 319-Xpos); }else { LCD_WriteReg(R32, Ypos); LCD_WriteReg(R33, 319-Xpos); } #else if(DeviceCode==0X8989) { LCD_WriteReg(0X4E, Xpos); LCD_WriteReg(0X4F, Ypos); }else { LCD_WriteReg(R32, Xpos); LCD_WriteReg(R33, Ypos); } #endif } //画点 //x:0~239 //y:0~319 //POINT_COLOR:此点的颜色 void LCD_DrawPoint(u16 x,u16 y) { LCD_SetCursor(x,y);//设置光标位置 LCD_WR_REG(R34);//开始写入GRAM LCD_WR_DATA(POINT_COLOR); } //初始化lcd //该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!! //在其他型号的驱动芯片上没有测试! void LCD_Init(void) { /* RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟 RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟 */ RCC->APB2ENR|=1<<2;//先使能外设PORTA时钟 RCC->APB2ENR|=1<<5;//先使能外设PORTD时钟 RCC->APB2ENR|=1<<6;//先使能外设PORTE时钟 RCC->APB2ENR|=1<<7;//先使能外设PORTF时钟 RCC->APB2ENR|=1<<8;//先使能外设PORTG时钟 RCC->APB2ENR|=1<<0; //开启辅助时钟 与复用IO口有关 // JTAG_Set(SWD_ENABLE); //开启SWD /* //PORTC6~10复用推挽输出 GPIOC->CRH&=0XFFFFF000; GPIOC->CRH|=0X00000333; GPIOC->CRL&=0X00FFFFFF; GPIOC->CRL|=0X33000000; GPIOC->ODR|=0X07C0; //PORTB 推挽输出 GPIOB->CRH=0X33333333; GPIOB->CRL=0X33333333; GPIOB->ODR=0XFFFF; */ //复用推挽输出 GPIOA->CRL&=0XFFFFFF0F; //PA1,背光 GPIOA->CRL|=0X00000030; GPIOA->ODR|=0X0002; GPIOD->CRL&=0XFF00FFFF; //PD4,5 WR,RD GPIOD->CRL|=0X00330000; GPIOD->ODR|=0X0030; GPIOF->CRL&=0XFFFFFFF0; //PF0,RS GPIOF->CRL|=0X00000003; GPIOF->ODR|=0X0001; GPIOG->CRH&=0XFFF0FFFF; //PG12,CS GPIOG->CRH|=0X00030000; GPIOG->ODR|=0X1000; //PORTB 推挽输出 GPIOD->CRL|=0X00000033; //PD0-1 上拉输出 GPIOD->CRH|=0X33000333; //PD8-10,14-15 上拉输出 GPIOD->ODR|=0XC703; //上述管脚输出高 GPIOE->CRL|=0X30000000; //PE7 上拉输入 GPIOE->CRH=0X33333333; //PE8-15 上拉输入 GPIOE->ODR|=0XFF80; //上述管脚输出高 delay_ms(50); // delay 50 ms LCD_WriteReg(0x0000,0x0001); delay_ms(50); // delay 50 ms DeviceCode = LCD_ReadReg(0x0000); printf(" LCD ID:%x\n",DeviceCode); //打印LCD ID if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325 { LCD_WriteReg(0x00e7,0x0010); LCD_WriteReg(0x0000,0x0001);//开启内部时钟 LCD_WriteReg(0x0001,0x0100); LCD_WriteReg(0x0002,0x0700);//电源开启 //LCD_WriteReg(0x0003,(1<<3)|(1<<4) ); //65K RGB //DRIVE TABLE(寄存器 03H) //BIT3=AM BIT4:5=ID0:1 //AM ID0 ID1 FUNCATION // 0 0 0 R->L D->U // 1 0 0 D->U R->L // 0 1 0 L->R D->U // 1 1 0 D->U L->R // 0 0 1 R->L U->D // 1 0 1 U->D R->L // 0 1 1 L->R U->D 正常就用这个. // 1 1 1 U->D L->R LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(0<<3) );//65K LCD_WriteReg(0x0004,0x0000); LCD_WriteReg(0x0008,0x0207); LCD_WriteReg(0x0009,0x0000); LCD_WriteReg(0x000a,0x0000);//display setting LCD_WriteReg(0x000c,0x0001);//display setting LCD_WriteReg(0x000d,0x0000);//0f3c LCD_WriteReg(0x000f,0x0000); //电源配置 LCD_WriteReg(0x0010,0x0000); LCD_WriteReg(0x0011,0x0007); LCD_WriteReg(0x0012,0x0000); LCD_WriteReg(0x0013,0x0000); delay_ms(50); LCD_WriteReg(0x0010,0x1590); LCD_WriteReg(0x0011,0x0227); delay_ms(50); LCD_WriteReg(0x0012,0x009c); delay_ms(50); LCD_WriteReg(0x0013,0x1900); LCD_WriteReg(0x0029,0x0023); LCD_WriteReg(0x002b,0x000e); delay_ms(50); LCD_WriteReg(0x0020,0x0000); LCD_WriteReg(0x0021,0x013f); delay_ms(50); //伽马校正 LCD_WriteReg(0x0030,0x0007); LCD_WriteReg(0x0031,0x0707); LCD_WriteReg(0x0032,0x0006); LCD_WriteReg(0x0035,0x0704); LCD_WriteReg(0x0036,0x1f04); LCD_WriteReg(0x0037,0x0004); LCD_WriteReg(0x0038,0x0000); LCD_WriteReg(0x0039,0x0706); LCD_WriteReg(0x003c,0x0701); LCD_WriteReg(0x003d,0x000f); delay_ms(50); LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置 LCD_WriteReg(0x0051,0x00ef); //水平GRAM终止位置 LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置 LCD_WriteReg(0x0053,0x013f); //垂直GRAM终止位置 LCD_WriteReg(0x0060,0xa700); LCD_WriteReg(0x0061,0x0001); LCD_WriteReg(0x006a,0x0000); LCD_WriteReg(0x0080,0x0000); LCD_WriteReg(0x0081,0x0000); LCD_WriteReg(0x0082,0x0000); LCD_WriteReg(0x0083,0x0000); LCD_WriteReg(0x0084,0x0000); LCD_WriteReg(0x0085,0x0000); LCD_WriteReg(0x0090,0x0010); LCD_WriteReg(0x0092,0x0000); LCD_WriteReg(0x0093,0x0003); LCD_WriteReg(0x0095,0x0110); LCD_WriteReg(0x0097,0x0000); LCD_WriteReg(0x0098,0x0000); //开启显示设置 LCD_WriteReg(0x0007,0x0133); LCD_WriteReg(0x0020,0x0000); LCD_WriteReg(0x0021,0x013f); }else if(DeviceCode==0x9320||DeviceCode==0x9300) { LCD_WriteReg(0x00,0x0000); LCD_WriteReg(0x01,0x0100); //Driver Output Contral. LCD_WriteReg(0x02,0x0700); //LCD Driver Waveform Contral. LCD_WriteReg(0x03,0x1030);//Entry Mode Set. //LCD_WriteReg(0x03,0x1018); //Entry Mode Set. LCD_WriteReg(0x04,0x0000); //Scalling Contral. LCD_WriteReg(0x08,0x0202); //Display Contral 2.(0x0207) LCD_WriteReg(0x09,0x0000); //Display Contral 3.(0x0000) LCD_WriteReg(0x0a,0x0000); //Frame Cycle Contal.(0x0000) LCD_WriteReg(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000) LCD_WriteReg(0x0d,0x0000); //Frame Maker Position. LCD_WriteReg(0x0f,0x0000); //Extern Display Interface Contral 2. delay_ms(50); LCD_WriteReg(0x07,0x0101); //Display Contral. delay_ms(50); LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0) LCD_WriteReg(0x11,0x0007); //Power Control 2.(0x0001) LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138) LCD_WriteReg(0x13,0x0b00); //Power Control 4. LCD_WriteReg(0x29,0x0000); //Power Control 7. LCD_WriteReg(0x2b,(1<<14)|(1<<4)); LCD_WriteReg(0x50,0); //Set X Star //水平GRAM终止位置Set X End. LCD_WriteReg(0x51,239); //Set Y Star LCD_WriteReg(0x52,0); //Set Y End.t. LCD_WriteReg(0x53,319); // LCD_WriteReg(0x60,0x2700); //Driver Output Control. LCD_WriteReg(0x61,0x0001); //Driver Output Control. LCD_WriteReg(0x6a,0x0000); //Vertical Srcoll Control. LCD_WriteReg(0x80,0x0000); //Display Position? Partial Display 1. LCD_WriteReg(0x81,0x0000); //RAM Address Start? Partial Display 1. LCD_WriteReg(0x82,0x0000); //RAM Address End-Partial Display 1. LCD_WriteReg(0x83,0x0000); //Displsy Position? Partial Display 2. LCD_WriteReg(0x84,0x0000); //RAM Address Start? Partial Display 2. LCD_WriteReg(0x85,0x0000); //RAM Address End? Partial Display 2. LCD_WriteReg(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013) LCD_WriteReg(0x92,0x0000); //Panel Interface Contral 2.(0x0000) LCD_WriteReg(0x93,0x0001); //Panel Interface Contral 3. LCD_WriteReg(0x95,0x0110); //Frame Cycle Contral.(0x0110) LCD_WriteReg(0x97,(0<<8)); // LCD_WriteReg(0x98,0x0000); //Frame Cycle Contral. LCD_WriteReg(0x07,0x0173); //(0x0173) }else if(DeviceCode==0x5408) { LCD_WriteReg(0x01,0x0100); LCD_WriteReg(0x02,0x0700);//LCD Driving Waveform Contral LCD_WriteReg(0x03,0x1030);//Entry Mode设置 //指针从左至右自上而下的自动增模式 //Normal Mode(Window Mode disable) //RGB格式 //16位数据2次传输的8总线设置 LCD_WriteReg(0x04,0x0000); //Scalling Control register LCD_WriteReg(0x08,0x0207); //Display Control 2 LCD_WriteReg(0x09,0x0000); //Display Control 3 LCD_WriteReg(0x0A,0x0000); //Frame Cycle Control LCD_WriteReg(0x0C,0x0000); //External Display Interface Control 1 LCD_WriteReg(0x0D,0x0000); //Frame Maker Position LCD_WriteReg(0x0F,0x0000); //External Display Interface Control 2 delay_ms(20); //TFT 液晶彩色图像显示方法14 LCD_WriteReg(0x10,0x16B0); //0x14B0 //Power Control 1 LCD_WriteReg(0x11,0x0001); //0x0007 //Power Control 2 LCD_WriteReg(0x17,0x0001); //0x0000 //Power Control 3 LCD_WriteReg(0x12,0x0138); //0x013B //Power Control 4 LCD_WriteReg(0x13,0x0800); //0x0800 //Power Control 5 LCD_WriteReg(0x29,0x0009); //NVM read data 2 LCD_WriteReg(0x2a,0x0009); //NVM read data 3 LCD_WriteReg(0xa4,0x0000); LCD_WriteReg(0x50,0x0000); //设置操作窗口的X轴开始列 LCD_WriteReg(0x51,0x00EF); //设置操作窗口的X轴结束列 LCD_WriteReg(0x52,0x0000); //设置操作窗口的Y轴开始行 LCD_WriteReg(0x53,0x013F); //设置操作窗口的Y轴结束行 LCD_WriteReg(0x60,0x2700); //Driver Output Control //设置屏幕的点数以及扫描的起始行 LCD_WriteReg(0x61,0x0001); //Driver Output Control LCD_WriteReg(0x6A,0x0000); //Vertical Scroll Control LCD_WriteReg(0x80,0x0000); //Display Position – Partial Display 1 LCD_WriteReg(0x81,0x0000); //RAM Address Start – Partial Display 1 LCD_WriteReg(0x82,0x0000); //RAM address End - Partial Display 1 LCD_WriteReg(0x83,0x0000); //Display Position – Partial Display 2 LCD_WriteReg(0x84,0x0000); //RAM Address Start – Partial Display 2 LCD_WriteReg(0x85,0x0000); //RAM address End – Partail Display2 LCD_WriteReg(0x90,0x0013); //Frame Cycle Control LCD_WriteReg(0x92,0x0000); //Panel Interface Control 2 LCD_WriteReg(0x93,0x0003); //Panel Interface control 3 LCD_WriteReg(0x95,0x0110); //Frame Cycle Control LCD_WriteReg(0x07,0x0173); delay_ms(50); } else if(DeviceCode==0x1505) { // second release on 3/5 ,luminance is acceptable,water wave appear during camera preview LCD_WriteReg(0x0007,0x0000); delay_ms(50); LCD_WriteReg(0x0012,0x011C);//0x011A why need to set several times? LCD_WriteReg(0x00A4,0x0001);//NVM LCD_WriteReg(0x0008,0x000F); LCD_WriteReg(0x000A,0x0008); LCD_WriteReg(0x000D,0x0008); //伽马校正 LCD_WriteReg(0x0030,0x0707); LCD_WriteReg(0x0031,0x0007); //0x0707 LCD_WriteReg(0x0032,0x0603); LCD_WriteReg(0x0033,0x0700); LCD_WriteReg(0x0034,0x0202); LCD_WriteReg(0x0035,0x0002); //?0x0606 LCD_WriteReg(0x0036,0x1F0F); LCD_WriteReg(0x0037,0x0707); //0x0f0f 0x0105 LCD_WriteReg(0x0038,0x0000); LCD_WriteReg(0x0039,0x0000); LCD_WriteReg(0x003A,0x0707); LCD_WriteReg(0x003B,0x0000); //0x0303 LCD_WriteReg(0x003C,0x0007); //?0x0707 LCD_WriteReg(0x003D,0x0000); //0x1313//0x1f08 delay_ms(50); LCD_WriteReg(0x0007,0x0001); LCD_WriteReg(0x0017,0x0001);//开启电源 delay_ms(50); //电源配置 LCD_WriteReg(0x0010,0x17A0); LCD_WriteReg(0x0011,0x0217);//reference voltage VC[2:0] Vciout = 1.00*Vcivl LCD_WriteReg(0x0012,0x011E);//0x011c //Vreg1out = Vcilvl*1.80 is it the same as Vgama1out ? LCD_WriteReg(0x0013,0x0F00);//VDV[4:0]-->VCOM Amplitude VcomL = VcomH - Vcom Ampl LCD_WriteReg(0x002A,0x0000); LCD_WriteReg(0x0029,0x000A);//0x0001F Vcomh = VCM1[4:0]*Vreg1out gate source voltage?? LCD_WriteReg(0x0012,0x013E);// 0x013C power supply on //Coordinates Control// LCD_WriteReg(0x0050,0x0000);//0x0e00 LCD_WriteReg(0x0051,0x00EF); LCD_WriteReg(0x0052,0x0000); LCD_WriteReg(0x0053,0x013F); //Pannel Image Control// LCD_WriteReg(0x0060,0x2700); LCD_WriteReg(0x0061,0x0001); LCD_WriteReg(0x006A,0x0000); LCD_WriteReg(0x0080,0x0000); //Partial Image Control// LCD_WriteReg(0x0081,0x0000); LCD_WriteReg(0x0082,0x0000); LCD_WriteReg(0x0083,0x0000); LCD_WriteReg(0x0084,0x0000); LCD_WriteReg(0x0085,0x0000); //Panel Interface Control// LCD_WriteReg(0x0090,0x0013);//0x0010 frenqucy LCD_WriteReg(0x0092,0x0300); LCD_WriteReg(0x0093,0x0005); LCD_WriteReg(0x0095,0x0000); LCD_WriteReg(0x0097,0x0000); LCD_WriteReg(0x0098,0x0000); LCD_WriteReg(0x0001,0x0100); LCD_WriteReg(0x0002,0x0700); LCD_WriteReg(0x0003,0x1030); LCD_WriteReg(0x0004,0x0000); LCD_WriteReg(0x000C,0x0000); LCD_WriteReg(0x000F,0x0000); LCD_WriteReg(0x0020,0x0000); LCD_WriteReg(0x0021,0x0000); LCD_WriteReg(0x0007,0x0021); delay_ms(20); LCD_WriteReg(0x0007,0x0061); delay_ms(20); LCD_WriteReg(0x0007,0x0173); delay_ms(20); } else if(DeviceCode==0x8989) { LCD_WriteReg(0x0000,0x0001);//打开晶振 LCD_WriteReg(0x0003,0xA8A4);//0xA8A4 LCD_WriteReg(0x000C,0x0000); LCD_WriteReg(0x000D,0x080C); LCD_WriteReg(0x000E,0x2B00); LCD_WriteReg(0x001E,0x00B0); LCD_WriteReg(0x0001,0x2B3F);//驱动输出控制320*240 0x6B3F LCD_WriteReg(0x0002,0x0600); LCD_WriteReg(0x0010,0x0000); LCD_WriteReg(0x0011,0x6070); //定义数据格式 16位色 横屏 0x6058 LCD_WriteReg(0x0005,0x0000); LCD_WriteReg(0x0006,0x0000); LCD_WriteReg(0x0016,0xEF1C); LCD_WriteReg(0x0017,0x0003); LCD_WriteReg(0x0007,0x0233); //0x0233 LCD_WriteReg(0x000B,0x0000); LCD_WriteReg(0x000F,0x0000); //扫描开始地址 LCD_WriteReg(0x0041,0x0000); LCD_WriteReg(0x0042,0x0000); LCD_WriteReg(0x0048,0x0000); LCD_WriteReg(0x0049,0x013F); LCD_WriteReg(0x004A,0x0000); LCD_WriteReg(0x004B,0x0000); LCD_WriteReg(0x0044,0xEF00); LCD_WriteReg(0x0045,0x0000); LCD_WriteReg(0x0046,0x013F); LCD_WriteReg(0x0030,0x0707); LCD_WriteReg(0x0031,0x0204); LCD_WriteReg(0x0032,0x0204); LCD_WriteReg(0x0033,0x0502); LCD_WriteReg(0x0034,0x0507); LCD_WriteReg(0x0035,0x0204); LCD_WriteReg(0x0036,0x0204); LCD_WriteReg(0x0037,0x0502); LCD_WriteReg(0x003A,0x0302); LCD_WriteReg(0x003B,0x0302); LCD_WriteReg(0x0023,0x0000); LCD_WriteReg(0x0024,0x0000); LCD_WriteReg(0x0025,0x8000); LCD_WriteReg(0x004f,0); //行首址0 LCD_WriteReg(0x004e,0); //列首址0 }else if(DeviceCode==0x4531) { LCD_WriteReg(0X00,0X0001); delay_ms(10); LCD_WriteReg(0X10,0X1628); LCD_WriteReg(0X12,0X000e);//0x0006 LCD_WriteReg(0X13,0X0A39); delay_ms(10); LCD_WriteReg(0X11,0X0040); LCD_WriteReg(0X15,0X0050); delay_ms(10); LCD_WriteReg(0X12,0X001e);//16 delay_ms(10); LCD_WriteReg(0X10,0X1620); LCD_WriteReg(0X13,0X2A39); delay_ms(10); LCD_WriteReg(0X01,0X0100); LCD_WriteReg(0X02,0X0300); LCD_WriteReg(0X03,0X1030);//改变方向的 LCD_WriteReg(0X08,0X0202); LCD_WriteReg(0X0A,0X0008); LCD_WriteReg(0X30,0X0000); LCD_WriteReg(0X31,0X0402); LCD_WriteReg(0X32,0X0106); LCD_WriteReg(0X33,0X0503); LCD_WriteReg(0X34,0X0104); LCD_WriteReg(0X35,0X0301); LCD_WriteReg(0X36,0X0707); LCD_WriteReg(0X37,0X0305); LCD_WriteReg(0X38,0X0208); LCD_WriteReg(0X39,0X0F0B); LCD_WriteReg(0X41,0X0002); LCD_WriteReg(0X60,0X2700); LCD_WriteReg(0X61,0X0001); LCD_WriteReg(0X90,0X0210); LCD_WriteReg(0X92,0X010A); LCD_WriteReg(0X93,0X0004); LCD_WriteReg(0XA0,0X0100); LCD_WriteReg(0X07,0X0001); LCD_WriteReg(0X07,0X0021); LCD_WriteReg(0X07,0X0023); LCD_WriteReg(0X07,0X0033); LCD_WriteReg(0X07,0X0133); LCD_WriteReg(0XA0,0X0000); } LCD_LED=1;//点亮背光 LCD_Clear(WHITE); } //清屏函数 //Color:要清屏的填充色 void LCD_Clear(u16 Color) { u32 index=0; LCD_SetCursor(0x00,0x0000);//设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM for(index=0;index<76800;index++) { LCD_WR_DATA(Color); } } //在指定区域内填充指定颜色 //区域大小: // (xend-xsta)*(yend-ysta) void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color) { u16 i,j; u16 xlen=0; #ifdef USE_HORIZONTAL xlen=yend-ysta+1; for(i=xsta;i<=xend;i++) { LCD_SetCursor(i,ysta); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM for(j=0;j0)incx=1; //设置单步方向 else if(delta_x==0)incx=0;//垂直线 else {incx=-1;delta_x=-delta_x;} if(delta_y>0)incy=1; else if(delta_y==0)incy=0;//水平线 else{incy=-1;delta_y=-delta_y;} if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 else distance=delta_y; for(t=0;t<=distance+1;t++ )//画线输出 { LCD_DrawPoint(uRow,uCol);//画点 xerr+=delta_x ; yerr+=delta_y ; if(xerr>distance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; } } } //画矩形 void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2) { LCD_DrawLine(x1,y1,x2,y1); LCD_DrawLine(x1,y1,x1,y2); LCD_DrawLine(x1,y2,x2,y2); LCD_DrawLine(x2,y1,x2,y2); } //在指定位置画一个指定大小的圆 //(x,y):中心点 //r :半径 void Draw_Circle(u16 x0,u16 y0,u8 r) { int a,b; int di; a=0;b=r; di=3-(r<<1); //判断下个点位置的标志 while(a<=b) { LCD_DrawPoint(x0-b,y0-a); //3 LCD_DrawPoint(x0+b,y0-a); //0 LCD_DrawPoint(x0-a,y0+b); //1 LCD_DrawPoint(x0-b,y0-a); //7 LCD_DrawPoint(x0-a,y0-b); //2 LCD_DrawPoint(x0+b,y0+a); //4 LCD_DrawPoint(x0+a,y0-b); //5 LCD_DrawPoint(x0+a,y0+b); //6 LCD_DrawPoint(x0-b,y0+a); a++; //使用Bresenham算法画圆 if(di<0)di +=4*a+6; else { di+=10+4*(a-b); b--; } LCD_DrawPoint(x0+a,y0+b); } } //在指定位置显示一个字符 //x:0~234 //y:0~308 //num:要显示的字符:" "--->"~" //size:字体大小 12/16 //mode:叠加方式(1)还是非叠加方式(0) //在指定位置显示一个字符 //x:0~234 //y:0~308 //num:要显示的字符:" "--->"~" //size:字体大小 12/16 //mode:叠加方式(1)还是非叠加方式(0) void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode) { #ifdef USE_HORIZONTAL #define MAX_CHAR_POSX 312 #define MAX_CHAR_POSY 232 #else #define MAX_CHAR_POSX 232 #define MAX_CHAR_POSY 312 #endif u8 temp; u8 pos,t; u16 x0=x; u16 colortemp=POINT_COLOR; if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return; //设置窗口 num=num-' ';//得到偏移后的值 if(!mode) //非叠加方式 { for(pos=0;pos>=1; x++; } x=x0; y++; } }else//叠加方式 { for(pos=0;pos>=1; } } } POINT_COLOR=colortemp; } //m^n函数 u32 mypow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //显示2个数字 //x,y :起点坐标 //len :数字的位数 //size:字体大小 //color:颜色 //num:数值(0~4294967295); void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size) { u8 t,temp; u8 enshow=0; for(t=0;tMAX_CHAR_POSX){x=0;y+=16;} if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear(WHITE);} LCD_ShowChar(x,y,*p,16,0); x+=8; p++; } }