STM32
直播中

李健

7年用户 162经验值
私信 关注
[问答]

ALIENTEK板子的库函数写的参考程序无法驱动TFT

上电后,一闪一闪的,隐约能看见一点,哪位高手能帮忙解决一下?最好改一下那程序。

回帖(3)

李椰潭

2019-4-8 09:58:35
把你的代码发上来.
举报

唐般远

2019-4-8 10:09:54
因为程序是一个工程,故不能全部发上来。如果你有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!='') //字符串到达结束
{       
if(x>MAX_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++;
}  
}
举报

张喆

2019-4-8 10:20:11
  看这里
举报

更多回帖

发帖
×
20
完善资料,
赚取积分