修改了写寄存器和读数据函数,其他的没动,下面是修改过的函数,没修改的和原子的一模一样,程序运行后,可以读出控制器的型号,就是没有显示,大家看看是哪里的问题
//画笔颜色,背景颜色
unsigned int POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
unsigned int DeviceCode;
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms != 0)
{
for(i=0;i<250;i++) {}
for(i=0;i<75;i++) {}
ms--;
}
}
/****************************************************************************
* 功 能:传送命令或数据
* 入口参数:data
* 出口参数:无
* 备 注:
****************************************************************************/
void DataToWrite(unsigned int data)
{
PG_ODR=(unsigned char)(data&0x00ff); /* 低8位 */
PE_ODR=(unsigned char)((data>>8)&0x00ff); /* 高8位 */
}
/****************************************************************************
* 功 能:向LCD写数据
* 入口参数:data
* 出口参数:无
* 备 注:
****************************************************************************/
void LCD_WR_DATA(unsigned int data)
{
LCD_RS=1;//写数据
LCD_CS=0;
DataToWrite(data);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}
/****************************************************************************
* 功 能:向LCD写地址
* 入口参数:data
* 出口参数:无
* 备 注:
****************************************************************************/
void LCD_WR_REG(unsigned char data)
{
LCD_RS=0;//写地址
LCD_CS=0;
DataToWrite((unsigned int)data);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}
/****************************************************************************
* 功 能:写寄存器
* 入口参数:LCD_Reg地址,LCD_RegValue寄存器数据
* 出口参数:无
* 备 注:
****************************************************************************/
void LCD_WriteReg(unsigned char LCD_Reg,unsigned int LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
/****************************************************************************
* 功 能:读寄存器
* 入口参数:LCD_Reg地址
* 出口参数:无
* 备 注:
****************************************************************************/
unsigned int LCD_ReadReg(unsigned char LCD_Reg)
{
unsigned int temp,temp1,temp2;
LCD_WR_REG(LCD_Reg); //写入要读的寄存器号
  G_DDR=0X00;//PG上拉输入
  G_CR1=0XFF;
  G_CR2=0X00;
  G_ODR=0XFF;//全部输出高
  E_DDR=0X00;//PG上拉输入
  E_CR1=0XFF;
  E_CR2=0X00;
  E_ODR=0XFF;//全部输出高
LCD_RS=1;
LCD_CS=0;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD=0;
LCD_RD=1;
temp1=PG_IDR;//低8位
temp2=PE_IDR;//高8位
temp=temp1|(temp2<<8);
LCD_CS=1;
  G_DDR=0XFF;//PG推挽输出
  G_CR1=0XFF;
PG_CR2=0X00;
PG_ODR=0XFF;//全部输出高
PE_DDR=0XFF;//PG推挽输出
PE_CR1=0XFF;
PE_CR2=0X00;
PE_ODR=0XFF;//全部输出高
return temp;
}
//读取个某点的颜色值
//x:0~239
//y:0~319
//返回值:此点的颜色
unsigned int LCD_ReadPoint(unsigned int x,unsigned int y)
{
unsigned int temp,temp1,temp2;
if(x>=LCD_W||y>=LCD_H)return 0;//超过了范围,直接返回
LCD_SetCursor(x,y);
LCD_WR_REG(R34); //选择GRAM地址
PG_DDR=0X00;//PG上拉输入
PG_CR1=0XFF;
PG_CR2=0X00;
PG_ODR=0XFF;//全部输出高
PE_DDR=0X00;//PG上拉输入
PE_CR1=0XFF;
PE_CR2=0X00;
PE_ODR=0XFF;//全部输出高
LCD_RS=1;
LCD_CS=0;
//读取数据(读GRAM时,需要读2次)
LCD_RD=0;
LCD_RD=1;
//dummy READ
LCD_RD=0;
LCD_RD=1;
temp1=PG_IDR;//低8位
temp2=PE_IDR;//高8位
temp=temp1|(temp2<<8);
LCD_CS=1;
PG_DDR=0XFF;//PG上拉输入
PG_CR1=0XFF;
PG_CR2=0X00;
PG_ODR=0XFF;//全部输出高
PE_DDR=0XFF;//PG上拉输入
PE_CR1=0XFF;
PE_CR2=0X00;
PE_ODR=0XFF;//全部输出高
if(DeviceCode==0X4535||DeviceCode==0X4531||DeviceCode==0X8989||DeviceCode==0XB505)
return temp;//这几种IC直接返回颜色值
else
return LCD_BGR2RGB(temp);
}
//初始化lcd
//该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
//在其他型号的驱动芯片上没有测试!
void LCD_Init(void)
{
//PB1(LCD_RS),PB2(LCD_WR),PB3(LCD_RD)设为推挽输出
PB_DDR|=0X0E;
PB_CR1|=0X0E;
PB_CR2&=0XF1;
//PF5(LCD_CS)设为推挽输出
PF_DDR|=0X20;
PF_CR1|=0X20;
PF_CR2&=0XDF;
//PG(数据低八位)设为推挽输出
PG_DDR=0XFF;
PG_CR1=0XFF;
PG_CR2=0X00;
//PE(数据高八位)设为推挽输出
PE_DDR=0XFF;
PE_CR1=0XFF;
PE_CR2=0X00;
//PD4(LCD_BL)设为推挽输出
PD_DDR|=0X10;
PD_CR1|=0X10;
PD_CR2&=0XEF;
delay_ms(500); // delay 50 ms
LCD_WriteReg(0x0000,0x0001);
delay_ms(500); // delay 50 ms
DeviceCode = LCD_ReadReg(0x0000);
printf(" LCD ID:%x\n",DeviceCode); //打印LCD ID
if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325
{各种型号的液晶驱动,太长了略去,和原子的miniSTM的里面的一模一样|
}
|