#include "main.h"
#include "cmsis_armcc.h"
#include "SysTick.h"
#include "HX8352C.h"
#include "font.h"
_tftlcd_data tftlcd_data;
void Init_Lcd_GPIO(void)
{
RCC_EnableAPB2PeriphClk( RCC_APB2_PERIPH_GPIOB|RCC_APB2_PERIPH_GPIOA, ENABLE);
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
GPIO_InitStructure.Pin = GPIO_PIN_ALL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
}
__inline void LCD_WriteCmd(uint16_t data)
{
LCD_RS_CLR;//写地址
LCD_RD_SET;
GPIOB->POD=data;
LCD_WR_CLR;
LCD_WR_SET;
}
__inline void LCD_WriteData(uint16_t data)
{
LCD_RS_SET;
LCD_RD_SET;
GPIOB->POD=data;
LCD_WR_CLR;
LCD_WR_SET;
}
void Delayus(uint32_t count)
{
for (; count > 0; count--)
;
}
void delayms(uint32_t count)
{
int i,j;
for(i=0; i<count; i++)
{
for(j=0; j<260; j++);
}
}
void LCD_WriteCmdData(uint16_t cmd,uint16_t data)
{ LCD_CS_CLR;
LCD_WriteCmd(cmd);
LCD_WriteData(data);
LCD_WR_SET;
}
//读寄存器
u16 LCD_ReadReg(u8 LCD_Reg)
{
u16 t;
LCD_WriteCmd(LCD_Reg); //写入要读的寄存器号
GPIOB->PL_CFG=0X88888888; //PB0-7 上拉输入
GPIOB->PH_CFG =0X88888888; //PB8-15 上拉输入
GPIOB->POD=0XFFFF; //全部输出高
LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD_CLR;
Delayus(5);//延时5us
LCD_RD_SET;
t=GPIOB->PID;
LCD_CS_SET;
GPIOB->PL_CFG=0X33333333; //PB0-7 上拉输入
GPIOB->PH_CFG =0X33333333; //PB8-15 上拉输入
GPIOB->POD=0XFFFF; //全部输出高
return t;
}
//读取个某点的颜色值
//x,y:坐标
//返回值:此点的颜色
uint16_t LCD_ReadPoint(uint16_t x,uint16_t y)
{
uint16_t r=0,g=0,b=0;
if(x>=tftlcd_data.width||y>=tftlcd_data.height)return 0; //超过了范围,直接返回
LCD_Set_Window(x, y, x, y);
LCD_WriteCmd(0X2e);
GPIOB->PL_CFG=0X88888888; //
GPIOB->PH_CFG =0X88888888; //
GPIOB->POD=0XFFFF; //
LCD_RS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
LCD_RD_SET;
r=GPIOB->PID;
LCD_CS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
LCD_RD_SET;
r=GPIOB->PID;
LCD_CS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
LCD_RD_SET;
b=GPIOB->PID;
LCD_CS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
LCD_RD_SET;
g=GPIOB->PID;
LCD_CS_SET;
GPIOB->PL_CFG=0X33333333; //
GPIOB->PH_CFG =0X33333333; //
GPIOB->POD=0XFFFF; //
return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));;
}
void LCD_WriteData_Color(uint16_t color)
{
LCD_RS_SET;
LCD_CS_CLR;
LCD_RD_SET;
GPIOB->POD= color;
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
void LCD_Display_Dir(uint8_t dir)
{
if(dir==0) //默认竖屏方向
{
LCD_WriteCmd(0x36); //设置彩屏显示方向的寄存器
LCD_WriteData(0x48);
tftlcd_data.height=480;
tftlcd_data.width=320;
}
else
{
LCD_WriteCmd(0x36); //设置彩屏显示方向的寄存器
LCD_WriteData(0x38);
tftlcd_data.height=320;
tftlcd_data.width=480;
}
}
//设置窗口,并自动设置画点坐标到窗口左上角(sx,sy).
//sx,sy:窗口起始坐标(左上角)
//width,height:窗口宽度和高度,必须大于0!!
//窗体大小:width*height.
__inline void LCD_Set_Window(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height)
{
LCD_CS_CLR;
LCD_WriteCmd(0x2a);
LCD_WriteData(sx/256);
LCD_WriteData(sx%256);
LCD_WriteData(width/256);
LCD_WriteData(width%256);
LCD_WriteCmd(0x2b);
LCD_WriteData(sy/256);
LCD_WriteData(sy%256);
LCD_WriteData(height/256);
LCD_WriteData(height%256);
LCD_WriteCmd(0x2C);
LCD_CS_SET;
}
//清屏函数
//color:要清屏的填充色
void LCD_Clear(uint16_t color)
{
uint16_t i, j ;
LCD_Set_Window(0, 0, tftlcd_data.width-1, tftlcd_data.height-1); //作用区域
for(i=0; i<tftlcd_data.width; i++)
{
for (j=0; j<tftlcd_data.height; j++)
{
LCD_WriteData_Color(color);
}
}
}
//在指定区域内填充单个颜色
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
//color:要填充的颜色
void LCD_Fill(uint16_t xState,uint16_t yState,uint16_t xEnd,uint16_t yEnd,uint16_t color)
{
uint16_t temp;
if((xState > xEnd) || (yState > yEnd))
{
return;
}
LCD_Set_Window(xState, yState, xEnd, yEnd);
xState = xEnd - xState + 1;
yState = yEnd - yState + 1;
while(xState--)
{
temp = yState;
while (temp--)
{
LCD_WriteData_Color(color);
}
}
}
//快速画点
//x,y:坐标
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
LCD_Set_Window(x, y, x, y); //设置点的位置
LCD_WriteData_Color(0xF800);
}
//快速画点
//x,y:坐标
//color:颜色
void LCD_DrawFRONT_COLOR(uint16_t x,uint16_t y,uint16_t color)
{
LCD_Set_Window(x, y, x, y);
LCD_WriteData_Color(color);
}
//画线
//x1,y1:起点坐标
//x2,y2:终点坐标
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
uint16_t t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {
incx=-1;
delta_x=-delta_x;
}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else {
incy=-1;
delta_y=-delta_y;
}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0; t<=distance+1; t++ ) //画线输出
{
LCD_DrawPoint(uRow,uCol);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
void LCD_DrawLine_Color(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t color)
{
uint16_t t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {
incx=-1;
delta_x=-delta_x;
}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else {
incy=-1;
delta_y=-delta_y;
}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0; t<=distance+1; t++ ) //画线输出
{
LCD_DrawFRONT_COLOR(uRow,uCol,color);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
// 画一个十字的标记
// x:标记的X坐标
// y:标记的Y坐标
// color:标记的颜色
void LCD_DrowSign(uint16_t x, uint16_t y, uint16_t color)
{
uint8_t i;
/* 画点 */
LCD_Set_Window(x-1, y-1, x+1, y+1);
for(i=0; i<9; i++)
{
LCD_WriteData_Color(color);
}
/* 画竖 */
LCD_Set_Window(x-4, y, x+4, y);
for(i=0; i<9; i++)
{
LCD_WriteData_Color(color);
}
/* 画横 */
LCD_Set_Window(x, y-4, x, y+4);
for(i=0; i<9; i++)
{
LCD_WriteData_Color(color);
}
}
//画矩形
//(x1,y1),(x2,y2):矩形的对角坐标
void LCD_DrawRecta
评论5