stm32/App/image2lcd/image2lcd.c

153 lines
3.5 KiB
C

#include "sys.h"
#include "lcd.h"
#include "image2lcd.h"
extern void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height);
extern void LCD_WR_REG(u8 data);
//********************************************************************//
//! 函数名:image_getcolor
//! 功能:从8位数据获取16位颜色
//! 输入:mode: 0:低位在前,高位在后; 1:高位在前,低位在后; str:数据指针;
//! 输出:16位颜色
//********************************************************************//
u16 image_getcolor(u8 mode,u8 *str)
{
u16 color;
if(mode)
{
color=((u16)*str++)<<8;
color|=*str;
}else
{
color=*str++;
color|=((u16)*str)<<8;
}
return color;
}
//********************************************************************//
//! 函数名:image_show
//! 功能:在液晶上画图
//! 输入:xsta,ysta,xend,yend:画图区域; scan:扫描方向; p:图像数组指针
//! 输出:none
//********************************************************************//
void image_show(u16 xsta,u16 ysta,u16 xend,u16 yend,u8 scan,u8 *p)
{
u32 i;
u32 len=0;
//! 水平扫描
if((scan&0x03)==0)
{
//! 判断扫描方向
switch(scan>>6)
{
case 0:
//! 从左到右,从上到下
LCD_Scan_Dir(L2R_U2D);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xsta,ysta);
break;
case 1:
//! 从左到右,从下到上
LCD_Scan_Dir(L2R_D2U);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xsta,yend);
break;
case 2:
//! 从右到左,从上到下
LCD_Scan_Dir(R2L_U2D);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xend,ysta);
break;
case 3:
//! 从右到左,从下到上
LCD_Scan_Dir(R2L_D2U);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xend,yend);
break;
}
}
//! 垂直扫描
else
{
//! 判断扫描方向
switch(scan>>6)
{
case 0:
//! 从上到下,从左到右
LCD_Scan_Dir(U2D_L2R);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xsta,ysta);
break;
case 1:
//! 从下到上,从左到右
LCD_Scan_Dir(D2U_L2R);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xsta,yend);
break;
case 2:
//! 从上到下,从右到左
LCD_Scan_Dir(U2D_R2L);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xend,ysta);
break;
case 3:
//! 从下到上,从右到左
LCD_Scan_Dir(D2U_R2L);
LCD_Set_Window(xsta,ysta,xend,yend);
//! 设置光标位置
LCD_SetCursor(xend,yend);
break;
}
}
//! 开始写入GRAM
LCD_WriteRAM_Prepare();
//! 写入数据长度
len=(xend-xsta+1)*(yend-ysta+1);
for(i=0;i<len;i++)
{
LCD_WR_DATA(image_getcolor(scan&(1<<4),p));
p+=2;
}
//! 使用横屏
#if USE_HORIZONTAL
LCD_Set_Window(0,0,319,239);
#else
LCD_Set_Window(0,0,239,319);
#endif
}
//********************************************************************//
//! 函数名:image_display
//! 功能:在指定位置显示图片
//! 输入:x,y:指定位置; imgx:图片数据指针;
//! 输出:none
//********************************************************************//
void image_display(u16 x,u16 y,u8 * imgx)
{
HEADCOLOR *imginfo;
//! 得出HEADCOLOR结构体大小
u8 ifosize=sizeof(HEADCOLOR);
imginfo=(HEADCOLOR*)imgx;
image_show(x,y,x+imginfo->w-1,y+imginfo->h-1,imginfo->scan,imgx+ifosize);
}