• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

stm8s驱动tft lcd,驱动芯片是 ILI9325

無唁苡對 2018-06-11 浏览量:1233

lcd一直白屏,贴出代码,帮忙看看。,谢谢


main.c源代码

#include "stm8s.h"
#include "lcd.h"

static void CLK_Config(void);
static void UART_Config(void);
void delay_ms(u16 i);

/* Private functions ---------------------------------------------------------*/

void delay_ms(u16 i)
{
  u8 mn;
  while(i--)
  {
    for(m=0;m<39;m++)
      for(n=0;n<100;n++);
  }
}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
void main(void)
{
  CLK_Config();
  GPIO_Config();
 // UART_Config();  
  
  LCD_Init();
  LCD_Clear(black);
  LCD_SetWindows(00100150);  //设置显示窗体
  LCD_Clear(red);
  LCD_SetWindows(00240320);  //设置显示窗体
  while (1)
  {
    LCD_Text(1010"kuibu");
    delay_ms(10000);
  }
}


lcd.h代码:

#define LCD_CS    GPIO_PIN_1
#define LCD_RS    GPIO_PIN_2
#define LCD_WR    GPIO_PIN_3
#define LCD_E    GPIO_PIN_4
#define LCD_RST   GPIO_PIN_5


#define Set_Cs  GPIO_WriteHigh(LCD_CS_PORTLCD_CS)
#define Clr_Cs  GPIO_WriteLow(LCD_CS_PORTLCD_CS)

#define Set_Rs  GPIO_WriteHigh(LCD_RS_PORTLCD_RS)
#define Clr_Rs  GPIO_WriteLow(LCD_RS_PORTLCD_RS)

#define Set_nWr  GPIO_WriteHigh(LCD_WR_PORTLCD_WR)
#define Clr_nWr  GPIO_WriteLow(LCD_WR_PORTLCD_WR)

#define Set_E  GPIO_WriteHigh(LCD_E_PORTLCD_E)
#define Clr_E  GPIO_WriteLow(LCD_E_PORTLCD_E) 

#define Set_RST  GPIO_WriteHigh(LCD_RST_PORTLCD_RST)
#define Clr_RST  GPIO_WriteLow(LCD_RST_PORTLCD_RST)  

#define Set_nRd  GPIO_WriteHigh(LCD_RST_PORTLCD_RST)
#define Clr_nRd  GPIO_WriteLow(LCD_RST_PORTLCD_RST)  


void LCD_Init(void);
void LCD_WriteIndex(u16 index);
void LCD_WriteData(u16 data);
void LCD_WriteReg(u16 LCD_Regu16 LCD_RegValue);
void LCD_SetCursor( u16 Xpos u16 Ypos );
void LCD_Clear(u16 Color);
void GPIO_Config(void);
void LCD_Text(u16 x u16 y u8 *str);
void LCD_SetWindows(u16 StartXu16 StartYu16 EndXu16 EndY);
void delay_ms(u16 i);
#endif


lcd.c源代码

#include "lcd.h"

#include "stm8s.h"
#define  ILI9320    0  /* 0x9320 */
#define  ILI9325    1  /* 0x9325 */
#define  ILI9328    2  /* 0x9328 */
#define  ILI9331    3  /* 0x9331 */
#define  SSD1298    4  /* 0x8999 */
#define  SSD1289    5  /* 0x8989 */
#define  ST7781     6  /* 0x7783 */
#define  LGDP4531   7  /* 0x4531 */
#define  SPFD5408B  8  /* 0x5408 */
#define  R61505U    9  /* 0x1505 0x0505 */   
#define  HX8347D    10 /* 0x0047 */
#define  HX8347A    11 /* 0x0047 */
#define  LGDP4535   12 /* 0x4535 */  
#define  SSD2119    13 /* 3.5 LCD 0x9919 */

void LCD_Init(void);
void LCD_WriteIndex(u16 index);
void LCD_WriteData(u16 data);
void LCD_WriteReg(u16 LCD_Regu16 LCD_RegValue);
void LCD_SetCursor( u16 Xpos u16 Ypos );
void LCD_Clear(u16 Color);
void GPIO_Config(void);
void LCD_Text(u16 x u16 y u8 *str);
void LCD_SetWindows(u16 StartXu16 StartYu16 EndXu16 EndY);

/* 写命令函数 */
void LCD_WriteIndex(u16 index)
{
  u8 index1index2;
  index1=(u8)index;
  index2=(u8)(index>>8);
  Clr_Rs; //RS=0
  Set_nRd; //RD=0
  delay_ms(1); //延时
  GPIO_Write(LCD_DATA1_PORTindex2);
  GPIO_Write(LCD_DATA2_PORTindex1); /*写命令 */
  delay_ms(1); //延时
  Clr_nWr; //WR=0
  Set_nWr; //WR=1
  }

/* 写数据函数 */
void LCD_WriteData(u16 data)
{
  u8 data1data2;
  data1=(u8)data;
  data2=(u8)(data>>8);
  Set_Rs; //RS=1
  Set_nRd; //RD=0
  delay_ms(1); //延时
  GPIO_Write(LCD_DATA1_PORTdata1);
  GPIO_Write(LCD_DATA2_PORTdata2); /*写数据*/
  delay_ms(1); //延时
  Clr_nWr; //WR=0
  Set_nWr; //WR=1
}

/*指定的地址写入数据, LCD_Reg 是地址, LCD_RegValue 是写入的值*/
void LCD_WriteReg(u16 LCD_Regu16 LCD_RegValue)
{
  Clr_Cs;
  LCD_WriteIndex(LCD_Reg); //写指令;即要写入数据的地址;
  LCD_WriteData(LCD_RegValue); //数据写入;
  Set_Cs;
}

//初始化LCD12864
void LCD_Init(void)
{
  GPIO_Config();
  Clr_RST; /* LCD 复位*/
  delay_ms(100);
  Set_RST;
  GPIO_WriteHigh(GPIOCGPIO_PIN_6); /*使能背光 */
  LCD_WriteReg(0x00e70x0010);      
  LCD_WriteReg(0x00000x0001);   /* start internal osc */

  LCD_WriteReg(0x0001(0<<10)|(1<<8));
  LCD_WriteReg(0x00020x0700); /* power on sequence */
  #if (DISP_ORIENTATION == 0)
  LCD_WriteReg(0x0003(1<<12)|(1<<5)|(1<<4)|(0<<3));
  #elif (DISP_ORIENTATION == 90)
  LCD_WriteReg(0x0003(1<<12)|(0<<5)|(1<<4)|(1<<3));
  #elif (DISP_ORIENTATION == 180)
  LCD_WriteReg(0x0003(1<<12)|(0<<5)|(0<<4)|(0<<3));
  #elif (DISP_ORIENTATION == 270)
  LCD_WriteReg(0x0003(1<<12)|(1<<5)|(0<<4)|(1<<3));
  #endif
  LCD_WriteReg(0x00040x0000);    
  LCD_WriteReg(0x00080x0207);           
  LCD_WriteReg(0x00090x0000);         
  LCD_WriteReg(0x000a0x0000); /* display setting */        
  LCD_WriteReg(0x000c0x0001); /* display setting */        
  LCD_WriteReg(0x000d0x0000);        
  LCD_WriteReg(0x000f0x0000);  /* Power On sequence */
  LCD_WriteReg(0x00100x0000);   
  LCD_WriteReg(0x00110x0007);
  LCD_WriteReg(0x00120x0000);                                                                 
  LCD_WriteReg(0x00130x0000);                 
  delay_ms(50);  /* delay 50 ms */
  LCD_WriteReg(0x00100x1590);   
  LCD_WriteReg(0x00110x0227);
  delay_ms(50);  /* delay 50 ms */
  LCD_WriteReg(0x00120x009c);                  
  delay_ms(50);  /* delay 50 ms */
  LCD_WriteReg(0x00130x1900);   
  LCD_WriteReg(0x00290x0023);
  LCD_WriteReg(0x002b0x000e);
  delay_ms(50);  /* delay 50 ms */        
  delay_ms(50);  /* delay 50 ms */
  LCD_WriteReg(0x00300x0007); 
  LCD_WriteReg(0x00310x0707);   
  LCD_WriteReg(0x00320x0006);
  LCD_WriteReg(0x00350x0704);
  LCD_WriteReg(0x00360x1f04); 
  LCD_WriteReg(0x00370x0004);
  LCD_WriteReg(0x00380x0000);        
  LCD_WriteReg(0x00390x0706);     
  LCD_WriteReg(0x003c0x0701);
  LCD_WriteReg(0x003d0x000f);
  delay_ms(50);  /* delay 50 ms */
  LCD_WriteReg(0x00500x0000);        
  LCD_WriteReg(0x00510x00ef);   
  LCD_WriteReg(0x00520x0000);     
  LCD_WriteReg(0x00530x013f);
  LCD_WriteReg(0x00600xa700);        
  LCD_WriteReg(0x00610x0001); 
  LCD_WriteReg(0x006a0x0000);
  LCD_WriteReg(0x00800x0000);
  LCD_WriteReg(0x00810x0000);
  LCD_WriteReg(0x00820x0000);
  LCD_WriteReg(0x00830x0000);
  LCD_WriteReg(0x00840x0000);
  LCD_WriteReg(0x00850x0000);
  LCD_WriteReg(0x00900x0010);     
  LCD_WriteReg(0x00920x0600);  
  LCD_WriteReg(0x00930x0003);
  LCD_WriteReg(0x00950x0110);
  LCD_WriteReg(0x00970x0000);        
  LCD_WriteReg(0x00980x0000);  /* display on sequence */    
  LCD_WriteReg(0x00070x0133);
  delay_ms(10);
  LCD_WriteReg(0x00200x0000); 
  LCD_WriteReg(0x00210x0000);
}

//设置显示窗口的位置 X/Y
void LCD_SetCursor( u16 Xpos u16 Ypos)
{      
    LCD_WriteReg(0x0020 Xpos);    
    LCD_WriteReg(0x0021 Ypos);    
}

//设置窗口区域
void LCD_SetWindows(u16 StartXu16 StartYu16 EndXu16 EndY)
{
    LCD_SetCursor(StartXStartY);
    LCD_WriteReg(0x0050 StartX);
    LCD_WriteReg(0x0052 StartY);
    LCD_WriteReg(0x0051 EndX);
    LCD_WriteReg(0x0053 EndY);
}

//清屏函数,作用是让整个屏显示某一种颜色
void LCD_Clear(u16 Color)
{
  u32 index=0;
  LCD_SetCursor(00);
  Clr_Cs; 
  LCD_WriteIndex(0x0022);
  for( index = 0; index < MAX_X * MAX_Y; index++ )
  {
    LCD_WriteData(Color);
  }
  Set_Cs;
}


//在指定座标画点
void LCD_SetPoint(uint16_t Xposuint16_t Yposuint16_t point)
{
if( Xpos >= MAX_X || Ypos >= MAX_Y )
{
return;
}
LCD_SetCursor(XposYpos);
LCD_WriteReg(0x0022point);
}



//在指定座标显示字符串
void LCD_Text(u16 x u16 y u8 *str)
{
    u8 i;
    i=0;
    while(*str)
    {
      i++;
      LCD_SetPoint((x+8*i)y*str++);
    }
}

//IO口设置
void GPIO_Config(void)
{
  GPIO_Init(GPIOBGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
            GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOGGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
            GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOCGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
            GPIO_PIN_5|GPIO_PIN_6GPIO_MODE_OUT_PP_LOW_FAST);
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这个只能对照数据手册一步一步查,首先确实寄存器是不是写入正确的
    • 发布于 2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:6
  •  GPIO_Init(GPIOBGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
                GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7GPIO_MODE_OUT_PP_LOW_FAST);
      GPIO_Init(GPIOGGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
                GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7GPIO_MODE_OUT_PP_LOW_FAST);
      GPIO_Init(GPIOCGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|

                GPIO_PIN_5|GPIO_PIN_6GPIO_MODE_OUT_PP_LOW_FAST);

    好像少了逗号

    • 发布于2018-06-11
    • 举报
    • 评论 1
    • 0
    • 0
無唁苡對 回复了 蓝蓝的天 :哦,有逗号的,粘贴时没打出来 回复

  • 有可能是信号时钟输入太快,9325跟不上速度。
    • 发布于2018-06-12
    • 举报
    • 评论 1
    • 0
    • 0
無唁苡對 回复了 drepa :加延时么 回复

無唁苡對 回复了 wildmonkey :哦,有逗号的,粘贴时没打出来 回复

  • 看看驱动时序是否正常,直接一大堆代码别人也会看晕
    • 发布于2018-06-12
    • 举报
    • 评论 1
    • 0
    • 0
無唁苡對 回复了 菜鸟冷虎 :怎么检查时序对不对? 回复

  • 9325是8080接口的,楼主需要用逻辑分析仪抓取一下输入的波形对不对,再反推MCU的输出信号对不对,debug过程比较麻烦,一定要有耐心。

    • 发布于2018-06-14
    • 举报
    • 评论 0
    • 0
    • 0

  • 单从代码看不出什么的,首先你要确定STM8芯片本身对应的IO有输出,会不会因为IO初始化不正确导致不能输出

    其次确定LCD与STM8的连接没问题

    • 发布于2018-06-15
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

stm8s驱动tft lcd,驱动芯片是 ILI9325