文档库 最新最全的文档下载
当前位置:文档库 › 基于stm32液晶屏HX8352C

基于stm32液晶屏HX8352C


/*******************/
/*******************/
/*********tft.h**********/
#ifndef _TFT_H_
#define _TFT_H_

#include "stm32f10x_lib.h"

/*位绑定*/
#define PBOUT(x) *(u32 *)(0x42000000+(GPIOC_BASE +0x0c-0x40000000)*32+4*x)
//#define PBOUT(X) *(u32 *)(0x42000000+(GPIO_BASE +0x0c-0x40000000)*32+4*X)
#define WRDATAOUT(n) GPIOA->ODR=n
#define WRDATAIN GPIOA->IDR
/*控制端口定义*/
#define LCD_RS PBOUT(0) //RS
#define LCD_RD PBOUT(1) //RD
#define LCD_WR PBOUT(2) //WR
#define LCD_CS PBOUT(3) //CS
#define LCD_RST PBOUT(4) //RST

/* LCD 几种纯色 */
#define White 0xFFFF
#define Black 0x0000
#define Blue 0x001F
#define Blue2 0x051F
#define Red 0xF800
#define Magenta 0xF81F
#define Green 0x07E0
#define Cyan 0x7FFF
#define Yellow 0xFFE0


typedef struct //窗口显示结构体
{
u8 x1;
u8 x2;
u8 y1;
u8 y2;
}window;

/*函数定义*/
void LCD_WR_DATA8(u8 data); //写8位数据到TFT GRAM
void WINDOWS_Init(u16 yStar, u16 yEnd ,u16 xStart,u16 xEnd ); //设置窗口尺寸
void WINDOWS_Area_Init(u16 xStart,u16 xEnd);
void delay_ms(unsigned short time); //延时函数
void LCD_WR_REG(u16 cmd); //给寄存器写命令
void LCD_WR_DATA(u16 data); //给寄存器写数据
void LCD_WR_CMD_DATA(u16 cmd,u16 data ); //综合上述函数写寄存器地址,然后向该地址发送数据
void LCD_Init(void); //液晶屏初始化函数
void delayms(unsigned int count); //延时函数
void ClearScreen(u16 bColor); //清屏函数
//void Show_picture(const u16 *a); //图片显示函数

#endif
/****************************/
/****************************/
/****************************/
/**********tft.c**********/

#include"tft.h"
#include "stm32f10x_lib.h"

/*延时函数*/
void delayms(unsigned int count)
{
int i,j;
for(i=0;i{
for(j=0;j<260;j++);
}
}





//====================== 写命令 ==========================//

void LCD_WR_REG(u16 cmd)
{



LCD_CS=0;
LCD_RS=0;
LCD_RD=1;
WRDATAOUT(cmd);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}

//===================== 写数据 ===========================//

void LCD_WR_DATA(u16 data)
{

LCD_CS=0;
LCD_RS=1;
LCD_RD=1;
WRDATAOUT(data);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}

/*写8位的数据*/
void LCD_WR_DATA8(u8 data)
{
LCD_CS=0;
LCD_RS=1;
LCD_RD=1;
WRDATAOUT(data);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}

/*写寄存地地址并向其中写入数据*/


void LCD_WriteReg(u16 Index,u16 Data)
{
LCD_WR_REG(Index);
LCD_WR_DATA(Data);
}

/*液晶屏初始化函数*/
void LCD_Init(void)
{

LCD_RST=1;
delayms(5);
LCD_RST=0;
delayms(5);
LCD_RST=1;
delayms(5);
LCD_CS=0; //打开片选使能

delayms(50); //根据不同晶振速度可以调整延时,保障稳定显示

LCD_WR_REG(0x001A); LCD_WR_DATA(0x0002); //BT //0x001A电源控制寄存器 ,低三位有效
LCD_WR_REG(0x001B); LCD_WR_DATA(0x0088); //VRH //0x001b电源控制寄存器 ,低五位有效
//****VCOM offset**///
LCD_WR_REG(0x0023); LCD_WR_DATA(0x0000); //SEL_VCM //电源
LCD_WR_REG(0x0024); LCD_WR_DATA(0x005F); //VCM //电源
LCD_WR_REG(0x0025); LCD_WR_DATA(0x0015); //VDV //电源
LCD_WR_REG(0x002D); LCD_WR_DATA(0x0003); //NOW[2:0]=011
/*****************电源设置*/
LCD_WR_REG(0x0018); LCD_WR_DATA(0x0004); //Frame rate 72Hz
LCD_WR_REG(0x0019); LCD_WR_DATA(0x0001); //OSC_EN='1', start Osc
LCD_WR_REG(0x0001); LCD_WR_DATA(0x0000); //DP_STB='0', out deep sleep
LCD_WR_REG(0x001F); LCD_WR_DATA(0x0088); //STB=0
delayms(5);
LCD_WR_REG(0x001F); LCD_WR_DATA(0x0080); //DK=0
delayms(5);
delayms(0x001F); LCD_WR_DATA(0x0090); //PON=1
delayms(5);
LCD_WR_REG(0x001F); LCD_WR_DATA(0x00D0); //VCOMG=1
delayms(5);
/*********18位颜色与16位颜色选择*/
LCD_WR_REG(0x0017); LCD_WR_DATA(0x0005); //default 0x06 262k color // 0x05 65k color
//SET PANEL
LCD_WR_REG(0x0036); LCD_WR_DATA(0x0013); //REV_P, SM_P, GS_P, BGR_P, SS_P
/*LCD_WR_REG(0x0029); LCD_WR_DATA(0x0031); //400 lines
LCD_WR_REG(0x0071); LCD_WR_DATA(0x001A); //RTN*/
//Gamma 2.2 Setting
LCD_WR_REG(0x0040); LCD_WR_DATA(0x0000);
LCD_WR_REG(0x0041); LCD_WR_DATA(0x0045);
LCD_WR_REG(0x0042); LCD_WR_DATA(0x0045);
LCD_WR_REG(0x0043); LCD_WR_DATA(0x0004);
LCD_WR_REG(0x0044); LCD_WR_DATA(0x0000);
LCD_WR_REG(0x0045); LCD_WR_DATA(0x0008);
LCD_WR_REG(0x0046); LCD_WR_DATA(0x0023);
LCD_WR_REG(0x0047); LCD_WR_DATA(0x0023);
LCD_WR_REG(0x0048); LCD_WR_DATA(0x0077);
LCD_WR_REG(0x0049); LCD_WR_DATA(0x0040);

LCD_WR_REG(0x004A); LCD_WR_DATA(0x0004);
LCD_WR_REG(0x004B); LCD_WR_DATA(0x0000);
LCD_WR_REG(0x004C); LCD_WR_DATA(0x0088);
LCD_WR_REG(0x004D); LCD_WR_DATA(0x0088);
LCD_WR_REG(0x004E); LCD_WR_DATA(0x0088);
/************设置GRAM显示区域即屏幕显示大小*/
LCD_WR_REG(0x0002); LCD_WR_DATA(0x0000);
LCD_WR_REG(0x0003); LCD_WR_DATA(0x0000); //Column Start
LCD_WR_REG(0x0004); LCD_WR_DATA(0x0000);
LCD_WR_REG(0x0005); LCD_WR_DATA(0x00EF); //Column End
LCD_WR_REG(0x0006); LCD_WR_DATA(0x0000);
LCD_WR_REG(0x0007); LCD_WR_DATA(0x0000); //Row Start
LCD_WR_REG(0x0008); LCD_WR_DATA(0x0001);//0001
LCD_WR_REG(0x0009); LCD_WR_DATA(0x008F); //Row End00AF
/************显示设置*/
LCD_WR_REG(0x0028); LCD_WR_DATA(0x0038); //GON=1, DTE=1, D=10
delayms(40);
LCD_WR_REG(0x0028); LCD_W

R_DATA(0x003F); //GON=1, DTE=1, D=11
LCD_WR_REG(0x0022); //Start GRAM write

/***************睡眠模式设置*/
LCD_WR_REG(0x0028); LCD_WR_DATA(0x0038); //GON=??DTE=??D[1:0]=?0?
delayms(40);
LCD_WR_REG(0x001F); LCD_WR_DATA(0x0089); // GAS=1, VOMG=0, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=1
delayms(40);
LCD_WR_REG(0x0028); LCD_WR_DATA(0x0020); //GON=??DTE=??D[1:0]=?0?
delayms(40);
LCD_WR_REG(0x0019); LCD_WR_DATA(0x0000); //OSC_EN=??
delayms(5);
// Exit Sleep mode Setting
LCD_WR_REG(0x0019); LCD_WR_DATA(0x0001); //OSC_EN='1', start Osc
LCD_WR_REG(0x001F); LCD_WR_DATA(0x0088); //STB=0
delayms(5);
LCD_WR_REG(0x001F); LCD_WR_DATA(0x0080); //DK=0
delayms(5);
LCD_WR_REG(0x001F); LCD_WR_DATA(0x0090); //PON=1
delayms(5);
LCD_WR_REG(0x001F); LCD_WR_DATA(0x00D0); //VCOMG=1
delayms(5);
LCD_WR_REG(0x0028); LCD_WR_DATA(0x0038); //GON=1, DTE=1, D=10
delayms(40);
LCD_WR_REG(0x0028); LCD_WR_DATA(0x003F); //GON=1, DTE=1, D=11

//LCD_WriteReg(0x16,(1<<5)|(0<<6));//MY=0,MX=1,MV=1,BGR=0
}


void ClearScreen(u16 bColor)
{
unsigned int i,j;
//Set GRAM Area
WINDOWS_Init(0,0x00f0 ,0, 0x0190);
for (i=0;i<401;i++)
{
for (j=0;j<241;j++)
{
LCD_WR_DATA(bColor);
}
}
}


void Show_picture(const u16 *a)
{
u16 i,j;
WINDOWS_Init(0,0x00f0 ,0,0x0190 );

for(j=0;j<240;j++)
{
for(i=0;i<400;i++)
{
LCD_WR_DATA(*a);
a++;
}
}
}



void WINDOWS_Init(u16 yStar, u16 yEnd ,u16 xStart,u16 xEnd )
{

LCD_WR_REG(0x0002); LCD_WR_DATA8(yStar>>8);
LCD_WR_REG(0x0003); LCD_WR_DATA8(yStar); //纵坐标起点
LCD_WR_REG(0x0004); LCD_WR_DATA8(yEnd>>8);
LCD_WR_REG(0x0005); LCD_WR_DATA8(yEnd); //纵坐标终点
LCD_WR_REG(0x0006); LCD_WR_DATA8(xStart>>8);
LCD_WR_REG(0x0007); LCD_WR_DATA8(xStart); //横坐标起点
LCD_WR_REG(0x0008); LCD_WR_DATA8(xEnd>>8);
LCD_WR_REG(0x0009); LCD_WR_DATA8(xEnd); //横坐标终点
LCD_WR_REG(0x0022);

}



/*********************************/
/*********************************/
/*********************************/
/**************main.c*************/

#include "stm32f10x_lib.h"
#include"stdio.h"
#include"tft.h"
//#include"pictrue.h"
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
/* RCC system reset(for debug purpose) */
RCC_DeInit(); //将外设RCC 寄存器重设为缺省值
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);//使能外部时钟
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部时钟就绪
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer 启用预取缓冲器 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* Flash 2 wait state FLASH设置2个等待周期*/
FLASH_SetLatency(FLASH_Latency_2);

/* HCLK(AHB时钟) = SYSCLK

设置AHB时钟*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB(Advanced High performance Bus)系统总线
//APB(Advanced Peripheral Bus)外围总线

/* PCLK2 = HCLK PCLK2时钟=主时钟*/
RCC_PCLK2Config(RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 PCLK1时钟为主时钟1/2*/
RCC_PCLK1Config(RCC_HCLK_Div2);

/* PLLCLK = 8MHz * 9 = 72 MHz 设置时钟为72M,设置PLL时钟源及倍频系数(<=72M)*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* Enable PLL 使能PLL*/
RCC_PLLCmd(ENABLE);

/* Wait till PLL is ready 等待PLL工作稳定*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

/* Select PLL as system clock source 选择PLL做为系统时钟源*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source 准备就绪,开始干活*/
while(RCC_GetSYSCLKSource() != 0x08);
}
}



int main()
{
RCC_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);
//GPIOC->CRL=0x303333;
GPIOC->CRL=0x33333333;
GPIOA->CRL=0x33333333;
GPIOA->CRH=0x33333333;
LCD_Init();
Show_picture(gImage_qwq);
// for(a=0;a<86409;a++)
// {
// ClearScreen(gImage_jij[a]);
// }

return 1 ;
}






相关文档
相关文档 最新文档