OpenEdv-开源电子网

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

tft初始化程序问题

[复制链接]

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
发表于 2012-10-16 11:54:56 | 显示全部楼层 |阅读模式
我自己写了一个tft画点的函数,但是没有效果,和原子的对比了。基本完全一样的。其中初始化部分是直接用的原子大哥的

//lcd_cs-------pc9
//lcd_rs-------pc8
//lcd_wr-------pc7
//lcd_rd-------pc6
//lcd_data-----pb0-15
//ili9325采用的是8080并口驱动接口
#include <stm32f10x_gpio.h>
#include "own.h"

#define DATAOUT(data) (GPIOB->ODR = data)

#define TFT_CS_SET (GPIOC->BSRR = 0X200)
#define TFT_CS_CLR (GPIOC->BRR  = 0X200)

#define TFT_RS_SET (GPIOC->BSRR = 0X100)
#define TFT_RS_CLR (GPIOC->BRR  = 0X100)

#define TFT_WR_SET (GPIOC->BSRR = 0X80 )
#define TFT_WR_CLR (GPIOC->BRR  = 0X80 )

#define TFT_RD_SET (GPIOC->BSRR = 0X40 )
#define TFT_RD_CLR (GPIOC->BRR  = 0X40 )
//另外pc10控制背光,高电平开启背光
//函数实现写入需要操作的寄存器地址到ir寄存器中
void TFT_WR_INDEX(unsigned int index)
{
    TFT_CS_CLR;
    TFT_RS_CLR;
    DATAOUT(index);
    TFT_WR_CLR;
    TFT_WR_SET;
    TFT_RS_SET;
    TFT_CS_SET;   
}
//向对应的寄存器或者GRAM中传入16位数据
void TFT_WR_DATA(unsigned int t_data)
{
    TFT_CS_CLR;
    TFT_RS_SET;
    DATAOUT(t_data);
    TFT_WR_CLR;
    TFT_WR_SET;
    TFT_CS_SET;
}

void TFT_write_reg(unsigned int index,unsigned int t_data)
{
    TFT_WR_INDEX(index);
    TFT_WR_DATA(t_data);

}

void TFT_init(void)
{
/*
    RCC->APB2ENR |= (1<<3);
    RCC->APB2ENR |= (1<<4);//B C 端口使能

    GPIOB->CRL = 0X33333333;
    GPIOB->CRH = 0X33333333;//B端口做为输出
    GPIOB->ODR=0XFFFF;

    GPIOC->CRL &= ~((unsigned int)0XFF<<24);
    GPIOC->CRL |= (0X33<<24);//RD WR 输出

    GPIOC->CRH &= ~(0XFFF);
    GPIOC->CRH |= 0X333;     //RS CS 输出

    GPIOC->BSRR = ((1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10));
    //初始化输出为高电平
*/
     RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
     RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟

    RCC->APB2ENR|=1<<0;    //开启辅助时钟
                                             
    //PORTC6~10复用推挽输出    
    GPIOC->CRH&=0XFFFFF000;
    GPIOC->CRH|=0X00000333;
    GPIOC->CRL&=0X00FFFFFF;
    GPIOC->CRL|=0X33000000; 
    GPIOC->ODR|=0X07C0;      
    //PORTB 推挽输出    
    GPIOB->CRH=0X33333333;
    GPIOB->CRL=0X33333333;      
    GPIOB->ODR=0XFFFF;
//厂家代码
    systick_delay_ms(72,50); // delay 50 ms
    TFT_write_reg(0x0000,0x0001);
    systick_delay_ms(72,50); // delay 50 ms

    TFT_write_reg(0x00E5,0x78F0);
    TFT_write_reg(0x0001,0x0100);
    TFT_write_reg(0x0002,0x0700);
    TFT_write_reg(0x0003,0x1030);
    TFT_write_reg(0x0004,0x0000);
    TFT_write_reg(0x0008,0x0202); 
    TFT_write_reg(0x0009,0x0000);
    TFT_write_reg(0x000A,0x0000);
    TFT_write_reg(0x000C,0x0000);
    TFT_write_reg(0x000D,0x0000);
    TFT_write_reg(0x000F,0x0000);
    //power on sequence VGHVGL
    TFT_write_reg(0x0010,0x0000);  
    TFT_write_reg(0x0011,0x0007); 
    TFT_write_reg(0x0012,0x0000); 
    TFT_write_reg(0x0013,0x0000);
    TFT_write_reg(0x0007,0x0000);
    //vgh
    TFT_write_reg(0x0010,0x1690);  
    TFT_write_reg(0x0011,0x0227);
    systick_delay_ms(72,100);
    //vregiout
    TFT_write_reg(0x0012,0x009D); //0x001b
    systick_delay_ms(72,100);
    //vom amplitude
    TFT_write_reg(0x0013,0x1900);
    systick_delay_ms(72,100);
    //vom H
    TFT_write_reg(0x0029,0x0025);
    TFT_write_reg(0x002B,0x000D);
    //gamma
    TFT_write_reg(0x0030,0x0007);
    TFT_write_reg(0x0031,0x0303);
    TFT_write_reg(0x0032,0x0003);// 0006
    TFT_write_reg(0x0035,0x0206);
    TFT_write_reg(0x0036,0x0008);
    TFT_write_reg(0x0037,0x0406);
    TFT_write_reg(0x0038,0x0304);//0200
    TFT_write_reg(0x0039,0x0007);
    TFT_write_reg(0x003C,0x0602);// 0504
    TFT_write_reg(0x003D,0x0008);
    //ram
    TFT_write_reg(0x0050,0x0000);
    TFT_write_reg(0x0051,0x00EF);
    TFT_write_reg(0x0052,0x0000);
    TFT_write_reg(0x0053,0x013F); 
    TFT_write_reg(0x0060,0xA700);
    TFT_write_reg(0x0061,0x0001);
    TFT_write_reg(0x006A,0x0000);
    //
    TFT_write_reg(0x0080,0x0000);
    TFT_write_reg(0x0081,0x0000);
    TFT_write_reg(0x0082,0x0000);
    TFT_write_reg(0x0083,0x0000);
    TFT_write_reg(0x0084,0x0000);
    TFT_write_reg(0x0085,0x0000);
    //
    TFT_write_reg(0x0090,0x0010);
    TFT_write_reg(0x0092,0x0600);
   
    TFT_write_reg(0x0007,0x0133);
    TFT_write_reg(0x00,0x0022);//   
//END
}

void TFT_display_on(void)
{
    TFT_write_reg(0x0007,0x0133);       
}

void TFT_display_off(void)
{
    TFT_write_reg(0x0007,0x0000);   
}

void TFT_set_pos(unsigned int x,unsigned int y)
{
    TFT_write_reg(0x20,x);
    TFT_write_reg(0x21,y);
}
//COLOR是RGB格式的颜色。5 6 5模式
void TFT_draw_point(unsigned int x,unsigned int y,unsigned int color)
{
    TFT_set_pos(x,y);
    TFT_write_reg(0x22,color);
}


测试程序如下
#include <stm32f10x_lib.h>
#include "own.h"
#include "tft.h"

void DS0_init(void)
{
    RCC->APB2ENR |= (1<<2);
    GPIOA->CRH &= ~0XF;
    GPIOA->CRH |= 0x3;
}
#define DS0_ON (GPIOA->BRR = (1<<8))
#define DS0_OFF (GPIOA->BSRR = (1<<8))

int main(void)
{
    unsigned int x,y;
    unsigned char temp=0;
    clock_init(9);
    DS0_init();
    TFT_init();
    while(1)
    {
        for(y=0;y<100;y++)
        {
            for(x=0;x<200;x++)
            {
                TFT_draw_point(x,y,BLUE);
            }
        }
        systick_delay_ms(72,1000);
        if(temp%2) DS0_ON;
        else DS0_OFF;
        temp++;
    }
}
但是屏幕只是白屏,没有颜色显示。我测试过了。对wr rs rd cs data的操作都没问题。能输出正常高低电平,剩下的是时序问题,还是初始化的问题。???纠结啊

一天了都

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 11:55:18 | 显示全部楼层
回复【楼主位】jiaduo:
---------------------------------
9325的屏
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-10-16 12:04:00 | 显示全部楼层
能读ID不?
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 13:09:16 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
unsigned int TFT_read_reg(unsigned int index)
{
unsigned int x;
TFT_WR_INDEX(index);
GPIOB->CRL = 0X88888888;
GPIOB->CRH = 0X88888888;
GPIOB->ODR = 0XFFFF;//上拉输入
TFT_WR_SET;
TFT_CS_CLR;
TFT_RS_SET;
TFT_RD_CLR;
x=DATAIN;
TFT_RD_SET;
TFT_CS_SET;
GPIOB->CRL=0X33333333; //PB0-7  上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF;    //全部输出高 
return x;
}

void TFT_WR_INDEX(unsigned int index)
{
TFT_CS_CLR;
TFT_RS_CLR;
DATAOUT(index);
TFT_WR_CLR;
TFT_WR_SET;
TFT_RS_SET;
TFT_CS_SET;
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 13:09:47 | 显示全部楼层
回复【4楼】jiaduo:
---------------------------------
读出来是0000
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 13:10:02 | 显示全部楼层
是不是时序有问题???????
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-10-16 13:12:21 | 显示全部楼层
读ID都不正确的话,其他没戏。
找原因吧。看看IO设置,连线等有无问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 13:14:35 | 显示全部楼层
连线没问题,用你的程序是可以的
回复 支持 反对

使用道具 举报

7

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2012-9-25
在线时间
3 小时
发表于 2012-10-16 14:57:36 | 显示全部楼层

连线没有问题,你看下驱动ICADS7843里面的寄存器命令,那里有详细说明,也有关于读ID的

回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 15:05:53 | 显示全部楼层
回复【9楼】lioo234:
---------------------------------
我debug了。和原子大哥的时序是一样的啊。但是原子大哥的就能读出id来。我的就不行。我怀疑是没有使得
内部振荡器工作。可以写入方式和原子大哥的是一样的啊。
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 15:25:41 | 显示全部楼层
回复【10楼】jiaduo:
---------------------------------
回复【10楼】jiaduo:
---------------------------------
我发现在初始化lcd接口的时候,加上您的
RCC->APB2ENR|=1<<0;    //开启辅助时钟
JTAG_Set(1);  //开启SWD
就可以了。不加就不行。之前没加怎么也得不到数据,后来加上就好了。请问能具体说明一下吗??麻烦您了
我的邮箱
1183557534@qq.com
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2012-10-16 15:25:58 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我发现在初始化lcd接口的时候,加上您的
RCC->APB2ENR|=1<<0;    //开启辅助时钟
JTAG_Set(1);  //开启SWD
就可以了。不加就不行。之前没加怎么也得不到数据,后来加上就好了。请问能具体说明一下吗??麻烦您了
我的邮箱
1183557534@qq.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-10-16 16:18:03 | 显示全部楼层
回复【12楼】jiaduo:
---------------------------------
你用到了与JTAG公用的IO来做液晶驱动,必须先禁止JTAG。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 11:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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