您的位置:首頁>正文

MSP430F149驅動攝像模組OV7670送2.8TFT顯示(程式碼分享)

實現功能:用MSP430F149驅動OV7670攝像模組獲取圖像並緩存在FIFO中, 再把圖像送到2.8寸 TFT顯示器顯示出來, 只能實現圖像的簡單顯示, 至於白平衡, 閃光燈之類的沒有。

補充說明:●本程式部分參考互聯網。

●OV7670獲取的圖像是橫著的, 也就是320x240, 所以TFT顯示器必須橫屏顯示。

●OV7670獲取的第一幀圖像絕對是亂碼的。

●OV7670用杜邦線連到MSP430F149很容易受到干擾, 有時候動一動杜邦線可以恢復正

常, 有時綠屏了就不能恢復正常。

下進去。

●互聯網上說SIO C和SIO C兩根線需要接上拉電阻, 但是實際不接也行。

程式

main.c

#include

#include"IO_config.h"

#include"I2C.c"

#include"OV7670.c"

#include"Ascii_8x16.h"

#include"TFT28.h"

#include"TFT28.c"

unsigned char Vsync_Flag=0;

/*********************************************************************************

qin:系統埠初始化

*********************************************************************************/

void Port_Init()

{

P4DIR=0xff;

P5DIR=0xff;

P1DIR=0x00; //P1-數據口

P3DIR=0xef; //這句和P3DIR|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;不一樣的, 注意了

P2IE|=BIT7; //P2.7接VSYNC

P2IES&=~BIT7; //下降沿觸發外部中斷, 接的是幀同步

}

void main(void)

{

WDT_Init();

Clock_Init();

Port_Init();

TFT_Initial();

InitI2C0();

delay_ms(500);

CLR_Screen(Blue);

LCD_PutString(88,112,"OV7670 Initialzing...",White,Blue);

while(!Cmos7670_init())

{

LCD_PutString(65,112,"Fail to initialze OV7670",White,Blue);

Cmos7670_init();

}

LCD_PutString(50,112,"OV7670 Initialization is OK",White,Blue);

delay_ms(1500);

_EINT();

while(1);

}

#pragma vector=PORT2_VECTOR

__interrupt void Port2_7()

{

unsigned int i,j,pix1,pix2;

Vsync_Flag++;

FIFO_OE_0;

if(Vsync_Flag==1)

{

FIFO_WRST_0; //reset the write address

delay_us(10);

FIFO_WRST_1;

FIFO_WR_1;

}

if(Vsync_Flag==2)

{

FIFO_WR_0;

FIFO_WRST_0;

FIFO_WRST_1;

_DINT();

FIFO_OE_1; //讀FIFO時OE=1, 寫時=0

FIFO_RRST_0; //reset the write address

FIFO_RCK_0; //at least one RCK clock is needed to make sure

FIFO_RCK_1;

FIFO_RCK_0;

FIFO_RCK_1;

FIFO_RRST_1;

FIFO_RCK_1; // Initialize Oscillator

for(j=0;j

for(i=0;i

{

FIFO_RCK_0;

pix1=Camera_Data; //pix1存放低位, 與別人的不同, 我的是先讀低位元再讀高位的

FIFO_RCK_1;

FIFO_RCK_0;

pix2=Camera_Data; //pix2存放高位

FIFO_RCK_1;

pix2

Put_pixel(i,j,pix1+pix2);

}

Vsync_Flag=0;

_EINT();

}

P2IFG&=~BIT7;

}

I2C.c

#define SDA_IN0() {P3DIR&=~BIT6;}

#define SDA_OUT0() {P3DIR|= BIT6;}

void InitI2C0(void)

{

P3DIR|=BIT5+BIT6; //SDA和SCL作為輸出口

}

void StartI2C0(void)

{

I2C_SDA0_1;

delay_us(100);

I2C_SCL0_1;

delay_us(100);

I2C_SDA0_0;

delay_us(100);

I2C_SCL0_0;

delay_us(100);

}

void StopI2C0(void)

{

I2C_SDA0_0;

delay_us(100);

I2C_SCL0_1;

delay_us(100);

I2C_SDA0_1;

delay_us(100);

}

void NoAck0(void)

{

I2C_SDA0_1;

delay_us(100);

I2C_SCL0_1;

delay_us(100);

I2C_SCL0_0;

delay_us(100);

I2C_SDA0_0;

delay_us(100);

}

unsigned char I2CWrite0(unsigned char DData)

{

unsigned char j,tem;

for(j=0;j

{

if((DData

{

I2C_SDA0_1;

}

else

{

I2C_SDA0_0;

}

delay_us(100);

I2C_SCL0_1;

delay_us(100);

I2C_SCL0_0;;

delay_us(100);

}

delay_us(100);

SDA_IN0();

delay_us(100);

I2C_SCL0_1;

delay_us(1000);

if(SDA_STATE0)

{

tem=0;

}

else

{

tem=1;

}

I2C_SCL0_0;

delay_us(100);

SDA_OUT0();

return(tem);

}

OV7670.c

unsigned char WrCmos7670(unsigned char regID, unsigned char regDat)

{

StartI2C0();

if(0==I2CWrite0(0x42))

{

StopI2C0();

return(0);

}

delay_us(100);

if(0==I2CWrite0(regID))

{

StopI2C0();

return(0);

}

delay_us(100);

if(0==I2CWrite0(regDat))

{

StopI2C0();

return(0);

}

StopI2C0();

return(1);

}

void set_Cmos7670reg(void)

{

WrCmos7670(0x3a, 0x04);

WrCmos7670(0x40, 0xd0);

WrCmos7670(0x12, 0x14);

WrCmos7670(0x32, 0x80);

WrCmos7670(0x17, 0x16);

WrCmos7670(0x18, 0x04);

WrCmos7670(0x19, 0x02);

WrCmos7670(0x1a, 0x7b);

WrCmos7670(0x03, 0x06);

WrCmos7670(0x0c, 0x00);

WrCmos7670(0x3e, 0x00);

WrCmos7670(0x70, 0x3a);

WrCmos7670(0x71, 0x35);

WrCmos7670(0x72, 0x11);

WrCmos7670(0x73, 0x00);

WrCmos7670(0xa2, 0x02);

WrCmos7670(0x11, 0x87);

WrCmos7670(0x7a, 0x20);

WrCmos7670(0x7b, 0x1c);

WrCmos7670(0x7c, 0x28);

WrCmos7670(0x7d, 0x3c);

WrCmos7670(0x7e, 0x55);

WrCmos7670(0x7f, 0x68);

WrCmos7670(0x80, 0x76);

WrCmos7670(0x81, 0x80);

WrCmos7670(0x82, 0x88);

WrCmos7670(0x83, 0x8f);

WrCmos7670(0x84, 0x96);

WrCmos7670(0x85, 0xa3);

WrCmos7670(0x86, 0xaf);

WrCmos7670(0x87, 0xc4);

WrCmos7670(0x88, 0xd7);

WrCmos7670(0x89, 0xe8);

WrCmos7670(0x13, 0xe0);

WrCmos7670(0x00, 0x00);

WrCmos7670(0x10, 0xFf);

WrCmos7670(0x0d, 0x00);

WrCmos7670(0x14, 0x29);

WrCmos7670(0xa5, 0x05);

WrCmos7670(0xab, 0x07);

WrCmos7670(0x24, 0x75);

WrCmos7670(0x25, 0x63);

WrCmos7670(0x26, 0xA5);

WrCmos7670(0x9f, 0x78);

WrCmos7670(0xa0, 0x68);

WrCmos7670(0xa1, 0x03);

WrCmos7670(0xa6, 0xdf);

WrCmos7670(0xa7, 0xdf);

WrCmos7670(0xa8, 0xf0);

WrCmos7670(0xa9, 0x90);

WrCmos7670(0xaa, 0x94);

//WrCmos7670(0x13, 0xe5);

WrCmos7670(0x0e, 0x61);

WrCmos7670(0x0f, 0x4b);

WrCmos7670(0x16, 0x02);

WrCmos7670(0x1e, 0x37);

WrCmos7670(0x21, 0x02);

WrCmos7670(0x22, 0x91);

WrCmos7670(0x29, 0x07);

WrCmos7670(0x33, 0x0b);

WrCmos7670(0x35, 0x0b);

WrCmos7670(0x37, 0x1d);

WrCmos7670(0x38, 0x71);

WrCmos7670(0x39, 0x2a);

WrCmos7670(0x3c, 0x78);

WrCmos7670(0x4d, 0x40);

WrCmos7670(0x4e, 0x20);

WrCmos7670(0x69, 0x00);

WrCmos7670(0x6b, 0x60);

WrCmos7670(0x74, 0x19);

WrCmos7670(0x8d, 0x4f);

WrCmos7670(0x8e, 0x00);

WrCmos7670(0x8f, 0x00);

WrCmos7670(0x90, 0x00);

WrCmos7670(0x91, 0x00);

WrCmos7670(0x92, 0x00);

WrCmos7670(0x96, 0x00);

WrCmos7670(0x9a, 0x80);

WrCmos7670(0xb0, 0x84);

WrCmos7670(0xb1, 0x0c);

WrCmos7670(0xb2, 0x0e);

WrCmos7670(0xb3, 0x82);

WrCmos7670(0xb8, 0x0a);

WrCmos7670(0x43, 0x14);

WrCmos7670(0x44, 0xf0);

WrCmos7670(0x45, 0x34);

WrCmos7670(0x46, 0x58);

WrCmos7670(0x47, 0x28);

WrCmos7670(0x48, 0x3a);

WrCmos7670(0x59, 0x88);

WrCmos7670(0x5a, 0x88);

WrCmos7670(0x5b, 0x44);

WrCmos7670(0x5c, 0x67);

WrCmos7670(0x5d, 0x49);

WrCmos7670(0x5e, 0x0e);

WrCmos7670(0x64, 0x04);

WrCmos7670(0x65, 0x20);

WrCmos7670(0x66, 0x05);

WrCmos7670(0x94, 0x04);

WrCmos7670(0x95, 0x08);

WrCmos7670(0x6c, 0x0a);

WrCmos7670(0x6d, 0x55);

WrCmos7670(0x6e, 0x11);

WrCmos7670(0x6f, 0x9f);

WrCmos7670(0x6a, 0x40);

WrCmos7670(0x01, 0x40);

WrCmos7670(0x02, 0x40);

WrCmos7670(0x13, 0xe6);

WrCmos7670(0x15, 0x00);

WrCmos7670(0x4f, 0x80);

WrCmos7670(0x50, 0x80);

WrCmos7670(0x51, 0x00);

WrCmos7670(0x52, 0x22);

WrCmos7670(0x53, 0x5e);

WrCmos7670(0x54, 0x80);

WrCmos7670(0x58, 0x9e);

WrCmos7670(0x41, 0x18);

WrCmos7670(0x3f, 0x00);

WrCmos7670(0x75, 0x0F);

WrCmos7670(0x76, 0xeF);

WrCmos7670(0x4c, 0x00);

WrCmos7670(0x77, 0x01);

WrCmos7670(0x3d, 0xc2);

WrCmos7670(0x4b, 0x09);

WrCmos7670(0xc9, 0x60);

WrCmos7670(0x41, 0x38);

WrCmos7670(0x56, 0x40);

WrCmos7670(0x34, 0x11);

WrCmos7670(0x3b, 0x02);

WrCmos7670(0xa4, 0x89);

WrCmos7670(0x96, 0x00);

WrCmos7670(0x97, 0x30);

WrCmos7670(0x98, 0x20);

WrCmos7670(0x99, 0x30);

WrCmos7670(0x9a, 0x84);

WrCmos7670(0x9b, 0x29);

WrCmos7670(0x9c, 0x03);

WrCmos7670(0x9d, 0x4c);

WrCmos7670(0x9e, 0x3f);

WrCmos7670(0x78, 0x04);

}

unsigned char Cmos7670_init(void)

{

unsigned char mmm;

InitI2C0();

mmm=0x80;

if(0==WrCmos7670(0x12, mmm))

{

return 0 ;

}

delay_ms(10);

set_Cmos7670reg();

return 1;

}

TFT28.c

/********************************************************************

檔功能:320x240TFT驅動程式, 控制TFT實現漢字,字元顯示,畫點功能。

********************************************************************/

//**************聲明外部函數和變數**************

unsigned int Device_code=0x9320;

/********************************************************************

//實現功能:延時

//輸入參數:count 設置延時時間

********************************************************************/

void delayms(uint count)

{

int i,j;

for(i=0;i

{

for(j=0;j

}

}

/********************************************************************

//實現功能:寫命令

//輸入參數: DH 需要輸入16bits命令的高8位元

// DL 需要輸入16bits命令的低8位

********************************************************************/

void Write_Cmd(uchar DH,uchar DL)

{

CS_CLR;

RS_CLR;

RD_SET;

RW_CLR;

//注意:當使用8位元資料口驅動16位元資料模式時, 使用74HC573作為IO擴展, 程式如下

DataPort=DH; //送高8位命令給573待鎖存

LE_SET; //鎖存位

LE_CLR; //斷開鎖存,位選573的Q7~Q0仍保持

DataPort=DL; //送低8位命令給TFT

/*

//如果使用16位元資料口驅動16位元資料模式,

則無需IO擴展, 直接將資料送到資料口即可

DataPort _L=DL;

DataPort_H=DH;

*/

RW_SET;

CS_SET;

}

/********************************************************************

//實現功能:寫資料(2*8bits)

//輸入參數: DH 需要輸入16bits資料的高8位元

// DL 需要輸入16bits資料的低8位元

********************************************************************/

void Write_Data(uchar DH,uchar DL)

{

CS_CLR;

RS_SET;

//注意:當使用8位元資料口驅動16位元資料模式時, 使用74HC573作為IO擴展, 程式如下

DataPort=DH; //送高8位元數據給573待鎖存

LE_SET; //鎖存位

LE_CLR; //斷開鎖存,位選573的Q7~Q0仍保持

DataPort=DL; //送低8位元資料給TFT

/*

//如果使用16位元資料口驅動16位元資料模式, 則無需IO擴展, 直接將資料送到資料口即可

DataPort_L=DL;

DataPort_H=DH;

*/

RW_CLR;

RW_SET;

CS_SET;

}

/********************************************************************

//實現功能:寫資料(16位元)

//輸入參數: y 需要輸入16bits資料

********************************************************************/

void Write_Data_U16(uint y)

{

uchar m,n;

m=y>>8;

n=y;

Write_Data(m,n);

}

/********************************************************************

//實現功能:向x寄存器寫入y資料

//輸入參數: x 需要輸入的命令 16位元

// y 需要輸入的資料 16位元

********************************************************************/

void Write_Cmd_Data (uchar x,uint y)

{

uchar m,n;

m=y>>8;

n=y;

Write_Cmd(0x00,x);

Write_Data(m,n);

}

/********************************************************************

//實現功能:TFT清屏

//輸入參數:bColor 清屏所使用的背景色

********************************************************************/

void CLR_Screen(uint bColor)

{

uint i,j;

LCD_SetPos(0,319,0,239);//320x240

for (i=0;i

{

for (j=0;j

Write_Data_U16(bColor);

}

}

/********************************************************************

//實現功能:顯示Ascii字元

// 輸入參數: x 橫坐標

// y 縱坐標

// c 需要顯示的字元

// fColor 字元顏色

// bColor 字元背景顏色

********************************************************************/

//#include "Ascii_8x16.h"

void LCD_PutChar(unsigned short x, unsigned short y, char c, uint fColor, uint bColor)

{

uint i,j;

LCD_SetPos(x,x+8-1,y,y+16-1); //設置字元顯示位置

for(i=0; i

uchar m=Font8x16[(c-0x20)*16+i]; //提取c字元的第i個位元組以,c減去0x20是由於Ascii碼庫中的0~1f被去掉

for(j=0;j

if((m&0x80)==0x80) { //判斷最高位是否為1

Write_Data_U16(fColor); //最高位元為1, 寫入字元顏色

}

else {

Write_Data_U16(bColor); //最高位為0, 寫入背景顏色

}

m

}

}

}

/********************************************************************

//實現功能:顯示中英文字串

// 輸入參數: x 橫坐標

// y 縱坐標

// *s 待顯示的字串,例如LCD_PutString(24,16,"123藍芯",White,Blue);即把"123藍芯"的第一個字元位址賦給指標變數s.

// bColor 字元背景顏色

********************************************************************/

void LCD_PutString(unsigned short x, unsigned short y, uchar *s, uint fColor, uint bColor)

{

uchar l=0; //顯示幕位置增量

while(*s)

{

LCD_PutChar(x+l*8,y,*s,fColor,bColor);//顯示該字元

s++;l++; //指針加1,位置加1

}

}

/********************************************************************

//實現功能:指定位置顯示RGB顏色

// 輸入參數: x0, y0 起始座標

// x1, y1 結束座標

// Color 背景顏色

********************************************************************/

void Show_RGB (uint x0,uint x1,uint y0,uint y1,uint Color)

{

uint i,j;

LCD_SetPos(x0,x1,y0,y1); //設置顯示位置

for (i=y0;i

{

for (j=x0;j

Write_Data_U16(Color);

}

}

/********************************************************************

//實現功能:TFT初始化

********************************************************************/

//================================================================================================

//實現功能:TFT初始化

//================================================================================================

void TFT_Initial(void)

{

RST_SET;

delay_ms(1); // Delay 1ms

RST_CLR;

delay_ms(10); // Delay 10ms

RST_SET;

delay_ms(50); // Delay 50 ms

if(Device_code==0x9320)

{

//************* Start Initial Sequence **********//

Write_Cmd_Data(0x00,0x0001); //Set the OSC bit as ‘1’ to start the internal oscillator

Write_Cmd_Data(0x01,0x0100); // qin:為了橫屏顯示, 將SS(db8)由1變成了0。 set SS and SM bit

Write_Cmd_Data(0x02,0x0700); // set 1 line inversion

Write_Cmd_Data(0x03,0x1038); //qin:原本是0x1030, set GRAM Write direction and BGR=1, 0x1098是橫著寫, 0x1030是豎著寫

Write_Cmd_Data(0x04,0x0000); // Resize register

Write_Cmd_Data(0x08,0x0202); // set the back porch and front porch

Write_Cmd_Data(0x09,0x0000); // set non-display area refresh cycle ISC[3:0]

Write_Cmd_Data(0x0A,0x0000); // FMARK function

Write_Cmd_Data(0x0C,0x0000); // RGB interface setting

Write_Cmd_Data(0x0D,0x0000); // Frame marker Position

Write_Cmd_Data(0x0F,0x0000); // RGB interface polarity

delay_ms(30);

//*************Power On sequence ****************//

Write_Cmd_Data(0x10, 0x16b0); // SAP, BT[3:0], AP, DSTB, SLP, STB

delay_ms(30);

Write_Cmd_Data(0x11, 0x0007); //Write final user’s setting values to VC bit

Write_Cmd_Data(0x12, 0x013a); // set Internal reference voltage

Write_Cmd_Data(0x13, 0x1a00); // VDV[4:0] for VCOM amplitude

delay_ms(30);

Write_Cmd_Data(0x29, 0x000c); // Set VCM[5:0] for VCOMH

delay_ms(30); // Delay 50ms

// ----------- Adjust the Gamma Curve ----------//

Write_Cmd_Data(0x0030, 0x0000);

Write_Cmd_Data(0x0031, 0x0505);

Write_Cmd_Data(0x0032, 0x0304);

Write_Cmd_Data(0x0035, 0x0006);

Write_Cmd_Data(0x0036, 0x0707);

Write_Cmd_Data(0x0037, 0x0105);

Write_Cmd_Data(0x0038, 0x0002);

Write_Cmd_Data(0x0039, 0x0707);

Write_Cmd_Data(0x003C, 0x0704);

Write_Cmd_Data(0x003D, 0x0807);

//------------------ Set GRAM area ---------------//

Write_Cmd_Data(0x0050, 0x0000); // Horizontal GRAM Start Address

Write_Cmd_Data(0x0051, 0x00EF); // Horizontal GRAM End Address

Write_Cmd_Data(0x0052, 0x0000); // Vertical GRAM Start Address

Write_Cmd_Data(0x0053, 0x013F); // Vertical GRAM Start Address

Write_Cmd_Data(0x0060, 0xa700); //qin:為了橫屏顯示, 將GS(db15)由0變成了0。 Gate Scan Line

Write_Cmd_Data(0x0061, 0x0001); // NDL,VLE, REV

Write_Cmd_Data(0x006A, 0x0000); // set scrolling line

Write_Cmd_Data(0x20, 0x0000); // GRAM horizontal Address

Write_Cmd_Data(0x21, 0x0000); // GRAM Vertical Address

//-------------- Partial Display Control ---------//

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);

//-------------- Panel Control ---------//

Write_Cmd_Data(0x90,0x0010); //Frame Cycle Contral

Write_Cmd_Data(0x92,0x0000); //Panel Interface Contral

Write_Cmd_Data(0x93,0x0003); //Panel Interface Contral 3.

Write_Cmd_Data(0x95,0x0110); //Frame Cycle Contral

Write_Cmd_Data(0x97,0x0000); //

Write_Cmd_Data(0x98,0x0000); //Frame Cycle Contral.

//-------------- Display on ---------//

Write_Cmd_Data(0x07,0x0173);

}

else if(Device_code==0x1505 )

{

//************* Start Initial Sequence **********//

Write_Cmd_Data(0x00,0x0001); //Set the OSC bit as ‘1’ to start the internal oscillator

Write_Cmd_Data(0x01,0x0100); // set SS and SM bit

Write_Cmd_Data(0x02,0x0700); // set 1 line inversion

Write_Cmd_Data(0x03,0x1030); //set GRAM Write direction and BGR=1

Write_Cmd_Data(0x04,0x0000); // Resize register

Write_Cmd_Data(0x08,0x0202); // set the back porch and front porch

Write_Cmd_Data(0x09,0x0000); // set non-display area refresh cycle ISC[3:0]

Write_Cmd_Data(0x0A,0x0000); // FMARK function

Write_Cmd_Data(0x0C,0x0000); // RGB interface setting

Write_Cmd_Data(0x0D,0x0000); // Frame marker Position

Write_Cmd_Data(0x0F,0x0000); // RGB interface polarity

delay_ms(30);

//*************Power On sequence ****************//

Write_Cmd_Data(0x10, 0x16b0); // SAP, BT[3:0], AP, DSTB, SLP, STB

delay_ms(30);

Write_Cmd_Data(0x11, 0x0007); //Write final user’s setting values to VC bit

Write_Cmd_Data(0x12, 0x013a); // set Internal reference voltage

Write_Cmd_Data(0x13, 0x1a00); // VDV[4:0] for VCOM amplitude

delay_ms(30);

Write_Cmd_Data(0x29, 0x000c); // Set VCM[5:0] for VCOMH

delay_ms(30); // Delay 50ms

// ----------- Adjust the Gamma Curve ----------//

Write_Cmd_Data(0x0030, 0x0000);

Write_Cmd_Data(0x0031, 0x0505);

Write_Cmd_Data(0x0032, 0x0304);

Write_Cmd_Data(0x0035, 0x0006);

Write_Cmd_Data(0x0036, 0x0707);

Write_Cmd_Data(0x0037, 0x0105);

Write_Cmd_Data(0x0038, 0x0002);

Write_Cmd_Data(0x0039, 0x0707);

Write_Cmd_Data(0x003C, 0x0704);

Write_Cmd_Data(0x003D, 0x0807);

//------------------ Set GRAM area ---------------//

Write_Cmd_Data(0x0050, 0x0000); // Horizontal GRAM Start Address

Write_Cmd_Data(0x0051, 0x00EF); // Horizontal GRAM End Address

Write_Cmd_Data(0x0052, 0x0000); // Vertical GRAM Start Address

Write_Cmd_Data(0x0053, 0x013F); // Vertical GRAM Start Address

Write_Cmd_Data(0x0060, 0x2700); // Gate Scan Line

Write_Cmd_Data(0x0061, 0x0001); // NDL,VLE, REV

Write_Cmd_Data(0x006A, 0x2700); // set scrolling line

Write_Cmd_Data(0x20, 0x0000); // GRAM horizontal Address

Write_Cmd_Data(0x21, 0x0000); // GRAM Vertical Address

//-------------- Partial Display Control ---------//

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);

//-------------- Panel Control ---------//

Write_Cmd_Data(0x90,0x0010); //Frame Cycle Contral

Write_Cmd_Data(0x92,0x0000); //Panel Interface Contral

Write_Cmd_Data(0x93,0x0003); //Panel Interface Contral 3.

Write_Cmd_Data(0x95,0x0110); //Frame Cycle Contral

Write_Cmd_Data(0x97,0x0000); //

Write_Cmd_Data(0x98,0x0000); //Frame Cycle Contral.

//-------------- Display on ---------//

Write_Cmd_Data(0x07,0x0173);

}

else if(Device_code==0x9328)

{

//************* Start Initial Sequence **********//

Write_Cmd_Data(0x0001,0x0100); //set SS and SM bit //設置掃描方向

Write_Cmd_Data(0x0002,0x0700); //EOR=1 and B/C=1 to set the line inversion //設置行反轉

Write_Cmd_Data(0x0003,0x1030); //set Entry Mode //設置進入模式

Write_Cmd_Data(0x0004,0x0000); //

Write_Cmd_Data(0x00A4,0x0001);

Write_Cmd_Data(0x0008,0x0202); // set the back porch and front porch

Write_Cmd_Data(0x0009,0x0000); // set non-display area refresh cycle ISC[3:0]

Write_Cmd_Data(0x000A,0x0000); // FMARK function

Write_Cmd_Data(0x000C,0x0000); // RGB interface setting

Write_Cmd_Data(0x000D, 0x0000); // Frame marker Position

Write_Cmd_Data(0x000F, 0x0000); // RGB interface polarity

//*************Power On sequence ****************//

Write_Cmd_Data(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB

Write_Cmd_Data(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]

Write_Cmd_Data(0x0012, 0x0000); // VREG1OUT voltage

Write_Cmd_Data(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude

delay_ms(30);

Write_Cmd_Data(0x0010, 0x1690); // SAP, BT[3:0], AP, DSTB, SLP, STB

Write_Cmd_Data(0x0011, 0x0227); // R11h=0x0221 at VCI=3.3V, DC1[2:0], DC0[2:0], VC[2:0]

delay_ms(30);

Write_Cmd_Data(0x0012, 0x001C); // External reference voltage= Vci;

delay_ms(30);

Write_Cmd_Data(0x0013, 0x1800); // R13=1200 when R12=009D;VDV[4:0] for VCOM amplitude

Write_Cmd_Data(0x0029, 0x001C); // R29=000C when R12=009D;VCM[5:0] for VCOMH

Write_Cmd_Data(0x002B, 0x000D); // Frame Rate = 91Hz

delay_ms(30);

Write_Cmd_Data(0x0020, 0x0000); // GRAM horizontal Address

Write_Cmd_Data(0x0021, 0x0000); // GRAM Vertical Address

// ----------- Adjust the Gamma Curve ----------//

Write_Cmd_Data(0x0030, 0x0007);

Write_Cmd_Data(0x0031, 0x0302);

Write_Cmd_Data(0x0032, 0x0105);

Write_Cmd_Data(0x0035, 0x0206);

Write_Cmd_Data(0x0036, 0x0808);

Write_Cmd_Data(0x0037, 0x0206);

Write_Cmd_Data(0x0038, 0x0504);

Write_Cmd_Data(0x0039, 0x0007);

Write_Cmd_Data(0x003C, 0x0105);

Write_Cmd_Data(0x003D, 0x0808);

//------------------ Set GRAM area ---------------//

Write_Cmd_Data(0x0050, 0x0000); // Horizontal GRAM Start Address

Write_Cmd_Data(0x0051, 0x00EF); // Horizontal GRAM End Address

Write_Cmd_Data(0x0052, 0x0000); // Vertical GRAM Start Address

delay_ms(30);

Write_Cmd_Data(0x0053, 0x013F); // Vertical GRAM Start Address

delay_ms(30);

Write_Cmd_Data(0x0060, 0xA700); // Gate Scan Line

Write_Cmd_Data(0x0061, 0x0001); // NDL,VLE, REV

Write_Cmd_Data(0x006A, 0x0000); // set scrolling line

//-------------- Partial Display Control ---------//

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);

//-------------- Panel Control -------------------//

Write_Cmd_Data(0x0090, 0x0010);

Write_Cmd_Data(0x0092, 0x0000);

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); // 262K color and display ON

}

}

//================================================================================================

//實現功能:設置座標

// 輸入參數: x0, y0 起始座標

// x1, y1 結束座標

//================================================================================================

void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)

{

Write_Cmd_Data(0x50,y0); // Horizontal GRAM Start Address

Write_Cmd_Data(0x51,y1); // Horizontal GRAM End Address

Write_Cmd_Data(0x52,x0); // Vertical GRAM Start Address

Write_Cmd_Data(0x53,x1); // Vertical GRAM Start Address

Write_Cmd_Data(0x20,y0); // GRAM horizontal Address

Write_Cmd_Data(0x21,x0); // GRAM Vertical Address

Write_Cmd (0x00,0x22); // 0x0022,Start to Write Data to GRAM

}

/********************************************************************

//實現功能:畫點

// 輸入參數: x, y 需要畫點座標

// color 點的顏色

********************************************************************/

void Put_pixel(uint x,uint y,uint color)

{

LCD_SetPos(x,x,y,y); //設置待畫點座標

Write_Data_U16(color); //在指定點寫入顏色資料

}

本文素材來自電子發燒友論壇

正版現貨 TFT LCD原理與設計 TFT LCD工廠生產實踐教程 TFTLCD基本概念 ¥48.8 購買

德飛萊OV2640攝像頭模組 200W圖元STM32F4開發板驅動 源碼 支援JPEG輸出 ¥108 購買

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示