#include "stm32f4xx.h"
#include "ili9806.h"
#include "bsp.h"
#include "font.h"
//LCD的画笔颜色和背景色
u16 POINT_COLOR=0x0000; //画笔颜色
u16 BACK_COLOR=0xFFFF; //背景色
_lcd_dev lcd_dev;
void LCD_delay(u32 nCount)
{
u32 i;
for(i=0;i<72000;i++)
for(; nCount != 0; nCount--);
}
/*
****************************************************************
*功能: 写寄存器函数
*参数: regval 寄存器的值
****************************************************************
*/
void LCD_WR_REG(u16 regval)
{
*(__IO u16 *) (Bank1_LCD_C) = regval;
}
/*
****************************************************************
*功能: 写数据
*参数: data 写入的值
****************************************************************
*/
void LCD_WR_DATA(u16 data)
{
*(__IO u16 *) (Bank1_LCD_D) = data;
}
/*
****************************************************************
*功能: 读数据
*返回值: 读到的值
****************************************************************
*/
u16 LCD_RD_DATA(void)
{
u16 data;
data =*(__IO u16 *)Bank1_LCD_D;
return data;
}
/*
****************************************************************
*功能: 写寄存器
*参数: 寄存器地址和数据
****************************************************************
*/
void LCD_WriteReg(u16 regval, u16 data)
{
LCD_WR_REG(regval);
LCD_WR_DATA(data);
}
/*
****************************************************************
*功能: 设置LCD的背光亮度
*参数: 背光等级,0~100.越大越亮.
****************************************************************
*/
void LCD_SetBackLight(u32 pwm)
{
TIM_SetCompare1(TIM1, pwm);
}
/*
****************************************************************
*功能: 设定光标位置
*参数: 横纵坐标值
****************************************************************
*/
void LCD_SetCursor(u16 x, u16 y)
{
LCD_WR_REG(0X2A); /* column address control set */
LCD_WR_DATA(x>>8); /* 先高8位,然后低8位 */
LCD_WR_DATA(x&0xff); /* 设置起始点和结束点*/
LCD_WR_REG(0X2B); /* page address control set */
LCD_WR_DATA(y>>8);
LCD_WR_DATA(y&0xff);
}
/*
****************************************************************
*功能: 读取某个点的颜色
*参数: 横纵坐标值
****************************************************************
*/
u16 LCD_ReadPoint(u16 x, u16 y)
{
u16 r=0,g=0,b=0,color =0;
if(x>=lcd_dev.width||y>=lcd_dev.height)
return 0; //超过了范围,直接返回
LCD_SetCursor(x,y);
LCD_WR_REG(0x2E); //发送读GRAM指令
r=LCD_RD_DATA(); //dummy Read
LCD_delay(2);
r=LCD_RD_DATA(); //实际坐标颜色
LCD_delay(2);
b=LCD_RD_DATA();
g=r&0XFF;
g<<=8;
color = (((r>>11)<<11)|((g>>10)<<5)|(b>>11));
return color;
}
/*
****************************************************************
*功能: 画点
*参数: 横纵坐标值
****************************************************************
*/
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_SetCursor(x,y); //设置光标位置
LCD_WR_REG(0x2C); //开始写入GRAM
LCD_WR_DATA(POINT_COLOR);
}
/*
****************************************************************
*功能: 快速画点
*参数: 横纵坐标值
****************************************************************
*/
void LCD_Fast_DrawPoint(u16 x, u16 y, u16 color)
{
LCD_WR_REG(0X2A); /* column address control set */
LCD_WR_DATA(x>>8); /* 先高8位,然后低8位 */
LCD_WR_DATA(x&0xff); /* 设置起始点和结束点*/
LCD_WR_REG(0X2B); /* page address control set */
LCD_WR_DATA(y>>8);
LCD_WR_DATA(y&0xff);
LCD_WR_REG(0x2C); //开始写入GRAM
LCD_WR_DATA(color);
}
/*
****************************************************************
*功能: 设置LCD扫描方向
*参数:
****************************************************************
*/
void LCD_Scan_Dir(u8 dir)
{
u16 regval=0;
u16 dirreg=0;
u16 temp;
if(lcd_dev.dir == 1)//横屏显示
{
switch(dir)//方向转换
{
case 0:dir=6;break;
case 1:dir=7;break;
case 2:dir=4;break;
case 3:dir=5;break;
case 4:dir=1;break;
case 5:dir=0;break;
case 6:dir=3;break;
case 7:dir=2;break;
}
}
switch(dir)
{
case L2R_U2D://从左到右,从上到下
regval|=(0<<7)|(0<<6)|(0<<5);
break;
case L2R_D2U://从左到右,从下到上
regval|=(1<<7)|(0<<6)|(0<<5);
break;
case R2L_U2D://从右到左,从上到下
regval|=(0<<7)|(1<<6)|(0<<5);
break;
case R2L_D2U://从右到左,从下到上
regval|=(1<<7)|(1<<6)|(0<<5);
break;
case U2D_L2R://从上到下,从左到右
regval|=(0<<7)|(0<<6)|(1<<5);
break;
case U2D_R2L://从上到下,从右到左
regval|=(0<<7)|(1<<6)|(1<<5);
break;
case D2U_L2R://从下到上,从左到右
regval|=(1<<7)|(0<<6)|(1<<5);
break;
case D2U_R2L://从下到上,从右到左
regval|=(1<<7)|(1<<6)|(1<<5);
break;
}
dirreg=0X36;
LCD_WriteReg(dirreg,regval);
if((regval&0X20)||lcd_dev.dir==1)
{
if(lcd_dev.width<lcd_dev.height)//交换X,Y
{
temp=lcd_dev.width;
lcd_dev.width=lcd_dev.height;
lcd_dev.height=temp;
}
}
else
{
if(lcd_dev.width>lcd_dev.height)//交换X,Y
{
temp=lcd_dev.width;
lcd_dev.width=lcd_dev.height;
lcd_dev.height=temp;
}
}
LCD_WR_REG(0x2A);
LCD_WR_DATA(0);
LCD_WR_DATA(0);
LCD_WR_DATA((lcd_dev.width-1)>>8);
LCD_WR_DATA((lcd_dev.width-1)&0XFF);
LCD_WR_REG(0x2B);
LCD_WR_DATA(0);
LCD_WR_DATA(0);
LCD_WR_DATA((lcd_dev.height-1)>>8);
LCD_WR_DATA((lcd_dev.height-1)&0XFF);
}
/*
****************************************************************
*功能: 设置LCD显示方向
*参数: 0 竖屏 1横屏
****************************************************************
*/
void LCD_Display_Dir(u8 dir)
{
if(dir == 0 ) //竖屏
{
lcd_dev.dir = 0;
lcd_dev.width = 480;
lcd_dev.height = 854;
}
else
{
lcd_dev.dir = 1;
lcd_dev.width = 854;
lcd_dev.height = 480;
}
LCD_Scan_Dir(L2R_U2D); //默认扫描方向
}
/*
****************************************************************
*功能: LCD引脚配置
****************************************************************
*/
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the FSMC Clock */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
/* config lcd gpio clock base on FSMC */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA |RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE , ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
/* config tft Reset gpio */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* config tft BL gpio 背光开关控制引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* config tft data lines base on FSMC
* data lines,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10
*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* config tft control lines base on FSMC*/
/* PD4-FSMC_NOE :LCD-RD */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* PD5-FSMC_NWE :LCD-WR */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
评论5