磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1859|回复: 9

LCD截图存入SD卡

[复制链接]
发表于 2013-9-22 21:27:18 | 显示全部楼层 |阅读模式
本帖最后由 黄二 于 2013-9-22 21:32 编辑

本人在做CNC控制器说明书时用到LCD屏上的图片,一开始用照像机直接照,效果太差了
后来就考虑下能否用截图的方式存入SD,实验的结果非常的好
现在把代码分享给网友
如图:
电机参数.jpg
打开文件子栏.jpg
打开文件了菜单.jpg
打开文件.jpg


C文件:
#include "BMP.H"

u8*  work_buf;//存储设备
u16 gui_buf[1];

u16 LCD_ReadRAM(void)
{
  /* Write 16-bit Index (then Read Reg) */
  LCD->LCD_REG = 0x22; /* Select GRAM Reg */
  /* Read 16-bit Reg */
  LCD->LCD_RAM;
  return LCD->LCD_RAM;
}
void LCD_Cursor(unsigned short int x,unsigned short int y)
{
   LCD_RegInit(0x20, x);
   LCD_RegInit(0x21, y);
}
/****************************************************************************
       截图功能
****************************************************************************/
extern u32 lcdid;
u8 Prt_Screen(char *Str)
{
u8 res;
u16 i,j,color;
UINT WRBytes;            
FIL fileW;
   
//LCD_Window(0,0,239,319);
res=f_open(&fileW,(char*)Str,FA_WRITE|FA_CREATE_ALWAYS);//创建并打开
if(res)return 1;
WriteHeader(&fileW);
WriteBMPInfo(&fileW);
for(i=0;i<320;i++)
{
  for(j=0;j<240;j++)
  {
   LCD_Cursor(j,i-1);
   color=BGR565toRGB555(LCD_ReadRAM());
   gui_buf[0] = color;
//   printf("color:%d\n",color);
   res=f_write(&fileW,gui_buf,2,&WRBytes);
  if(res)return 2;
  }
  
}
f_close(&fileW);
return 0;
}
//写BMP头
void WriteHeader(FIL* file)
{
UINT WRBytes;
u8 BMP_header[14];
BITMAPFILEHEADER* bmph;
bmph=(BITMAPFILEHEADER*)BMP_header;
bmph->bfType=0x424D;     //指定文件类型,必须是0x424D,即字符串“BM”
bmph->bfSize=320*240*2+54;//0x25836;//文件大小,待定
bmph->bfReserved1=0;//为保留字,不用考虑
bmph->bfReserved2=0;//为保留字,不用考虑
bmph->bfOffBytes=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  //文件头到图像数据的字节偏移量; 54
f_write(file,BMP_header,sizeof(BITMAPFILEHEADER),&WRBytes);
}
//写BMP头信息
void WriteBMPInfo(FIL* file)
{
  UINT WRBytes;
u8 BMP_info[40];
BITMAPINFOHEADER* bmpi;
bmpi=(BITMAPINFOHEADER*)BMP_info;
bmpi->biSize=sizeof(BITMAPINFOHEADER);  //指定这个结构的长度,为40
bmpi->biWidth=240;   //指定图象的宽度,单位是象素。
bmpi->biHeight=320;   //指定图象的高度,单位是象素。
bmpi->biPlanes=1;   //必须是1,不用考虑。
bmpi->biBitCount=16;  //指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色),16(16bit高彩色), 24(24bit真彩色),32(32bit增强型真彩色)
bmpi->biCompression=0;  //指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况
bmpi->biSizeImage=320*240*2; //指定实际的位图数据占用的字节数 ,长宽是4的倍数
bmpi->biXPelsPerMeter=0;
bmpi->biYPelsPerMeter=0;
bmpi->biClrUsed=0;
bmpi->biClrImportant=0;
f_write(file,BMP_info,sizeof(BITMAPINFOHEADER),&WRBytes);
}
H文件:
#ifndef _BMP_H
#define _BMP_H
#define RGB565toRGB555(RGB)  ((RGB&0xF800)>>1)+((RGB&0x7C0)>>1)+(RGB&0x1f)
#define BGR565toRGB555(BGR)  ((BGR&0x1f)<<10)+((BGR&0x7C0)>>1)+((BGR&0xF800)>>11)
#define BGR565toRGB565(BGR)  ((BGR&0x1f)<<11)+(BGR&0x7e0)+((BGR&0xF800)>>11)
#define RGB888toRGB565(R,G,B)   (R>>3)+((G&0xfc)<<3)+((B&0xf8)<<8)

#pragma    pack(1)  //指定一个字节对齐
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;     //文件标识,为字母ASCII码“BM” 16位
DWORD bfSize;   //文件大小。
    WORD bfReserved1;  //为保留字,不用考虑
WORD bfReserved2;  //为保留字,不用考虑
DWORD bfOffBytes; //为从文件头到实际的位图数据的偏移字节数,即图中前三个部分的长度之和。
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;    //指定这个结构的长度,为40。
LONG biWidth;    //指定图象的宽度,单位是象素
LONG biHeight;    //指定图象的高度,单位是象素
WORD biPlanes;    //必须是1,不用考虑。
WORD biBitCount;  //指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色),16(16bit高彩色), 24(24bit真彩色),32(32bit增强型真彩色)
DWORD biCompression;  //指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况
DWORD biSizeImage;    //指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:biSizeImage=biWidth’ × biHeight
LONG biXPelsPerMeter; // 指定目标设备的水平分辨率,单位是每米的象素个数
LONG biYPelsPerMeter; // 指定目标设备的垂直分辨率
DWORD biClrUsed;    // 指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2。
DWORD biClrImportant; // 指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的
} BITMAPINFOHEADER;
typedef struct tagRGBQUAD {
    BYTE rgbBlue;  //该颜色的蓝色分量
    BYTE rgbGreen;  //该颜色的绿色分量
    BYTE rgbRed;  //该颜色的红色分量
    BYTE rgbReserved;  //保留值
} RGBQUAD;
#pragma    pack()  //恢复默认对齐方式


extern void WriteHeader(FIL* file);
extern void WriteBMPInfo(FIL* file);
extern u8 Prt_Screen(char *Str);
#endif



评分

参与人数 1金钱 +30 收起 理由
明浩 + 30 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-9-23 00:14:22 | 显示全部楼层
谢谢楼主 收藏学习
回复 支持 反对

使用道具 举报

发表于 2013-9-23 10:13:39 | 显示全部楼层
{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2013-9-25 19:24:10 来自手机频道 | 显示全部楼层
怎么用手机看还快来自: Android客户端
回复 支持 反对

使用道具 举报

发表于 2013-12-13 12:58:05 | 显示全部楼层
{:soso_e113:} 我的控制器快到了   

版主 要怎把代码保存什么格式;怎么用?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-14 12:44:55 | 显示全部楼层
斌5520 发表于 2013-12-13 12:58
我的控制器快到了   

版主 要怎把代码保存什么格式;怎么用?

BMP格式。
直接用函数上的STR指针指向它就可以了。
回复 支持 反对

使用道具 举报

发表于 2013-12-14 17:44:02 | 显示全部楼层
黄二 发表于 2013-12-14 12:44
BMP格式。
直接用函数上的STR指针指向它就可以了。

我是想说把这代码存为**.C 放到内存卡根目录吗?这样吗?然后怎么用它?
03.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-15 13:34:06 | 显示全部楼层
斌5520 发表于 2013-12-14 17:44
我是想说把这代码存为**.C 放到内存卡根目录吗?这样吗?然后怎么用它?

     这个不是给控制器直接调用的,而是在设计阶段用的。只用来载入图片供给说明书使。
要是能这样子用,那就很方便,但也很可怕了,等于这个控制器可以直接读入C语并解译运行。
高手就可以直接指挥它读入自身的代码了,也可以更改自身的运行代码了。想想都感觉到高级。

回复 支持 反对

使用道具 举报

发表于 2013-12-15 14:52:18 | 显示全部楼层
哦,我的控制器到手了,试用了两天,还行,但是有些设置还不知道怎么设,想用这代码截图,截图上传请您指导下怎么设置控制器 所以请您详细介绍这代码怎么用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-16 18:30:58 | 显示全部楼层
斌5520 发表于 2013-12-15 14:52
哦,我的控制器到手了,试用了两天,还行,但是有些设置还不知道怎么设,想用这代码截图,截图上传请您指导 ...

成品控制器不需这个载图了,所取这个载图功能已经去除了。

如不清楚如何设置,可以直接在此留言。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-6-25 14:23

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.