補充說明:●本程式部分參考互聯網。
●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位元資料模式,
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 購買