中级会员
 
- 积分
- 477
- 金钱
- 477
- 注册时间
- 2012-9-17
- 在线时间
- 0 小时
|
我自己写了一个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的操作都没问题。能输出正常高低电平,剩下的是时序问题,还是初始化的问题。???纠结啊
一天了都
|
|