OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9781|回复: 11

求助TFT显示问题

[复制链接]

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-4-20 13:36:27 | 显示全部楼层 |阅读模式
原子哥哥和各位热心网友,能帮我看看这是什么问题吗?
本来我在主函数里写:
LCD_PutString(40,60,"I LOVE MY JOB ",Blue2,Yellow);
PutGB3232(20,200,"我",Blue,Yellow); //写入32x32汉字
PutGB3232(60,200,"爱",Blue,Red);
PutGB3232(100,200,"单",Blue,Magenta);
PutGB3232(140,200,"片",Blue,Green);
PutGB3232(180,200,"机",Blue,Cyan);
为什么显示是酱紫的?改I/D位也不对,因为她总是从屏幕的下面开始往上显示起呀,这要怎么改呢?
我觉得是初始化函数或坐标函数的问题吧:







用的是厂家提供的程序。初始化函数是这样的:
//===================== 初始化代码 =======================//



void ILI9325_Initial(void)

  //////////////////////////////////////////////////////////
 delayms(150);                     //根据不同晶振速度可以调整延时,保障稳定显示
Init_data(0x00E5, 0x8000); // 设置核心电压,这个设置是必须的
Init_data(0x0000, 0x0001); // 开启内部时钟OSC(振荡器)  R0位
Init_data(0x0001, 0x0010); // 设置SS和SM位
Init_data(0x0002, 0x0700); // 电源开启(设置一行反转?)
Init_data(0x0003, 0x0030); // 设置GRAM写入方向
//BGR=0 GRAM:graphics RAM,即图像寄存器,在驱动TFT——LCD显示的芯片ILI9325中,存储要显示的图像信息。    
// R3位:入口模式命令
// AM=0.行方向更新   I/D[1:0]控制显示方向
Init_data(0x0004, 0x0000); // 调整寄存器大小
Init_data(0x0008, 0x0202); // 设置后沿和前沿
Init_data(0x0009, 0x0000); // 设置不显示的区域,更新循环ISC【3:0】
Init_data(0x000A, 0x0000); // FMARK 函数(显示设置)
Init_data(0x000C, 0x0000); // RGB 界面设置(显示设置)
Init_data(0x000D, 0x0000); // 0f3c 画面标记位置
Init_data(0x000F, 0x0000); // RGB 界面极性
//*************电源配置 ****************//
Init_data(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
Init_data(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
Init_data(0x0012, 0x0000); // VREG1OUT 电压
Init_data(0x0013, 0x0000); // VDV[4:0] 为了 VCOM 振幅
delayms(200); // 排放电容器电源电压
Init_data(0x0010, 0x17B0); // SAP, BT[3:0], AP, DSTB, SLP, STB
Init_data(0x0011, 0x0037); // DC1[2:0], DC0[2:0], VC[2:0]
delayms(50); // Delay 50ms
Init_data(0x0012, 0x013E); // VREG1OUT 电压
delayms(50); // Delay 50ms
Init_data(0x0013, 0x1F00); // VDV[4:0] 为了 VCOM 振幅
Init_data(0x0029, 0x0013); // VCM[4:0] 为了 VCOMH
delayms(50);
Init_data(0x0020, 0x0000); // GRAM 水平地址
Init_data(0x0021, 0x0000); // GRAM 垂直地址
// ----------- 伽马校正 ----------//
Init_data(0x0030, 0x0000);
Init_data(0x0031, 0x0404);
Init_data(0x0032, 0x0404);
Init_data(0x0035, 0x0004);
Init_data(0x0036, 0x0404);
Init_data(0x0037, 0x0404);
Init_data(0x0038, 0x0404);
Init_data(0x0039, 0x0707);
Init_data(0x003C, 0x0500);
Init_data(0x003D, 0x0607);
//------------------ 设置 GRAM 区域 ---------------//
Init_data(0x0050, 0x0000); // 水平 GRAM 起始地址
Init_data(0x0051, 0x00EF); // 水平 GRAM 终止地址
Init_data(0x0052, 0x0000); // 垂直 GRAM 起始地址
Init_data(0x0053, 0x013F); // 垂直 GRAM 终止位置
Init_data(0x0060, 0x2700); // 门扫描线
Init_data(0x0061, 0x0001); // NDL,VLE, REV
Init_data(0x006A, 0x0000); // 设置卷动线
//-------------- 局部显示控制 ---------//
Init_data(0x0080, 0x0000);//显示位置?局部显示1
Init_data(0x0081, 0x0000);//起始RAM地址?局部显示1
Init_data(0x0082, 0x0000);//终止RAM地址?局部显示1
Init_data(0x0083, 0x0000);//显示位置?局部显示2
Init_data(0x0084, 0x0000);// 起始RAM地址?局部显示2
Init_data(0x0085, 0x0000);//终止RAM地址?局部显示2
//-------------- 面板控制 -------------------//
Init_data(0x0090, 0x0010);//画面循环控制
Init_data(0x0092, 0x0000);//面板界面控制2
Init_data(0x0093, 0x0003);//面板界面控制3
Init_data(0x0095, 0x0110);//画面循环控制
Init_data(0x0097, 0x0000);//
Init_data(0x0098, 0x0000);// 画面循环控制
Init_data(0x0007, 0x0173); // 262K 颜色 和 开启显示

// Write_Cmd_Data(0x0022);//

}
显示坐标的函数是这样子的:
其中有:#define WINDOW_XADDR_START 0x0050 // 水平GRAM起始位置 
#define WINDOW_XADDR_END 0x0051 // 水平GRAM终止位置 
#define WINDOW_YADDR_START 0x0052 // 垂直GRAM起始位置 
#define WINDOW_YADDR_END 0x0053 // 垂直GRAM终止位置
#define GRAM_XADDR    0x0020 // GRAM 水平地址设置
#define GRAM_YADDR    0x0021 // GRAM 垂直地址设置
#define GRAMWR    0x0022 // 记忆写入

/*===========================================================*/

/*************************************************************
函数名称CD_DefineDispWindow
功    能:定义显示窗体
参    数:x0:  窗体中X坐标中较小者
x1:  窗体中X坐标中较大者
y0:  窗体中Y坐标中较小者
y1:  窗体中Y坐标中较大者 
返 回 值:无
*************************************************************/
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
{
  Init_data(WINDOW_XADDR_START,x0);
  Init_data(WINDOW_XADDR_END,x1);
  Init_data(WINDOW_YADDR_START,y0);
  Init_data(WINDOW_YADDR_END,y1);
  Init_data(GRAM_XADDR,x0);
  Init_data(GRAM_YADDR,y0);
  Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR);
}

 

当我的世界不一样,那就让我不一样
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-4-20 14:21:07 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-4-20 23:08:04 | 显示全部楼层
9325的程序我有啊!你看看下面的,我的显示正常!

/********************                                       ********************
* File Name       : lcd_ili9325.c
* Author          : lcrpn 
* Version         : 1.0.1
* Date            : 2012-05-29
* Description     : 
********************************************************************************
* Thanks for STM Microelectronics.


*******************************************************************************/

/* Includes ------------------------------------------------------------------*/

#include "lcd_ili9325.h"


/* rivate define ------------------------------------------------------------*/
/* rivate macro -------------------------------------------------------------*/
/* rivate variables ---------------------------------------------------------*/
  /* Global variables to set the written text color */

/* rivate function prototypes -----------------------------------------------*/
/* rivate functions ---------------------------------------------------------*/


/*******************************************************************************
* Function Name: 
* Description : 
* Input       : None
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_Delay(u32 nCount)
{
delayms(nCount);
// delay_us(1000*nCount);
}
/*******************************************************************************
* Function Name: LCD_ili9325_Initialization
* Description : Initializes the LCD.
* Input       : None
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_Initialization(void)
{
LCD_ili9325_AdjBacklight(255);
/* Configure the LCD Control pins --------------------------------------------*/
LCD_ili9325_CtrlLinesConfig();
/* Configure the FSMC arallel interface -------------------------------------*/
LCD_ili9325_Delay(50); /* delay 50 ms */
  
//lcd_rst();  
LCD_RES(0);
LCD_ili9325_Delay(50); /* delay 50 ms */
LCD_RES(1);
LCD_ili9325_Delay(50); /* delay 50 ms */  

/* LCD_ili9325_WriteReg(0x0000,0x0001);
LCD_ili9325_Delay(10);
LCD_ili9325_WriteReg(0x0015,0x0030);
LCD_ili9325_WriteReg(0x0011,0x0040);
LCD_ili9325_WriteReg(0x0010,0x1628);
LCD_ili9325_WriteReg(0x0012,0x0000);
LCD_ili9325_WriteReg(0x0013,0x104d);
LCD_ili9325_Delay(10);
LCD_ili9325_WriteReg(0x0012,0x0010);
LCD_ili9325_Delay(10);
LCD_ili9325_WriteReg(0x0010,0x2620);
LCD_ili9325_WriteReg(0x0013,0x344d); //304d
LCD_ili9325_Delay(10);
LCD_ili9325_WriteReg(0x0001,0x0100);
LCD_ili9325_WriteReg(0x0002,0x0300);
LCD_ili9325_WriteReg(0x0003,((0x1000) | (LCD_ID_AM<<3))); //direction
LCD_ili9325_WriteReg(0x0008,0x0604);
LCD_ili9325_WriteReg(0x0009,0x0000);
LCD_ili9325_WriteReg(0x000A,0x0008);
LCD_ili9325_WriteReg(0x0041,0x0002);
LCD_ili9325_WriteReg(0x0060,0x2700);
LCD_ili9325_WriteReg(0x0061,0x0001);
LCD_ili9325_WriteReg(0x0090,0x0182);
LCD_ili9325_WriteReg(0x0093,0x0001);
LCD_ili9325_WriteReg(0x00a3,0x0010);
LCD_ili9325_Delay(10);
//################# void Gamma_Set(void) ####################//
LCD_ili9325_WriteReg(0x30,0x0000);
LCD_ili9325_WriteReg(0x31,0x0502);
LCD_ili9325_WriteReg(0x32,0x0307);
LCD_ili9325_WriteReg(0x33,0x0305);
LCD_ili9325_WriteReg(0x34,0x0004);
LCD_ili9325_WriteReg(0x35,0x0402);
LCD_ili9325_WriteReg(0x36,0x0707);
LCD_ili9325_WriteReg(0x37,0x0503);
LCD_ili9325_WriteReg(0x38,0x1505);
LCD_ili9325_WriteReg(0x39,0x1505);
LCD_ili9325_Delay(10);
//################## void Display_ON(void) ####################//
LCD_ili9325_WriteReg(0x0007,0x0001);
LCD_ili9325_Delay(10);
LCD_ili9325_WriteReg(0x0007,0x0021);
LCD_ili9325_WriteReg(0x0007,0x0023);
LCD_ili9325_Delay(10);
LCD_ili9325_WriteReg(0x0007,0x0033);
LCD_ili9325_Delay(10);
LCD_ili9325_WriteReg(0x0007,0x0133);
  */

LCD_ili9325_WriteReg(0x0001,0x0100); 
LCD_ili9325_WriteReg(0x0002,0x0700); 

//写数据方式
LCD_ili9325_WriteReg(0x0003,((0x1000) | (LCD_ID_AM<<3))); //direction

LCD_ili9325_WriteReg(0x0004,0x0000); 
LCD_ili9325_WriteReg(0x0008,0x0207);  
LCD_ili9325_WriteReg(0x0009,0x0000);
LCD_ili9325_WriteReg(0x000A,0x0000); 
LCD_ili9325_WriteReg(0x000C,0x0000); 
LCD_ili9325_WriteReg(0x000D,0x0000);
LCD_ili9325_WriteReg(0x000F,0x0000);
//power on sequence VGHVGL
LCD_ili9325_WriteReg(0x0010,0x0000);   
LCD_ili9325_WriteReg(0x0011,0x0007);  
LCD_ili9325_WriteReg(0x0012,0x0000);  
LCD_ili9325_WriteReg(0x0013,0x0000); 
//vgh 
LCD_ili9325_WriteReg(0x0010,0x1290);   
LCD_ili9325_WriteReg(0x0011,0x0227);
//delayms(100);
//vregiout 
LCD_ili9325_WriteReg(0x0012,0x001d); //0x001b
//delayms(100); 
//vom amplitude
LCD_ili9325_WriteReg(0x0013,0x1500);
//delayms(100); 
//vom H
LCD_ili9325_WriteReg(0x0029,0x0018); 
LCD_ili9325_WriteReg(0x002B,0x000D); 

//gamma
LCD_ili9325_WriteReg(0x0030,0x0004);
LCD_ili9325_WriteReg(0x0031,0x0307);
LCD_ili9325_WriteReg(0x0032,0x0002);// 0006
LCD_ili9325_WriteReg(0x0035,0x0206);
LCD_ili9325_WriteReg(0x0036,0x0408);
LCD_ili9325_WriteReg(0x0037,0x0507); 
LCD_ili9325_WriteReg(0x0038,0x0204);//0200
LCD_ili9325_WriteReg(0x0039,0x0707); 
LCD_ili9325_WriteReg(0x003C,0x0405);// 0504
LCD_ili9325_WriteReg(0x003D,0x0F02); 
//ram
LCD_ili9325_WriteReg(0x0050,0x0000); 
LCD_ili9325_WriteReg(0x0051,0x00EF);
LCD_ili9325_WriteReg(0x0052,0x0000); 
LCD_ili9325_WriteReg(0x0053,0x013F);  
LCD_ili9325_WriteReg(0x0060,0xA700); 
LCD_ili9325_WriteReg(0x0061,0x0001); 
LCD_ili9325_WriteReg(0x006A,0x0000); 
//
LCD_ili9325_WriteReg(0x0080,0x0000); 
LCD_ili9325_WriteReg(0x0081,0x0000); 
LCD_ili9325_WriteReg(0x0082,0x0000); 
LCD_ili9325_WriteReg(0x0083,0x0000); 
LCD_ili9325_WriteReg(0x0084,0x0000); 
LCD_ili9325_WriteReg(0x0085,0x0000); 
//
LCD_ili9325_WriteReg(0x0090,0x0010); 
LCD_ili9325_WriteReg(0x0092,0x0600); 
LCD_ili9325_WriteReg(0x0093,0x0003); 
LCD_ili9325_WriteReg(0x0095,0x0110); 
LCD_ili9325_WriteReg(0x0097,0x0000); 
LCD_ili9325_WriteReg(0x0098,0x0000);
LCD_ili9325_WriteReg(0x0007,0x0133);

LCD_ili9325_Clear(Grey);

}


/*******************************************************************************
* Function Name: LCD_ili9325_Clear
* Description : Clears the hole LCD.
* Input       : Color: the color of the background.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_Clear(u16 Color)
{
u32 index;

LCD_ili9325_SetDisplayWindow(0,0,LCD_DISP_XSIZE,LCD_DISP_YSIZE);
//  LCD_ili9325_SetCursor(0x00, 0x00);
LCD_Write_Com(R34);

for(index = 0; index < ((u32)LCD_DISP_XSIZE*LCD_DISP_YSIZE); index++)
{
LCD_Write_Dat(Color);
}
}

/*******************************************************************************
* Function Name: LCD_ili9325_SetCursor
* Description : Sets the cursor position.
* Input       : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_SetCursor(u16 Xpos, u16 Ypos)
{
if(Xpos >= LCD_DISP_XSIZE)
Xpos = LCD_DISP_XSIZE;
if(Ypos >= LCD_DISP_YSIZE)
Ypos = LCD_DISP_YSIZE;

#if (LCD_ID_AM == 0x00)
LCD_ili9325_WriteReg(R32, (LCD_PHY_XSIZE-1) - Xpos);
LCD_ili9325_WriteReg(R33, (LCD_PHY_YSIZE-1) - Ypos);
#elif (LCD_ID_AM == 0x01)
LCD_ili9325_WriteReg(R32, (LCD_PHY_XSIZE-1) - Ypos);
LCD_ili9325_WriteReg(R33, (LCD_PHY_YSIZE-1) - Xpos);
#elif (LCD_ID_AM == 0x02)
LCD_ili9325_WriteReg(R32, Xpos);
LCD_ili9325_WriteReg(R33, (LCD_PHY_YSIZE-1) - Ypos);
#elif (LCD_ID_AM == 0x03)
LCD_ili9325_WriteReg(R32, Ypos);
LCD_ili9325_WriteReg(R33, (LCD_PHY_YSIZE-1) - Xpos);
#elif (LCD_ID_AM == 0x04)
LCD_ili9325_WriteReg(R32, (LCD_PHY_XSIZE-1) - Xpos);
LCD_ili9325_WriteReg(R33, Ypos);
#elif (LCD_ID_AM == 0x05)
LCD_ili9325_WriteReg(R32, (LCD_PHY_XSIZE-1) - Ypos);
LCD_ili9325_WriteReg(R33, Xpos);
#elif (LCD_ID_AM == 0x06)
LCD_ili9325_WriteReg(R32, Xpos);
LCD_ili9325_WriteReg(R33, Ypos);
#else //(LCD_ID_AM == 0x07)
LCD_ili9325_WriteReg(R32, Ypos);
LCD_ili9325_WriteReg(R33, Xpos);
#endif

}

/*******************************************************************************
* Function Name: LCD_ili9325_SetPixelIndex
* Description : Draws a pixel on LCD.
* Input       : - Xpos: the Line where to display the pixel.
*                    This parameter can be one of the following values:
*                       - Linex: where x can be 0..9
*                  - Ypos: start column address.
*                  - c: pointer to the pixel.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_SetPixelIndex(u16 Xpos, u16 Ypos, u16 c)
{
LCD_ili9325_SetCursor(Xpos, Ypos);
LCD_Write_Com(R34);
LCD_Write_Dat(c);
}
/*******************************************************************************
* Function Name: LCD_ili9325_GetPixelIndex
* Description : Draws a pixel on LCD.
* Input       : - Xpos: the Line where to display the pixel.
*                    This parameter can be one of the following values:
*                       - Linex: where x can be 0..9
*                  - Ypos: start column address.
*                  - c: pointer to the pixel.
* Output      : None
* Return      : None
*******************************************************************************/
u16 LCD_ili9325_GetPixelIndex(u16 Xpos, u16 Ypos)
{
u16 c;
LCD_ili9325_SetCursor(Xpos, Ypos);
LCD_Write_Com(R34);
c = LCD_Read_Dat();
c = LCD_Read_Dat();
return ( (c<<11) | (c&(0x07e0)) | (c>>11) );
}

/*******************************************************************************
* Function Name: LCD_ili9325_SetDisplayWindow
* Description : Sets a display window
* Input       : - Xpos: specifies the X buttom left position.
*                  - Ypos: specifies the Y buttom left position.
*                  - Height: display window height.
*                  - Width: display window width.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_SetDisplayWindow(u16 Xpos, u16 Ypos, u16 Width, u16 Height)
{
#if (LCD_ID_AM == 0x00)
LCD_ili9325_WriteReg(R80, (LCD_PHY_XSIZE-1) - Xpos - (Width-1)); /* Horizontal GRAM Start Address */
LCD_ili9325_WriteReg(R81, (LCD_PHY_XSIZE-1) - Xpos); /* Horizontal GRAM End Address */
LCD_ili9325_WriteReg(R82, (LCD_PHY_YSIZE-1) - Ypos - (Height-1)); /* Vertical GRAM Start Address */
LCD_ili9325_WriteReg(R83, (LCD_PHY_YSIZE-1) - Ypos); /* Vertical GRAM End Address */
#elif (LCD_ID_AM == 0x01)
LCD_ili9325_WriteReg(R80, (LCD_PHY_XSIZE-1) - Ypos - (Height-1));
LCD_ili9325_WriteReg(R81, (LCD_PHY_XSIZE-1) - Ypos);
LCD_ili9325_WriteReg(R82, (LCD_PHY_YSIZE-1) - Xpos - (Width-1));
LCD_ili9325_WriteReg(R83, (LCD_PHY_YSIZE-1) - Xpos);
#elif (LCD_ID_AM == 0x02)
LCD_ili9325_WriteReg(R80, Xpos);
LCD_ili9325_WriteReg(R81, Xpos + (Width-1));
LCD_ili9325_WriteReg(R82, (LCD_PHY_YSIZE-1) - Ypos - (Height-1));
LCD_ili9325_WriteReg(R83, (LCD_PHY_YSIZE-1) - Ypos);
#elif (LCD_ID_AM == 0x03)
LCD_ili9325_WriteReg(R80, Ypos);
LCD_ili9325_WriteReg(R81, Ypos + (Height-1));
LCD_ili9325_WriteReg(R82, (LCD_PHY_YSIZE-1) - Xpos - (Width-1));
LCD_ili9325_WriteReg(R83, (LCD_PHY_YSIZE-1) - Xpos);
#elif (LCD_ID_AM == 0x04)
LCD_ili9325_WriteReg(R80, (LCD_PHY_XSIZE-1) - Xpos - (Width-1));
LCD_ili9325_WriteReg(R81, (LCD_PHY_XSIZE-1) - Xpos);
LCD_ili9325_WriteReg(R82, Ypos);
LCD_ili9325_WriteReg(R83, Ypos + (Height-1));
#elif (LCD_ID_AM == 0x05)
LCD_ili9325_WriteReg(R80, (LCD_PHY_XSIZE-1) - Ypos - (Height-1));
LCD_ili9325_WriteReg(R81, (LCD_PHY_XSIZE-1) - Ypos);
LCD_ili9325_WriteReg(R82, Xpos);
LCD_ili9325_WriteReg(R83, Xpos + (Width-1));
#elif (LCD_ID_AM == 0x06)
LCD_ili9325_WriteReg(R80, Xpos);
LCD_ili9325_WriteReg(R81, Xpos + (Width-1));
LCD_ili9325_WriteReg(R82, Ypos);
LCD_ili9325_WriteReg(R83, Ypos + (Height-1));
#else //if (LCD_ID_AM == 0x07)
LCD_ili9325_WriteReg(R80, Ypos);
LCD_ili9325_WriteReg(R81, Ypos + (Height-1));
LCD_ili9325_WriteReg(R82, Xpos);
LCD_ili9325_WriteReg(R83, Xpos + (Width-1));
#endif
LCD_ili9325_SetCursor(Xpos, Ypos);
}



/*******************************************************************************
* Function Name: LCD_ili9325_WindowModeDisable
* Description : Disables LCD Window mode.
* Input       : None
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_WindowModeDisable(void)
{
LCD_ili9325_SetDisplayWindow(0, 0, LCD_DISP_XSIZE, LCD_DISP_YSIZE);
}
/*******************************************************************************
* Function Name: LCD_ili9325_DrawLine
* Description : Displays a line.
* Input       : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
*                  - Length: line length.
*                  - Direction: line direction.
*                    This parameter can be one of the following values: Vertical
*                    or Horizontal.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_DrawLine(u16 Xpos, u16 Ypos, u16 Length, u16 Direction, u16 color)
{
u16 i = 0;

LCD_ili9325_SetCursor(Xpos, Ypos);

if(Direction == Horizontal)
{
LCD_ili9325_SetDisplayWindow(Xpos, Ypos, Length, 1);
}
else
{
LCD_ili9325_SetDisplayWindow(Xpos, Ypos, 1, Length);
}

LCD_Write_Com(R34);
for(i = 0; i < Length; i++)
{
LCD_Write_Dat(color);
}
}
/****************************************************************************
* 名    称:void GUI_Line(u16 x0, u16 y0, u16 x1, u16 y1,u16 color)
* 功    能:在指定座标画直线
* 入口参数:x0     A点行座标
*           y0     A点列座标
*           x1     B点行座标
*           y1     B点列座标
*           color  线颜色
* 出口参数:无
* 说    明:
* 调用方法:GUI_Line(0,0,240,320,0x0000);
****************************************************************************/
void LCD_ili9325_DrawAnyLine(u16 x0, u16 y0, u16 x1, u16 y1,u16 color)
{
  u16 x,y;
  u16 dx;// = abs(x1 - x0);
  u16 dy;// = abs(y1 - y0);

if(y0==y1)
{
if(x0<=x1)
{
x=x0;
}
else
{
x=x1;
x1=x0;
}
   while(x <= x1)
   {
    LCD_ili9325_SetPixelIndex(x,y0,color);
    x++;
   }
   return;
}
else if(y0>y1)
{
dy=y0-y1;
}
else
{
dy=y1-y0;
}
 
  if(x0==x1)
{
if(y0<=y1)
{
y=y0;
}
else
{
y=y1;
y1=y0;
}
   while(y <= y1)
   {
    LCD_ili9325_SetPixelIndex(x0,y,color);
    y++;
   }
   return;
}
else if(x0 > x1)
  {
dx=x0-x1;
   x = x1;
   x1 = x0;
   y = y1;
   y1 = y0;
  }
  else
  {
dx=x1-x0;
   x = x0;
   y = y0;
  }

  if(dx == dy)
  {
   while(x <= x1)
   {

    x++;
if(y>y1)
{
y--;
}
else
{
    y++;
}
    LCD_ili9325_SetPixelIndex(x,y,color);
   }
  }
  else
  {
  LCD_ili9325_SetPixelIndex(x, y, color);
   if(y < y1)
   {
    if(dx > dy)
    {
     s16 p = dy * 2 - dx;
     s16 twoDy = 2 * dy;
     s16 twoDyMinusDx = 2 * (dy - dx);
     while(x < x1)
     {
      x++;
      if(p < 0)
      {
       p += twoDy;
      }
      else
      {
       y++;
       p += twoDyMinusDx;
      }
      LCD_ili9325_SetPixelIndex(x, y,color);
     }
    }
    else
    {
     s16 p = dx * 2 - dy;
     s16 twoDx = 2 * dx;
     s16 twoDxMinusDy = 2 * (dx - dy);
     while(y < y1)
     {
      y++;
      if(p < 0)
      {
       p += twoDx;
      }
      else
      {
       x++;
       p+= twoDxMinusDy;
      }
      LCD_ili9325_SetPixelIndex(x, y, color);
     }
    }
   }
   else
   {
    if(dx > dy)
    {
     s16 p = dy * 2 - dx;
     s16 twoDy = 2 * dy;
     s16 twoDyMinusDx = 2 * (dy - dx);
     while(x < x1)
     {
      x++;
      if(p < 0)
      {
        p += twoDy;
      }
      else
      {
       y--;
       p += twoDyMinusDx;
       }
      LCD_ili9325_SetPixelIndex(x, y,color);
     }
    }
    else
    {
     s16 p = dx * 2 - dy;
     s16 twoDx = 2 * dx;
     s16 twoDxMinusDy = 2 * (dx - dy);
     while(y1 < y)
     {
      y--;
      if(p < 0)
      {
        p += twoDx;
      }
      else
      {
       x++;
       p+= twoDxMinusDy;
       }
      LCD_ili9325_SetPixelIndex(x, y,color);
     }
    }
   }
  }
}

/*******************************************************************************
* Function Name: LCD_ili9325_DrawRect
* Description : Displays a rectangle.
* Input       : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
*                  - Height: display rectangle height.
*                  - Width: display rectangle width.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_DrawRect(u16 Xpos, u16 Ypos, u16 Width, u16 Height, u16 color)
{
LCD_ili9325_DrawLine(Xpos, Ypos, Width, Horizontal, color);
LCD_ili9325_DrawLine(Xpos, (Ypos + Height - 1), Width, Horizontal, color);

LCD_ili9325_DrawLine(Xpos , Ypos, Height, Vertical, color);
LCD_ili9325_DrawLine((Xpos + Width - 1), Ypos, Height, Vertical, color);
}

/*******************************************************************************
* Function Name: LCD_ili9325_DrawCircle
* Description : Displays a circle.
* Input       : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
*                  - Height: display rectangle height.
*                  - Width: display rectangle width.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_DrawCircle(u16 Xpos, u16 Ypos, u16 Radius, u16 color)
{
s32  D;/* Decision Variable */
u32  CurX;/* Current X Value */
u32  CurY;/* Current Y Value */

if(Radius==0) return;

D = 3 - (s32)(Radius << 1);
CurX = 0;
CurY = Radius;

while (CurX <= CurY)
{
LCD_ili9325_SetPixelIndex(Xpos + CurX, Ypos + CurY, color);
LCD_ili9325_SetPixelIndex(Xpos + CurX, Ypos - CurY, color);
LCD_ili9325_SetPixelIndex(Xpos - CurX, Ypos + CurY, color);
LCD_ili9325_SetPixelIndex(Xpos - CurX, Ypos - CurY, color);
LCD_ili9325_SetPixelIndex(Xpos + CurY, Ypos + CurX, color);
LCD_ili9325_SetPixelIndex(Xpos + CurY, Ypos - CurX, color);
LCD_ili9325_SetPixelIndex(Xpos - CurY, Ypos + CurX, color);
LCD_ili9325_SetPixelIndex(Xpos - CurY, Ypos - CurX, color);

if (D < 0)
{
D += (CurX << 2) + 6;
}
else
{
D += (((s32)CurX - (s32)CurY) << 2) + 10;
CurY--;
}
CurX++;
}
}
/*******************************************************************************
* Function Name: LCD_ili9325_FillRect
* Description : Displays a rectangle.
* Input       : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
*                  - Height: display rectangle height.
*                  - Width: display rectangle width.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_FillRect(u16 Xpos, u16 Ypos, u16 Width, u16 Height, u16 color)
{
u32 index;

LCD_ili9325_SetDisplayWindow(Xpos,Ypos,Width,Height);
//  LCD_ili9325_SetCursor(0x00, 0x00);
LCD_Write_Com(R34);

for(index = 0; index < ((u32)Width*Height); index++)
{
LCD_Write_Dat(color);
}
}

/*******************************************************************************
* Function Name: LCD_ili9325_DrawMonoPict
* Description : Displays a monocolor picture.
* Input       : - ict: pointer to the picture array.
* Output      : None
* Return      : None
*******************************************************************************/

/*******************************************************************************
* Function Name: LCD_ili9325_WriteBMP
* Description : Displays a bitmap picture loaded in the internal Flash.
* Input       : - BmpAddress: Bmp picture address in the internal Flash.
* Output      : None
* Return      : None
*******************************************************************************/

/*******************************************************************************
* Function Name: LCD_ili9325_WriteReg
* Description : Writes to the selected LCD register.
* Input       : - LCD_ili9325_Reg: address of the selected register.
*                  - LCD_ili9325_RegValue: value to write to the selected register.
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
LCD_WriteReg(LCD_Reg, LCD_RegValue);
}

/*******************************************************************************
* Function Name: LCD_ili9325_ReadReg
* Description : Reads the selected LCD Register.
* Input       : None
* Output      : None
* Return      : LCD Register Value.
*******************************************************************************/
u16 LCD_ili9325_ReadReg(u8 LCD_Reg)
{
return LCD_ReadReg(LCD_Reg);
}

/*******************************************************************************
* Function Name: LCD_ili9325_WriteRAM_Prepare
* Description : repare to write to the LCD RAM.
* Input       : None
* Output      : None
* Return      : None
*******************************************************************************/

/*******************************************************************************
* Function Name: *(__IO uint16_t *) (Bank1_LCD_ili9325_D) = 
* Description : Writes to the LCD RAM.
* Input       : - RGB_Code: the pixel color in RGB mode (5-6-5).
* Output      : None
* Return      : None
*******************************************************************************/


/*******************************************************************************
* Function Name: LCD_ili9325_DisplayOn
* Description : Enables the Display.
* Input       : None
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_DisplayOn(void)
{
  /* Display On */
  LCD_ili9325_WriteReg(R7, 0x0173); /* 262K color and display ON */
}

/*******************************************************************************
* Function Name: LCD_ili9325_DisplayOff
* Description : Disables the Display.
* Input       : None
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_DisplayOff(void)
{
  /* Display Off */
  LCD_ili9325_WriteReg(R7, 0x00);
}

/*******************************************************************************
* Function Name: LCD_ili9325_CtrlLinesConfig
* Description : Configures LCD Control lines (FSMC ins) in alternate function
                   ush-Pull mode.
* Input       : None
* Output      : None
* Return      : None
*******************************************************************************/
void LCD_ili9325_CtrlLinesConfig(void)
{
SET_BUS_OUTPUT();
SET_CTL_LINE_OUTPUT();
}

/*******************************************************************************
* Function Name: LCD_ili9325_AdjBacklight(
* Description : 
* Input       : 
* Output      : 
* Return      : 
*******************************************************************************/
void LCD_ili9325_AdjBacklight(u8 level)
{
if(level)
Pwm0_Start(level);
else 
Pwm0_Stop();
}

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-4-20 23:25:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
不是哦。。看图片最下边那有图标吧,最左方是栋房子图标,从他可以看出屏幕的方向正确是从图片的最上边往最下边吧,显示字符时应该是(从上到下)依次为“i love job”     “我爱单片机”,但是现在屏幕的方向是从下到上的依次显示“I love job”   “我爱单片机”
也就是说这液晶屏是倒过来依次显示的,这该怎么改呀,还像不是修改I/D位
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-4-20 23:39:44 | 显示全部楼层




当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-4-22 11:55:48 | 显示全部楼层
改一下lcd.h的宏定义吧 找找看看有没有横屏竖屏的宏定义
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-4-22 16:34:10 | 显示全部楼层
回复【6楼】兰斯洛:
---------------------------------
宏定义就这么几个,而且这不是横屏,竖屏的问题哦
#define WINDOW_XADDR_START 0x0050 // 水平GRAM起始位置 
#define WINDOW_XADDR_END 0x0051 // 水平GRAM终止位置 
#define WINDOW_YADDR_START 0x0052 // 垂直GRAM起始位置 
#define WINDOW_YADDR_END 0x0053 // 垂直GRAM终止位置
#define GRAM_XADDR     0x0020 // GRAM 水平地址设置
#define GRAM_YADDR     0x0021 // GRAM 垂直地址设置
#define GRAMWR      0x0022 // 记忆写入
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-4-22 16:38:18 | 显示全部楼层
头痛~~我略略看了下英文版的datasheet,只知道显示方向的问题好像跟I/D位,和R01h的SS和GS位有关哦,但是改了没用好像。。。。
问题是出在哪里呢
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-4-22 16:42:18 | 显示全部楼层
#define WINDOW_XADDR_START 0x0050 // 水平GRAM起始位置  
#define WINDOW_XADDR_END 0x0051 // 水平GRAM终止位置  
#define WINDOW_YADDR_START 0x0052 // 垂直GRAM起始位置  
#define WINDOW_YADDR_END 0x0053 // 垂直GRAM终止位置 
#define GRAM_XADDR      0x0020 // GRAM 水平地址设置 
#define GRAM_YADDR      0x0021 // GRAM 垂直地址设置 
#define GRAMWR       0x0022 // 记忆写入
你把这里的垂直起始位置对调呢?
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-4-23 01:12:12 | 显示全部楼层
回复【9楼】兰斯洛:
---------------------------------
报告!!黑屏啦~~~~~
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-4-23 10:10:24 | 显示全部楼层
回复【10楼】越不出雷池:
---------------------------------
#define GRAM_XADDR      0x0020 // GRAM 水平地址设置  
#define GRAM_YADDR      0x0021 // GRAM 垂直地址设置 
我觉得还要改这2个才行
你查查这些定义的作用
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-5-14 23:17:21 | 显示全部楼层
有人也出现了同样的问题。。。有哪位大神知道怎么破吗?
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表