硬汉嵌入式论坛

 找回密码
 立即注册
查看: 12266|回复: 11
收起左侧

[μCGUI] tft 3.0 触摸屏spfd5420资料里的一些引脚在哪里呢?

[复制链接]

2

主题

11

回帖

2

积分

新手上路

积分
2
发表于 2012-9-28 16:36:12 | 显示全部楼层 |阅读模式
安福莱ftf3.0触摸的引脚,像IM2  SDI  SDO 引脚没有嘛?但5420资料里边的模式选择有MO-M2 ,接口输入引脚有 SDI SDO 。请问谁知道这些引脚在哪里?
OH~~year
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2012-9-28 18:04:29 | 显示全部楼层
你看下3.0寸显示模块的原理图。有些引脚是在PCB板上接好的,有些未用的引脚未印出来。
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-9-29 14:50:20 | 显示全部楼层
哦!明白了,是的,这款ftf是用的16-bit mode 有些引脚已经在内部连接了,所以没有引出来。
还有个问题?
对RS控制位,当为低时是选择的 Index register or internal status is selected
                          当为高时是选择的 Control register is selected.
          我的理解这位就是拿来控制读写地址还是读写数据,那到底是低读写地址呢?还是高读写地址呢?还有数据?

我用飞思卡尔编了个程序,现在读写指令都有问题。请高手指点指点,小弟感激不尽。。
OH~~year
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2012-9-29 16:26:47 | 显示全部楼层
RS = 0 是设置寄存器的地址
RS = 1 是读写寄存器内的数据或者显存的数据

RS 和CPU的地址线连接,程序通过访问不同的地址,实现自动选择。
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-10-1 18:39:06 | 显示全部楼层
明白了,搞了好些天,还是不行。能帮忙看看这程序吗?
芯片用的飞思卡尔的K60

主函数
void main(void)
{
       DisableInterrupts;     //禁止总中断
      pllinit60M();     //芯片时钟初始化
       LCD_init();//
       while(1)  
          {           
                  LCD_Clear(s_BackGreen);
           }  
}

tft.txt

9 KB, 下载次数: 114

屏的函数在这里边

OH~~year
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-10-1 18:48:09 | 显示全部楼层
屏函数在附件里边,我初步测试,是全让屏显示一种颜色,但是不管怎么修改,初始化都改了N次了。对了,还有头文件忘了,现在补上。

tft头文件.txt

3 KB, 下载次数: 135

OH~~year
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-10-3 12:54:26 | 显示全部楼层
请高手指点指点,现在我真不知道是写指令的问题,还是初始化寄存器的问题。搞了一周多了。。。。

又搞了两天这是现在最新的程序

#ifndef TFT_H_
#define TFT_H_
   
    //1 头文件
    #include "common.h"
    #include "gpio.h"
    //2 宏定义

/* LCD Control pins */
#define LCD_DATA_PORT PORTA        //TFT数据使用的端口
#define LCD_CtrlPin_NCS    0   /* B 0 */
#define LCD_CtrlPin_RS     1   /* B 1 */
#define LCD_CtrlPin_NWE    2   /* B 2 */
#define LCD_CtrlPin_NOE    3   /* B 3 */
#define LCD_CtrlPin_RST    4   /* B 4 */

#define LCD_CtrlPin_BACKLIGHT    5   /* B 5 */

#define LCD_Ctrl_PORT PORTB     //TFT控制使用的端口

#define LCD_CS_Low()   gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_NCS,0)
#define LCD_CS_High()  gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_NCS,1)
#define LCD_RS_Low()   gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_RS,0)
#define LCD_RS_High()  gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_RS,1)
#define LCD_WR_Low()   gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_NWE,0)
#define LCD_WR_High()  gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_NWE,1)
#define LCD_RD_Low()   gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_NOE,0)
#define LCD_RD_High()  gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_NOE,1)
#define LCD_RST_Low()  gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_RST,0)
#define LCD_RST_High() gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_RST,1)


/* LCD color */
#define White          0xFFFF
#define Black          0x0000
#define Grey           0xF7DE
#define Blue           0x001F
#define Blue2          0x051F
#define Red            0xF800
#define Magenta        0xF81F
#define Green          0x07E0
#define Cyan           0x7FFF
#define Yellow         0xFFE0

#define LCD_DATAUSE_PORT(data)    GPIO_PDOR_REG(PORTA)=(data&0xffff)  //还有缺陷,这样赋值A口其他脚不好用了

//void delay(uint16 y);
void delay(uint32 z);
void delay_us(uint32 z);

void LCD_Write_CMD(uint16 iadd);
void LCD_Write_Data(uint16 idat);
void LCD_WriteReg(uint16 iadd,uint16 iidata);
void LCD_SET_XY(uint16 x,uint16 y);
void LCD_Clear (uint16 color);
void LCD_init(void);

#endif





//-------------------------------------------------------------------------*
// 文件名: tft.c                                                           *
// 说  明: tft初始化函数文件                                               *
//-------------------------------------------------------------------------*

#include "tft.h"               //tft初始化函数文件

void delay(uint32 z)
{
     uint32 x;
     for(x=0;x<z;x++);
}
void delay_us(uint32 z)
{
    while(z)
    {
        z--;
    }
}
/*********************************************************************************
** 函数名称: void LCD_Write_CMD(uint16 iadd).
** 功能描述: LCD写指令.
** 输入参数: uint16 iadd 寄存器地址.         
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/
void LCD_Write_CMD(uint16 iadd)
{
    LCD_CS_Low();   
    LCD_RS_Low();
    LCD_WR_High();
    LCD_DATAUSE_PORT(iadd);
        delay(1);//180ns
    LCD_WR_Low();
        delay(35);//1us
    LCD_WR_High();   
    LCD_CS_High();
}/**/

/*********************************************************************************
** 函数名称: void LCD_Write_Data(uint16 idat).
** 功能描述: LCD写数据.
** 输入参数: uint16 idat 16为数据.         
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/
void LCD_Write_Data(uint16 idat)
{
    LCD_CS_Low();      
    LCD_RS_High();
    LCD_WR_High();
        LCD_DATAUSE_PORT(idat);
        delay(1);//180ns
    LCD_WR_Low();
        delay(35);//1us
    LCD_WR_High();   
    LCD_CS_High();     
}
/*********************************************************************************
** 函数名称: void LCD_Write_Reg(INT16U iadd, INT16U iidata).
** 功能描述: 对lcd寄存器,写命令和数据.
** 输入参数: INT16U iadd, INT16U iidata.         
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/
void LCD_WriteReg(uint16 iadd,uint16 iidata)
{
    LCD_Write_CMD(iadd);
    LCD_Write_Data(iidata);
}
/*********************************************************************************
** 函数名称: void LCD_SET_XY(uint16 Xpos,uint16 Ypos).
** 功能描述: 设置光标函数.
** 输入参数: uint16 Xpos,uint16 Ypos.         
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/
void LCD_SET_XY(uint16 Xpos,uint16 Ypos)
{
    /*
        px,py 是物理坐标, x,y是虚拟坐标
        转换公式:
        py = 399 - x;
        px = y;
    */

    LCD_WriteReg(0x0200, Ypos);          /* px */
    LCD_WriteReg(0x0201, 399 - Xpos);    /* py */
   
    //LCD_WriteReg(0x200,y);
    //LCD_WriteReg(0x201,x);
    //LCD_Write_CMD(0x0202);   
}
/*********************************************************************************
** 函数名称: void LCD_Clear (INT16U color).
** 功能描述: LCD指定颜色清屏.
** 输入参数: INT16U color 清屏颜色.         
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/
void LCD_Clear (uint16 color)
{
    uint8 x;
    uint16 y;
    LCD_SET_XY(0,0);
    for(x=0;x<240;x++)//200
    {
        for(y=0;y<400;y++)//300
        {
            LCD_WriteReg(0x202, color);
        }
    }
}
//----------------------------------   ---------------------------------------*
//函数名: LCD_init                                                         *
//功  能: 初始化LCD控制端口                                                *
//参  数: 无                                                               *
//返  回: 无                                                               *
//说  明: 无                                                               *
//-------------------------------------------------------------------------*
void LCD_init(void)
{
    gpio_init(LCD_Ctrl_PORT,LCD_CtrlPin_NCS,1,1);//初始化控制引脚
        gpio_init(LCD_Ctrl_PORT,LCD_CtrlPin_RS,1,1);
        gpio_init(LCD_Ctrl_PORT,LCD_CtrlPin_NWE,1,1);
        gpio_init(LCD_Ctrl_PORT,LCD_CtrlPin_NOE,1,1);
        gpio_init(LCD_Ctrl_PORT,LCD_CtrlPin_RST,1,1);  
        gpio_init(LCD_Ctrl_PORT,LCD_CtrlPin_BACKLIGHT,1,0);
        
        gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_BACKLIGHT,1);/* 背光控制 0:关 1:开 */
       gpio_ctrl(LCD_Ctrl_PORT,LCD_CtrlPin_NOE,1);
        
        delay(500);   //11.3us
    LCD_RST_Low();        
        delay(500);   //11.3us
        LCD_RST_High();              
        delay(500);   //11.3us
        LCD_CS_Low();
        delay(500);   //11.3us
        
        // 初始化LCD,写LCD寄存器进行配置
    LCD_WriteReg(0x0000, 0x0000);
    LCD_WriteReg(0x0001, 0x0100);
    LCD_WriteReg(0x0002, 0x0100);

    /*
        R003H 寄存器很关键, Entry Mode ,决定了扫描方向
        参见:SPFD5420A.pdf 第15页

        240x400屏幕物理坐标(px,py)如下:
            R003 = 0x1018                  R003 = 0x1008
          -------------------          -------------------
         |(0,0)              |        |(0,0)              |
         |                   |        |
         |  ^           ^    |        |   ^           ^   |
         |  |           |    |        |   |           |   |
         |  |           |    |        |   |           |   |
         |  |           |    |        |   |           |   |
         |  |  ------>  |    |        |   | <------   |   |
         |  |           |    |        |   |           |   |
         |  |           |    |        |   |           |   |
         |  |           |    |        |   |           |   |
         |  |           |    |        |   |           |   |
         |                   |        |
         |                   |        |                   |
         |      (x=239,y=399)|        |      (x=239,y=399)|
         |-------------------|        |-------------------|
         |                   |        |                   |
          -------------------          -------------------

        按照安富莱开发板LCD的方向,我们期望的虚拟坐标和扫描方向如下:(和上图第1个吻合)
         --------------------------------
        |  |(0,0)                        |
        |  |     --------->              |
        |  |         |                   |
        |  |         |                   |
        |  |         |                   |
        |  |         V                   |
        |  |     --------->              |
        |  |                    (399,239)|
         --------------------------------

        虚拟坐标(x,y) 和物理坐标的转换关系
        x = 399 - py;
        y = px;

        py = 399 - x;
        px = y;

    */
    LCD_WriteReg(0x0003, 0x1018); // 0x1018 1030

    LCD_WriteReg(0x0008, 0x0808);
    LCD_WriteReg(0x0009, 0x0001);
    LCD_WriteReg(0x000B, 0x0010);
    LCD_WriteReg(0x000C, 0x0000);
    LCD_WriteReg(0x000F, 0x0000);
    LCD_WriteReg(0x0007, 0x0001);
    LCD_WriteReg(0x0010, 0x0013);
    LCD_WriteReg(0x0011, 0x0501);
    LCD_WriteReg(0x0012, 0x0300);
    LCD_WriteReg(0x0020, 0x021E);
    LCD_WriteReg(0x0021, 0x0202);
    LCD_WriteReg(0x0090, 0x8000);
    LCD_WriteReg(0x0100, 0x17B0);
    LCD_WriteReg(0x0101, 0x0147);
    LCD_WriteReg(0x0102, 0x0135);
    LCD_WriteReg(0x0103, 0x0700);
    LCD_WriteReg(0x0107, 0x0000);
    LCD_WriteReg(0x0110, 0x0001);
    LCD_WriteReg(0x0210, 0x0000);
    LCD_WriteReg(0x0211, 0x00EF);
    LCD_WriteReg(0x0212, 0x0000);
    LCD_WriteReg(0x0213, 0x018F);
    LCD_WriteReg(0x0280, 0x0000);
    LCD_WriteReg(0x0281, 0x0004);
    LCD_WriteReg(0x0282, 0x0000);
    LCD_WriteReg(0x0300, 0x0101);
    LCD_WriteReg(0x0301, 0x0B2C);
    LCD_WriteReg(0x0302, 0x1030);
    LCD_WriteReg(0x0303, 0x3010);
    LCD_WriteReg(0x0304, 0x2C0B);
    LCD_WriteReg(0x0305, 0x0101);
    LCD_WriteReg(0x0306, 0x0807);
    LCD_WriteReg(0x0307, 0x0708);
    LCD_WriteReg(0x0308, 0x0107);
    LCD_WriteReg(0x0309, 0x0105);
    LCD_WriteReg(0x030A, 0x0F04);
    LCD_WriteReg(0x030B, 0x0F00);
    LCD_WriteReg(0x030C, 0x000F);
    LCD_WriteReg(0x030D, 0x040F);
    LCD_WriteReg(0x030E, 0x0300);
    LCD_WriteReg(0x030F, 0x0701);
    LCD_WriteReg(0x0400, 0x3500);
    LCD_WriteReg(0x0401, 0x0001);
    LCD_WriteReg(0x0404, 0x0000);
    LCD_WriteReg(0x0500, 0x0000);
    LCD_WriteReg(0x0501, 0x0000);
    LCD_WriteReg(0x0502, 0x0000);
    LCD_WriteReg(0x0503, 0x0000);
    LCD_WriteReg(0x0504, 0x0000);
    LCD_WriteReg(0x0505, 0x0000);
    LCD_WriteReg(0x0600, 0x0000);
    LCD_WriteReg(0x0606, 0x0000);
    LCD_WriteReg(0x06F0, 0x0000);
    LCD_WriteReg(0x07F0, 0x5420);
    LCD_WriteReg(0x07DE, 0x0000);
    LCD_WriteReg(0x07F2, 0x00DF);
    LCD_WriteReg(0x07F3, 0x0810);
    LCD_WriteReg(0x07F4, 0x0077);
    LCD_WriteReg(0x07F5, 0x0021);
    LCD_WriteReg(0x07F0, 0x0000);
    LCD_WriteReg(0x0007, 0x0173);

    // 设置显示窗口 WINDOWS
    LCD_WriteReg(0x0210, 0);    // 水平起始地址
    LCD_WriteReg(0x0211, 239);    // 水平结束坐标
    LCD_WriteReg(0x0212, 0);    // 垂直起始地址
    LCD_WriteReg(0x0213, 399);    // 垂直结束地址
}


//头文件
#include "includes.h"

//全局变量声明

//主函数
void main(void)
{
   DisableInterrupts;     //禁止总中断
   pllinit180M();
   LCD_init();
   LCD_Clear(Red);//s_BackGreen
   while(1)
   {
     ;;     
   }
   
}
OH~~year
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2012-10-3 20:34:00 | 显示全部楼层
写个测试程序,读取控制器的ID, 看是否5420?  就可以判断读写指令有无问题。
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-10-4 03:23:28 | 显示全部楼层
哦!对啊!是呀。怎么没想到。对了,读的时候要不要先写寄存器!还是直接读GRAM,这样直接读貌似不行吧!求解。。
OH~~year
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-10-4 03:25:01 | 显示全部楼层
先谢过大侠了。小弟现在真的很感激你。
OH~~year
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-10-4 09:27:32 | 显示全部楼层
可以了,终于找到原因了,原来是没有初始化数据端口,值初始化了控制端口的事。。。真崩溃。。[s:150]
OH~~year
回复

使用道具 举报

2

主题

11

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2012-10-4 11:59:01 | 显示全部楼层
终于出来了。。。这是显示效果。。
IMG_20121004_115429.jpg
OH~~year
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-21 06:36 , Processed in 0.320068 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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