完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
把你的代码发上来.
|
|
|
|
因为程序是一个工程,故不能全部发上来。如果你有ALIENTEK的板子 ,里面就有完整的。或我可以发到你邮箱里去。很感谢你的回帖。 //这是其中的LCD.C文件,是库函数版本的 //竖屏显示的LCD /* 修订: 1.2010-10-26: //V1.0 //从发烧友的开发板上修改过来 */ #include "lcd.h" #include "stdlib.h" #include "font.h" #include "UART_INTERFACE.h" //#include "stm32f10x.h" //#include "usart.h" //2.4/2.8寸TFT液晶驱动(ILI9325/RM68021/ILI9320 Verision) //Mini STM32开发板 //TFTLCD 驱动代码 //发烧友@ALIENTEK //2010/6/5 //画笔颜色,背景颜色 u16 OINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF; u16 DeviceCode; //写寄存器函数 void LCD_WR_REG(u8 data) { Clr_Rs;//写地址 Clr_Cs; Write_Data(data); Clr_nWr; Set_nWr; Set_Cs; } //写寄存器 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) { GPIO_InitTypeDef GPIO_InitStructure; u16 t; LCD_WR_REG(LCD_Reg); //写入要读的寄存器号 //GPIOB->CRL=0X88888888; //PB0-7 上拉输入 //GPIOB->CRH=0X88888888; //PB8-15 上拉输入 //GPIOB->ODR=0X0000; //全部输? GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;// 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_GPIO_DATA_PORT, &GPIO_InitStructure); Write_Data(0x0000); Set_Rs; Clr_Cs; //读取数据(读寄存器时,并不需要读2次) Clr_nRd; Set_nRd; //t=Read_Data; //这句有问题 //t=GPIO_ReadInputData(GPIOB); //这句有问题 t=GPIOB->IDR; //数据输入 Set_Cs; //GPIOB->CRL=0X33333333; //PB0-7 上拉输出 //GPIOB->CRH=0X33333333; //PB8-15 上拉输出 //GPIOB->ODR=0XFFFF; //全部输出高 GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_GPIO_DATA_PORT, &GPIO_InitStructure); Write_Data(0xffff); return t; } //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=0X0000; //全部输出0 //Set_Rs; //Clr_Cs; ////读取数据(读寄存器时,并不需要读2次) //Clr_nRd; //Set_nRd; ////t=GPIOB->IDR; //数据输入 //t=Read_Data; //Set_Cs; //GPIOB->CRL=0X33333333; //PB0-7 上拉输出 //GPIOB->CRH=0X33333333; //PB8-15 上拉输出 //GPIOB->ODR=0XFFFF; //全部输出高 //return t; //} //开始写GRAM void LCD_WriteRAM_Prepare(void) { LCD_WR_REG(R34); } //LCD写GRAM void LCD_WriteRAM(u16 RGB_Code) { LCD_WR_DATA(RGB_Code);//写十六位GRAM } //从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。 //通过该函数转换 //c:GBR格式的颜色值 //返回值:RGB格式的颜色值 u16 LCD_BGR2RGB(u16 c) { u16 r,g,b,rgb; b=(c>>0)&0x1f; g=(c>>5)&0x3f; 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) { GPIO_InitTypeDef GPIO_InitStructure; 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; //全部输出高 GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;// 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_GPIO_DATA_PORT, &GPIO_InitStructure); Write_Data(0xFFFF); Set_Rs; Clr_Cs; //读取数据(读GRAM时,需要读2次) Clr_nRd; Set_nRd; //dummy READ Clr_nRd; Set_nRd; //t=Read_Data; //这句有问题 //t=GPIO_ReadInputData(GPIOB); //这句有问题 t=GPIOB->IDR; //数据输入 Set_Cs; //GPIOB->CRL=0X33333333; //PB0-7 上拉输出 //GPIOB->CRH=0X33333333; //PB8-15 上拉输出 //GPIOB->ODR=0XFFFF; //全部输出高 GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_GPIO_DATA_PORT, &GPIO_InitStructure); Write_Data(0xFFFF); if(DeviceCode==0X4531)return t;//4531驱动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);//关闭显示 } //LCD延时函数 10MS void LCD_Delay (u32 nCount) { volatile int i; for (i=0;i //设置光标位置 //Xpos:横坐标 //Ypos:纵坐标 __inline void LCD_SetCursor(u8 Xpos, u16 Ypos) { LCD_WriteReg(R32, Xpos); LCD_WriteReg(R33, Ypos); } //画点 //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) { GPIO_InitTypeDef GPIO_InitStructure; //RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟 //RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟 //RCC->APB2ENR|=1<<0; //开启辅助时钟 /* Enable clock for GPIOx. */ RCC_APB2PeriphClockCmd(LCD_GPIO_LED_CLK, ENABLE); RCC_APB2PeriphClockCmd(LCD_GPIO_CS_CLK, ENABLE); RCC_APB2PeriphClockCmd(LCD_GPIO_RS_CLK, ENABLE); RCC_APB2PeriphClockCmd(LCD_GPIO_NWR_CLK, ENABLE); RCC_APB2PeriphClockCmd(LCD_GPIO_RD_CLK, ENABLE); RCC_APB2PeriphClockCmd(LCD_GPIO_DATA_CLK, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用功能时钟 //JTAG_Set(SWD_ENABLE); //开启SWD /* Disable the Serial Wire Jtag Debug ort SWJ-DP */ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//JTAG-DP 失能 + SW-DP使能 /* Disable the Serial Wire Jtag Debug ort SWJ-DP */ //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//SWJ完全失能(JTAG+SW-DP) ////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; GPIO_InitStructure.GPIO_Pin = LCD_GPIO_LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_GPIO_LED_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_GPIO_DATA_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_GPIO_CS_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_GPIO_RS_PIN; GPIO_Init(LCD_GPIO_RS_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_GPIO_NWR_PIN; GPIO_Init(LCD_GPIO_NWR_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_GPIO_RD_PIN; GPIO_Init(LCD_GPIO_RD_PORT, &GPIO_InitStructure); //cs,rs,wr,rd = 1; GPIO_WriteBit(LCD_GPIO_LED_PORT,LCD_GPIO_LED_PIN,Bit_SET); GPIO_WriteBit(LCD_GPIO_CS_PORT,LCD_GPIO_CS_PIN,Bit_SET); GPIO_WriteBit(LCD_GPIO_RS_PORT,LCD_GPIO_RS_PIN,Bit_SET); GPIO_WriteBit(LCD_GPIO_NWR_PORT,LCD_GPIO_NWR_PIN,Bit_SET); GPIO_WriteBit(LCD_GPIO_RD_PORT,LCD_GPIO_RD_PIN,Bit_SET); LCD_Delay(5); // LCD_Delay 50 ms LCD_WriteReg(0x0000,0x0001); LCD_Delay(5); // LCD_Delay 50 ms DeviceCode = LCD_ReadReg(0x0000); //printf("ID:%dn",DeviceCode); 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->UR->L // 0 1 0 L->R D->U // 1 1 0 D->UL->R // 0 0 1 R->L U->D // 1 0 1 U->DR->L // 0 1 1 L->R U->D 正常就用这个. // 1 1 1 U->DL->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); LCD_Delay(5); LCD_WriteReg(0x0010,0x1590); LCD_WriteReg(0x0011,0x0227); LCD_Delay(5); LCD_WriteReg(0x0012,0x009c); LCD_Delay(5); LCD_WriteReg(0x0013,0x1900); LCD_WriteReg(0x0029,0x0023); LCD_WriteReg(0x002b,0x000e); LCD_Delay(5); LCD_WriteReg(0x0020,0x0000); LCD_WriteReg(0x0021,0x013f); LCD_Delay(5); //伽马校正 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); LCD_Delay(5); LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置 LCD_WriteReg(0x0051,(LCD_W-1)); //水平GRAM终止位置 LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置 LCD_WriteReg(0x0053,(LCD_H-1)); //垂直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 osition. LCD_WriteReg(0x0f,0x0000);//Extern Display Interface Contral 2. LCD_Delay(5); LCD_WriteReg(0x07,0x0101);//Display Contral. LCD_Delay(5); 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,(LCD_W-1));//Set Y Star LCD_WriteReg(0x52,0);//Set Y End.t. LCD_WriteReg(0x53,(LCD_H-1));// 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 osition? artial Display 1. LCD_WriteReg(0x81,0x0000);//RAM Address Start? artial Display 1. LCD_WriteReg(0x82,0x0000);//RAM Address End-Partial Display 1. LCD_WriteReg(0x83,0x0000);//Displsy osition? artial Display 2. LCD_WriteReg(0x84,0x0000);//RAM Address Start? artial 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==0x1505) { // second release on 3/5 ,luminance is acceptable,water wave appear during camera preview LCD_WriteReg(0x0007,0x0000); LCD_Delay(5); 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 LCD_Delay(5); LCD_WriteReg(0x0007,0x0001); LCD_WriteReg(0x0017,0x0001);//开启电源 LCD_Delay(5); //电源配置 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,(LCD_W-1)); LCD_WriteReg(0x0052,0x0000); LCD_WriteReg(0x0053,(LCD_H-1)); //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); LCD_Delay(20); LCD_WriteReg(0x0007,0x0061); LCD_Delay(20); LCD_WriteReg(0x0007,0x0173); LCD_Delay(20); } else if(DeviceCode==0x8989) { LCD_WriteReg(0x0000,0x0001);LCD_Delay(5);//打开晶振 LCD_WriteReg(0x0003,0xA8A4);LCD_Delay(5);//0xA8A4 LCD_WriteReg(0x000C,0x0000);LCD_Delay(5); LCD_WriteReg(0x000D,0x080C);LCD_Delay(5); LCD_WriteReg(0x000E,0x2B00);LCD_Delay(5); LCD_WriteReg(0x001E,0x00B0);LCD_Delay(5); LCD_WriteReg(0x0001,0x2B3F);LCD_Delay(5);//驱动输出控制320*240 0x6B3F LCD_WriteReg(0x0002,0x0600);LCD_Delay(5); LCD_WriteReg(0x0010,0x0000);LCD_Delay(5); LCD_WriteReg(0x0011,0x6070);LCD_Delay(5);//定义数据格式 16位色 横屏 0x6058 LCD_WriteReg(0x0005,0x0000);LCD_Delay(5); LCD_WriteReg(0x0006,0x0000);LCD_Delay(5); LCD_WriteReg(0x0016,0xEF1C);LCD_Delay(5); LCD_WriteReg(0x0017,0x0003);LCD_Delay(5); LCD_WriteReg(0x0007,0x0233);LCD_Delay(5);//0x0233 LCD_WriteReg(0x000B,0x0000);LCD_Delay(5); LCD_WriteReg(0x000F,0x0000);LCD_Delay(5);//扫描开始地址 LCD_WriteReg(0x0041,0x0000);LCD_Delay(5); LCD_WriteReg(0x0042,0x0000);LCD_Delay(5); LCD_WriteReg(0x0048,0x0000);LCD_Delay(5); LCD_WriteReg(0x0049,0x013F);LCD_Delay(5); LCD_WriteReg(0x004A,0x0000);LCD_Delay(5); LCD_WriteReg(0x004B,0x0000);LCD_Delay(5); LCD_WriteReg(0x0044,0xEF00);LCD_Delay(5); LCD_WriteReg(0x0045,0x0000);LCD_Delay(5); LCD_WriteReg(0x0046,0x013F);LCD_Delay(5); LCD_WriteReg(0x0030,0x0707);LCD_Delay(5); LCD_WriteReg(0x0031,0x0204);LCD_Delay(5); LCD_WriteReg(0x0032,0x0204);LCD_Delay(5); LCD_WriteReg(0x0033,0x0502);LCD_Delay(5); LCD_WriteReg(0x0034,0x0507);LCD_Delay(5); LCD_WriteReg(0x0035,0x0204);LCD_Delay(5); LCD_WriteReg(0x0036,0x0204);LCD_Delay(5); LCD_WriteReg(0x0037,0x0502);LCD_Delay(5); LCD_WriteReg(0x003A,0x0302);LCD_Delay(5); LCD_WriteReg(0x003B,0x0302);LCD_Delay(5); LCD_WriteReg(0x0023,0x0000);LCD_Delay(5); LCD_WriteReg(0x0024,0x0000);LCD_Delay(5); LCD_WriteReg(0x0025,0x8000);LCD_Delay(5); LCD_WriteReg(0x004f,0); //行首址0 LCD_WriteReg(0x004e,0); //列首址0 } else if(DeviceCode==0x4531) { LCD_WriteReg(0X00,0X0001); LCD_Delay(50); LCD_WriteReg(0X10,0X1628); LCD_WriteReg(0X12,0X000e);//0x0006 LCD_WriteReg(0X13,0X0A39); LCD_Delay(10); LCD_WriteReg(0X11,0X0040); LCD_WriteReg(0X15,0X0050); LCD_Delay(40); LCD_WriteReg(0X12,0X001e);//16 LCD_Delay(40); LCD_WriteReg(0X10,0X1620); LCD_WriteReg(0X13,0X2A39); LCD_Delay(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_Delay(5000); Clr_LED;//点亮背光 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); //向每个GRAM写入数据 } } //在指定区域内填充指定颜色 //区域大小: // (xend-xsta)*(yend-ysta) void LCD_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color) { u32 n; //设置窗口 LCD_WriteReg(R80, xsta); //水平方向GRAM起始地址 LCD_WriteReg(R81, xend); //水平方向GRAM结束地址 LCD_WriteReg(R82, ysta); //垂直方向GRAM起始地址 LCD_WriteReg(R83, yend); //垂直方向GRAM结束地址 LCD_SetCursor(xsta,ysta);//设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM n=(u32)(yend-ysta+1)*(xend-xsta+1); while(n--){LCD_WR_DATA(color);}//显示所填充的颜色. //恢复设置 LCD_WriteReg(R80, 0x0000); //水平方向GRAM起始地址 LCD_WriteReg(R81, (LCD_W-1)); //水平方向GRAM结束地址 LCD_WriteReg(R82, 0x0000); //垂直方向GRAM起始地址 LCD_WriteReg(R83, (LCD_H-1)); //垂直方向GRAM结束地址 } //画线 //x1,y1:起点坐标 //x2,y2:终点坐标 void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2) { u16 t; int xerr=0,yerr=0,delta_x,delta_y,distance; int incx,incy,uRow,uCol; delta_x=x2-x1; //计算坐标增量 delta_y=y2-y1; uRow=x1; uCol=y1; if(delta_x>0)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 ; //X坐标增量 yerr+=delta_y ; //Y坐标增量 if(xerr>distance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; } } } //画矩形 void LCD_DrawRectangle(u8 x1, u16 y1, u8 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(u8 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) void LCD_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode) { #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_WriteReg(R80,x); //水平方向GRAM起始地址 LCD_WriteReg(R81,x+(size/2-1));//水平方向GRAM结束地址 LCD_WriteReg(R82,y); //垂直方向GRAM起始地址 LCD_WriteReg(R83,y+size-1); //垂直方向GRAM结束地址 LCD_SetCursor(x,y); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM num=num-' ';//得到偏移后的值 if(!mode) //非叠加方式 { for(pos=0;pos if(size==12)temp=asc2_1206[num][pos];//调用1206字体 else temp=asc2_1608[num][pos]; //调用1608字体 for(t=0;t if(temp&0x01) { LCD_WR_DATA(POINT_COLOR); }else LCD_WR_DATA(BACK_COLOR); temp>>=1; } } } else//叠加方式 { for(pos=0;pos if(size==12)temp=asc2_1206[num][pos];//调用1206字体 else temp=asc2_1608[num][pos]; //调用1608字体 for(t=0;t if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点 temp>>=1; } } } //恢复窗体大小 LCD_WriteReg(R80, 0x0000); //水平方向GRAM起始地址 LCD_WriteReg(R81, (LCD_W-1)); //水平方向GRAM结束地址 LCD_WriteReg(R82, 0x0000); //垂直方向GRAM起始地址 LCD_WriteReg(R83, (LCD_H-1)); //垂直方向GRAM结束地址 } //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(u8 x,u16 y,u32 num,u8 len,u8 size) { u8 t,temp; u8 enshow=0; for(t=0;t temp=(num/mypow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { LCD_ShowChar(x+(size/2)*t,y,' ',size,0); continue; }else enshow=1; } LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0); } } //显示2个数字 //x,y:起点坐标 //size:字体大小 //mode:模式0,填充模式;1,叠加模式 //num:数值(0~99); void LCD_Show2Num(u8 x,u16 y,u16 num,u8 len,u8 size,u8 mode) { u8 t,temp; for(t=0;t temp=(num/mypow(10,len-t-1))%10; LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode); } } //显示字符串 //x,y:起点坐标 //*p:字符串起始地址 //用16字体 void LCD_ShowString(u8 x,u16 y,const u8 *p) { while(*p!=' |