OpenEdv-开源电子网

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

求助:stm32驱动ili9325 tft

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-4-23
在线时间
0 小时
发表于 2013-4-23 11:59:05 | 显示全部楼层 |阅读模式
从网上买的stm32f103zet6的最小板,ili9325的240*320液晶屏,因为板子和屏幕不是匹配的,而且最小板的管脚不连续,于是自己用洞洞板做了一个转接板,程序上把一些不连续的管脚虚拟出一个8位的X口,通过GPIO_WriteX(u8 data)送数据,但是前后弄了十多天,还是显示不了,感觉时序没有问题的,谁能帮帮我啊,先谢谢了

主函数

#include<stm32f10x_lib.h>
#include "initial.h"
#include "9325tp.h"
#define TOP    10
#define BOTTOM 10
#define LEFT   15
#define RIGHT  10
#define DISTANCE  20

/* LCD color */
#define White          0xFFFF
#define Black          0x0000
#define Blue           0x001F
#define Blue2          0x051F
#define Red            0xF800
#define Magenta        0xF81F
#define Green          0x07E0
#define Cyan           0x7FFF
#define Yellow         0xFFE0
int main(void)

    u8 i;
    RCC_Config();
    GPIO_Config();
  ILI9325_Initial(); //初始化LCD
CLR_Screen(Red);
  while(1)
       {
       }
  }
初始化的initial.c和initial.h
initial.h
#ifndef __INITIAL_H_
#define __INITIAL_H_
#include<stm32f10x_lib.h>
void RCC_Config(void);
void GPIO_Config(void);
void GPIO_WriteX(u8 t);
void delay_ms(u16 t);
void delay_13ns(u8 t);
#endif

initial.c

#include "initial.h"
static volatile ErrorStatus HSEStartUpStatus = SUCCESS;
u8 flag=0x00;
    struct Portx{
    struct XPin{
    GPIO_TypeDef *GPIOX;
    u16 pin;
    } xp[8];
    } px;
void  RCC_Config(void)
{
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/  
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();//将rcc寄存器只为缺省值

  /* Enable HSE *///设置外部高速晶振
  RCC_HSEConfig(RCC_HSE_ON);
  //RCC_HSICmd(ENABLE);                  

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
    {
     /* Enable Prefetch Buffer */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     //使能预取指令缓存
     /* Flash 2 wait state */
     FLASH_SetLatency(FLASH_Latency_2);
     //设置代码延时值,2个周期
     /* HCLK = SYSCLK */
     RCC_HCLKConfig(RCC_SYSCLK_Div1);
        //设置AHB时钟分频
     /* PCLK2 = HCLK */
     RCC_PCLK2Config(RCC_HCLK_Div1);
       //设置高速ahb时钟
     /* PCLK1 = HCLK/2 */
     RCC_PCLK1Config(RCC_HCLK_Div4);
        //设置低速ahb时钟
     /* PLLCLK = 8MHz * 9 = 72 MHz *///设置时钟源和倍频系数
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
     //RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
     /* Enable PLL */
     RCC_PLLCmd(ENABLE);
      //使能或失能pll
     /* Wait till PLL is ready *///检查指定的标志位设定与否
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
       {                     //就绪
       }
       //设置系统时钟,pll作为系统时钟
     /* Select PLL as system clock source */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
 
     /* Wait till PLL is used as system clock source */
     while(RCC_GetSYSCLKSource() != 0x08)
      {
      }
    }
    }
void GPIO_Config(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;

    /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
           | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
           | RCC_APB2Periph_AFIO, ENABLE);


    //Configure PB12 pin: TP_CS pin
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
      GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
      GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
      GPIO_Init(GPIOC,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
      GPIO_Init(GPIOE,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
      GPIO_Init(GPIOF,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
      GPIO_Init(GPIOG,&GPIO_InitStructure);

      px.xp[7].GPIOX=GPIOE;           px.xp[7].pin=GPIO_Pin_7;
    px.xp[6].GPIOX=GPIOG;           px.xp[6].pin=GPIO_Pin_0;
    px.xp[5].GPIOX=GPIOF;           px.xp[5].pin=GPIO_Pin_14;
    px.xp[4].GPIOX=GPIOF;           px.xp[4].pin=GPIO_Pin_12;
    px.xp[3].GPIOX=GPIOB;           px.xp[3].pin=GPIO_Pin_2;
    px.xp[2].GPIOX=GPIOB;           px.xp[2].pin=GPIO_Pin_0;
    px.xp[1].GPIOX=GPIOC;           px.xp[1].pin=GPIO_Pin_4;
    px.xp[0].GPIOX=GPIOA;           px.xp[0].pin=GPIO_Pin_6;
   
}
/*引脚定义
PA0--------------------RS
PA2--------------------RW
PA4--------------------RD
PE9--------------------CS
PE11-------------------RST
DB7    DB6    DB5     DB4        DB3     DB2      DB1    DB0
PE7    PG0    PF14    PF12    PB2        PB0   PC4    PA6
*/
void GPIO_WriteX(u8 t)
{
    u8 i;
    for(i=0;i<8;i++)
    {
    GPIO_WriteBit(px.xp.GPIOX,px.xp.pin,(0x01<<i)&t);
    }
}
void delay_ms(u16 nms) {
 u32 temp;
 SysTick->LOAD = 9000*nms;
 SysTick->VAL=0X00;//清空计数器
 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
 do{
 temp=SysTick->CTRL;//读取当前倒计数值
 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
  SysTick->CTRL=0x00; //关闭计数器
  SysTick->VAL =0X00; //清空计数器
  }
  void delay_13ns(u8 t)
  {
      while(t--);
}          

tft函数部分

9325tp.h

#ifndef __ILI9325_H__
#define __ILI9325_H__

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif
//
//unsigned char code pic[];
/*----------------------------------------------------------------
                           定义硬件端口
PA0--------------------RS
PA2--------------------RW
PA4--------------------RD
PE9--------------------CS
----------------------------------------------------------------*/
#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0);
#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0);
#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_2);
#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_2);
#define RDL GPIO_ResetBits(GPIOA,GPIO_Pin_4);
#define RDH GPIO_SetBits(GPIOA,GPIO_Pin_4);
#define CSL GPIO_ResetBits(GPIOE,GPIO_Pin_9);
#define CSH GPIO_SetBits(GPIOE,GPIO_Pin_9);
void ILI9325_Initial(void);
void Write_Cmd_Data(unsigned char x, unsigned int y);
void Write_Cmd(unsigned char DH,unsigned char DL);
void Write_Data(unsigned char DH,unsigned char DL);
void  Write_Data_U16(unsigned int y);
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1);
void CLR_Screen(unsigned int bColor);            
#endif

9325tp.c

#include<stm32f10x_lib.h>
#include"9325tp.h"
#include "initial.h"
/*----------------------------------------------------------------
                            全局变量
----------------------------------------------------------------*/
#define WINDOW_XADDR_START    0x0050 // Horizontal Start Address Set
#define WINDOW_XADDR_END    0x0051 // Horizontal End Address Set
#define WINDOW_YADDR_START    0x0052 // Vertical Start Address Set
#define WINDOW_YADDR_END    0x0053 // Vertical End Address Set
#define GRAM_XADDR            0x0020 // GRAM Horizontal Address Set
#define GRAM_YADDR            0x0021 // GRAM Vertical Address Set
#define GRAMWR                 0x0022 // memory write

#define DataPort P0                //数据口使用DataPort

/*----------------------------------------------------------------
                           清屏函数
输入参数:bColor 清屏所使用的背景色
----------------------------------------------------------------*/
void CLR_Screen(unsigned int bColor)
{
 unsigned int i,j;
 LCD_SetPos(0,240,0,320);//320x240
 for (i=0;i<320;i++)
    {
   
       for (j=0;j<240;j++)
           Write_Data_U16(bColor);

    }
}
void  Write_Cmd_Data (unsigned char x,unsigned int y)
{
    unsigned char m,n;
    m=y>>8;
    n=y;
    Write_Cmd(0x00,x);
    Write_Data(m,n);

}

/*----------------------------------------------------------------
                         写16位数据
----------------------------------------------------------------*/
void  Write_Data_U16(unsigned int y)
{
    unsigned char m,n;
    m=y>>8;
    n=y;
    Write_Data(m,n);

}
/*----------------------------------------------------------------
                           写命令
----------------------------------------------------------------*/

void Write_Cmd(unsigned char DH,unsigned char DL)
{
    RSL;
    delay_13ns(30);
    CSL;
    GPIO_WriteX(DH);
    RWL;
    RWH;
    delay_13ns(30);
    GPIO_WriteX(DL);
    RWL;
    RWH;
    delay_13ns(30);
    CSH;
}

/*----------------------------------------------------------------
                           写数据 双8位
----------------------------------------------------------------*/

void Write_Data(unsigned char DH,unsigned char DL)
{
    RSH;
    delay_13ns(30);
    CSL;
    GPIO_WriteX(DH);
    RWL;
    RWH;
    delay_13ns(30);
    GPIO_WriteX(DL);
    RWL;
    RWH;
    delay_13ns(30);
    CSH;
}
void ILI9325_Initial(void)
{
   // CS=1;
   CSL;
    delay_ms(5);
//    RES=0;
RSL;
    delay_ms(5);
//    RES=1;
RSH;
 delay_ms(50);
 Write_Cmd_Data(0x0001,0x0100);
 Write_Cmd_Data(0x0002,0x0700);
 Write_Cmd_Data(0x0003,0x1030);
 Write_Cmd_Data(0x0004,0x0000);
 Write_Cmd_Data(0x0008,0x0207); 
 Write_Cmd_Data(0x0009,0x0000);
 Write_Cmd_Data(0x000A,0x0000);
 Write_Cmd_Data(0x000C,0x0000);
 Write_Cmd_Data(0x000D,0x0000);
 Write_Cmd_Data(0x000F,0x0000);
//power on sequence VGHVGL
 Write_Cmd_Data(0x0010,0x0000);  
 Write_Cmd_Data(0x0011,0x0007); 
 Write_Cmd_Data(0x0012,0x0000); 
 Write_Cmd_Data(0x0013,0x0000);
//vgh
 Write_Cmd_Data(0x0010,0x1290);  
 Write_Cmd_Data(0x0011,0x0227);
 //delayms(100);
 //vregiout
 Write_Cmd_Data(0x0012,0x001d); //0x001b
 //delayms(100);
 //vom amplitude
 Write_Cmd_Data(0x0013,0x1500);
 //delayms(100);
 //vom H
 Write_Cmd_Data(0x0029,0x0018);
 Write_Cmd_Data(0x002B,0x000D);

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

   
   
//    Write_Cmd_Data(0x0022);//       
}
/*----------------------------------------------------------------
                         设置坐标
----------------------------------------------------------------*/
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
{
  Write_Cmd_Data(WINDOW_XADDR_START,x0);
  Write_Cmd_Data(WINDOW_XADDR_END,x1);
  Write_Cmd_Data(WINDOW_YADDR_START,y0);
  Write_Cmd_Data(WINDOW_YADDR_END,y1);
  Write_Cmd_Data(GRAM_XADDR,x0);
  Write_Cmd_Data(GRAM_YADDR,y0);
  Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR);
}
连接效果


转接板原理图


转接板原理图.JPG
连接效果.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-23 13:13:49 | 显示全部楼层
先读LCD ID,这个都读不出的话,其他多不用考虑了.
读出ID了,就成功一半了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-21 02:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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