1、未 来 之 芯 , 卓 我 M 3 1 / 2 8 S D 卡 字 库 和 bm p 图片 显示 实 验 作者 f i re E - M a i l f i re s t m 3 2 f o x m a i l . c o m Q Q 3 1 3 3 0 3 0 3 4 博客 f i re s t m 3 2 . b l o g . c h i n a u n i x . n e t 硬件平台 野火 S T M 3 2 开发板 库 版本 S T 3 . 0 . 0 实验描述 : 使用 软件制 作 自定义类 型的字 库 , 然 之 后将字库 放入 S D 卡中 , 并且在 S D卡中放入 一张
2、b m p 图片 作为 L C D 背景 。 并且 调 用截屏函 数截取 L C D 背景并保存为 b m p 图片 。 硬件连接 : MicroSD 卡 P C 8 - S D I O - D 0 - - - - D A T A 0 P C 9 - S D I O - D 1 - - - - D A T A 1 P C 1 0 - S D I O - D 2 - - - - D A T A 2 P C 1 1 - S D I O - D 3 - - - - C D / D A T A 3 P C 1 2 - S D I O - C L K - - - - C L K P D 2 - S D
3、I O - C MD - - - - C MD TFT 数据 线 P D 1 4 - FS MC - D 0 - - - - L C D - D B 0 P D 1 5 - FS MC - D 1 - - - - L C D - D B 1 P D 0 - FS MC - D 2 - - - - L C D - D B 2 P D 1 - FS MC - D 3 - - - - L C D - D B 3 P E 7 - FS MC - D 4 - - - - L C D - D B 4 P E 8 - FS MC - D 5 - - - - L C D - D B 5 P E 9 - FS
4、MC - D 6 - - - - L C D - D B 6 P E 1 0 - FS MC - D 7 - - - - L C D - D B 7 P E 1 1 - FS MC - D 8 - - - - L C D - D B 8 P E 1 2 - FS MC - D 9 - - - - L C D - D B 9 P E 1 3 - FS MC - D 1 0 - - - - L C D - D B 1 0 P E 1 4 - FS MC - D 1 1 - - - - L C D - D B 1 1 P E 1 5 - FS MC - D 1 2 - - - - L C D - D
5、 B 1 2 P D 8 - FS MC - D 1 3 - - - - L C D - D B 1 3 P D 9 - FS MC - D 1 4 - - - - L C D - D B 1 4 P D 1 0 - FS MC - D 1 5 - - - - L C D - D B 1 5 TFT 控制 信号线 P D 4 - FS MC - N O E - - - - L C D - R D 未 来 之 芯 , 卓 我 M 3 2 / 2 8 P D 5 - FS MC - N E W - - - - L C D - WR P D 7 - FS MC - N E 1 - - - - L C
6、 D - C S P D 1 1 - FS MC - A 1 6 - - - - L C D - D C P E 1 - FS MC - N B L 1 - - - - L C D - R E S E T P D 1 3 - FS MC - A 1 8 - - - - L C D - B L A C K - L I G H T 库文件 : s t a r t u p / s t a r t _ st m 3 2 f 1 0 x _ h d . c C MS I S / c ore _ c m 3 . c C MS I S / sy st e m _ st m 3 2 f 1 0 x . c F
7、Wlib/s t m 3 2 f 1 0 x _ r c c . c FWlib/m is c . c F w li b / st m 3 2 f 1 0 x _ s y st ic k . c FWlib/s t m 3 2 f 1 0 x _ e x t i . c FWli b / st m 3 2 f 1 0 x _ g p io . c FWlib/s t m 3 2 f 1 0 x _ sd io . c FWlib/s t m 3 2 f 1 0 x _ d m a . c FWlib/s t m 3 2 f 1 0 x _ u sa r t . c FWlib/ st m 3
8、2 f 1 0 x _ f sm c . c 用 户文件 : U S E R / m a in . c U S E R / st m 3 2 f 1 0 x _ it . c U S E R / sy st ic k . c U S E R / u sa r t 1 . c U S E R / lc d . c U S E R / f f . c U S E R / sd c a r d . c U S E R / d is k i o. c U S E R / sd _ f s_ a p p . c U S E R / S d _ b m p . c 野火 S T M 3 2 开发板 L C
9、 D 和 S D 卡 硬件连接 图 : S D 卡 接口连接如下 未 来 之 芯 , 卓 我 M 3 3 / 2 8 L C D 接口 连接如下 字 库 制 作 详 细 流程 我们采用 “ 字模 I I I - 增强 版 v 3 . 9 1 ” 软件来制作中 文字库 。 1 打开字模软件 未 来 之 芯 , 卓 我 M 3 4 / 2 8 2 点击 “ 自动批量生 成字库 ” 按钮选项 。 软件界面 左下角 将出现 一 下几个按 钮选项 : 3 点击选择 “ 二级汉字库 ” 按钮 。 在 “ 输入 批量字 符 ” 框 里 面将会列 出二级 汉字的 所 有汉字 , 其中共 收录了 6 7 6 8
10、 个汉字字符 , 非特 殊情况 下 都能够满 足大家 的要求 啦 , 如图 : 4 点击 “ 字库智能生成 ” 按钮 , 弹出 “ 字库批量参数确认 ” 对话框 。 我们在 “ 源字体 ” 选项 里 面做如下 设置 , 需要 注 意 的是大小 问题 , 因为我 们 本次的设计目 标是实 现 1 6 * 1 6 的汉字 , 所 以在此 选择 小四 字体 。 设置好之 后如下 : 未 来 之 芯 , 卓 我 M 3 5 / 2 8 5 点击 “ 开始转换进 程 ” 按钮 . 就 会在安装 目录下或者你设置好的目录下生成 . c 后缀的字库文件 。 6 对于 L C D 显示来说 , 只要能够在 指
11、定 的位置描写制定颜色的点 , 那么就能够很好地根据汉字字模 信息来描写汉字 。 在此 , 为了能够更好的清楚字模的取向和高低位的排列顺序 , 我们可以现 先 在 p c 测试我们刚才 制作好的库文件 。 在这里我 们取 “ 当 ” 字 符 的数据来 测试 。 VC 6 . 0 测试源码 如下 : 1. #include 2. 3. unsigned char cc = 4. /*“ 当 “ 字符 */ 5. 0x00 , 0x80 , 0x10 , 0x90 , 0x08 , 0x 98 , 0x0C , 0x90 , 0x08 , 0xA0 , 0x00 , 0x80 , 0x3F , 0
12、xFC ,0x00 , 0x04 , 6. 0x00 , 0x04 , 0x1F , 0xFC , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 , 0x04 , 0x3F , 0xFC , 0x00 , 0x04 ,0x00 , 0x00 7. ; 8. 9. void main() 10. 11. int i,j; 12. unsigned char kk; 13. for ( i= 0 ; i 15 - j) 32. 33. else 34. 35. if ( mode = 0 ) 36. LCD_Draw_ColorPoint(Ypos+i,Xpos+j, 0xff
13、ff ); / 背景色显示白色 37. else if ( mode = 1 ) 38. 39. / 不写入 40. 41. 42. 43. 4 4 . 在 P u t C h in e se 2 1 这个函 数中 , 首 先从 sd 卡 中读 出我们需 要显示 在 lc d 上 的指定汉字的字模 数据 , 之后 2 2 4 3 行的代码就 根据字模 数据来描 写 , 描 写这一 部 分在这里 就不再说啦 , 和前 面 VC 测 试部 分思 路是一 样的 。 读 者现在可 能在想 , 字 库 里面保存 着大量的汉 字字幕 信息 , 我 现在输入 G e t G B K C o d e _ f
14、r om _ sd ( b u f f e r , st r ) 就能 够 拷贝出这个字符 的 字模数 据 , 是 怎 样定位字 模 信息 所在 的 位 置的呢 , 换句话 说 , 假 如 我现在要显示 “ 吾 ” 字 , 是怎样 根 据这个字 来确定 “ 吾 ” 字 符在字库 中 的保 存位置 的 呢 ? 其实这里面有 一定的 映射关 系 , 那就是 接下来 要说的 汉 字 “ 区码 ” 和 “ 位码 ” 。 在 汉字 区 位码表 中 , 我 们 是如何定 位我们 指定汉 字 的编号的 呢 ? 接 下来看 看 v c 6 . 0测试源码 : 1. #include 2. void main
15、() 3. 4. unsigned char * s , * e = “A“ , * c = “ 古 “ ; 5. unsigned char high_byte,lower_byte; / 内码高字节 , 内码低字节 6. printf ( “ 字母 %s 的 ASCII 码 =“ ,e ) ; 7. s = e ; 8. 9. while ( * s != 0 ) / / C 的字符串以 0 为结束符 * 10. 11. printf ( “%3d,“ , *s ) ; 未 来 之 芯 , 卓 我 M 3 1 2 / 2 8 12. s + ; 13. 14. printf ( “ n 汉
16、字内码 (10 进制 )%s=“ ,c ) ; 15. 16. s = c ; 17. while ( *s != 0 ) 18. 19. printf ( “%3d,“ , * s ); 20. s + ; 21. 22. 23. printf ( “ n 汉字内码 (16 进制 )%s=“ ,c ) ; 24. 25. s = c ; 26. while ( *s != 0 ) 27. 28. printf ( “%0X,“ , * s ); 29. s + ; 30. 31. 32. 33. s = c ; 34. high_byte = *s; 35. 36. s + ; 37. lo
17、wer_byte = *s; 38. 39. printf( “ n n 汉字 %s 对应的 n 内码高字节 :%d n 内码低字节 :%d n“ ,c,high_byte,lower_b yte); 40. printf( “ n n 汉字 %s 对应的 n 区码为 :%d - 160 = %d n 位码为 :%d -160 = %d n“ ,c,high_byte,high_byte - 160 ,lower_byte,lower_byte - 160 ); 41. 42. printf( “ n n 汉字 %s 在区位码表中的位置为 %d%d n“ ,c,high_byte -160 ,
18、lower_byte - 160 ); 43. printf( “ 汉字区位码表可参考网站 :http:/ n“ ); 44. printf( “ 通过在线查阅 , 编号为 %d%d 对应的汉字刚好就是 %s n n“ ,high_byte -160 ,lower_byte - 160 ,c); 未 来 之 芯 , 卓 我 M 3 1 3 / 2 8 45. 46. 测试结果 如下 : 打开 汉字 区位码 表 在线 查 询网站 : h t t p : / / c s . s c u . e d u . c n / w a n g b o / o t h e r s / q u w e i m
19、a . h t m 查询 “ 古 ” 汉字 的区位 码 刚好如计 算所得 , 为 。 上面的测 试结果 说明了 每 一个汉字 的内码 具体作 用 。 下面就 来看看 P u t C h in e se 2 1函数中调 用到的 函数 G e t G B K C od e _ f r om _ sd 的源 码 : 1. /* 2. * 函数名 : GetGBKCode_from_sd 3. * 描述 : 从 sd 卡上的字 库文件中拷贝指定汉字的字模数据 4. * 输 入 : pBuffer - 数据保存地址 5. * c - 汉字字符低字节码 6. * 输出 : 0 ( 成功 ) 7. * -
20、1 ( 失败 ) 8. */ 9. 10. int GetGBKCode_from_sd(unsigned char * pBuffer,unsigned char * c) 11. 12. unsigned char High8bit,Low8bit; 13. unsigned int pos; 未 来 之 芯 , 卓 我 M 3 1 4 / 2 8 14. High8bit=*c; 15. Low8bit=*(c+ 1 ); 16. 17. pos = (High8bit - 0xb0 )* 94 +Low8bit - 0xa1 )* 2 * 16 ; 18. f_mount( 0 , 1
21、9. myres = f_open( 20. 21. if ( myres = FR_OK ) 22. 23. f_lseek ( / 制定 读取 位置 24. myres = f_read( /16*16 大小的汉字其字模占用 16*2 个字节 25. f_close( 26. 27. return 0 ; 28. 29. 30. else 31. return - 1 ; 32. 33. p os = ( ( H igh 8 b it - 0 x b 0 ) * 9 4 +L ow 8 b it - 0 x a 1 ) * 2 * 1 6 这条语句 就是 根 据约定 的 映射关系由汉 字内
22、码 求得该 汉 字字模在 字库中 的存放 起 始位置 。 之后就 到指定 的 位置去拷贝字模数 据就可 以了 。 以上就是 S D 卡字 库制作 和现实的 具体流 程 。 实 现 S D 卡 B M P 图 像 的 读 取 与 保存 B MP 文件格 式 , 又 称为 B it m a p ( 位 图 ) 或 是 D I B ( D e v ic e - I n d e p e n d e n t D e v i c e ,设备无关 位图 ) , 是 Win d ow s 系统中广 泛使用 的图 像文件格 式 。 B MP 文件 保 存了一幅图象中所 有的像 素 。 这 种 文件格式 可以保
23、存单色 位 图 、 1 6 色或 2 5 6 色索引 模式像素图 、 2 4 位真彩 色图象 , 每种模式 种单一 像素的 大 小分别为 1 / 8 字 节 , 1 / 2 字节 , 1 字节和 3 字节 。 目 前最常 见的 是 2 5 6 色 B MP 和 2 4 位 色 B MP 。 这种 文件格式 还 定义了像 素保存的几 种方法 , 包括 不 压缩 、 R L E 压缩 等 。 常 见 的 B MP 文件 大多是 不压 缩的 。 Win d ow s 所使用 的 B MP 文件 , 在 开始处 有一个 文 件头 , 大 小为 5 4 字节 。 保存了包括文件 格式标 识 、 颜 色
24、数 、 图象 大小 、 压缩方 式 等信息 , 因为我 们仅讨 论 2 4 位色不压缩的 B M P , 所以文件 头 中的信息 基本不 需要注 意 , 只有 “ 大小 ” 这 一项对 我 们比较有用 。 图象 的宽度 和高度 都 是一个 3 2 位整 数 , 在 文 件中的地 址分别 为 0 x 0 0 1 2 和0 x 0 0 1 6 。 5 4 个字节 以后 , 如果是 1 6 色 或 2 5 6 色 B MP , 则 还有一 个颜色 表 , 但 2 4 位未 来 之 芯 , 卓 我 M 3 1 5 / 2 8 色 B MP 没有 这个 , 我们 这里不考 虑 。 接 下来就 是 实际的
25、像 素数据 了 。 因 此 总的来说B MP 图片的 优点是 简单 。 图片分析 : 下面来用 Wi n Hex 软件来分析一 下 b m p 图像的 文件内容 : 测试图片 1 2 3 . b m p , 用 AC DS e e 软件打 开 , 其 图像 内容 为 可知 , 这 幅图像 的大小 是 1 5 * 8 , 是 2 4 位真彩色 b m p 图像 。 图片数据 为 : 1 文 件头 部信息 部分 ( 前面 5 4 字节 ) : 未 来 之 芯 , 卓 我 M 3 1 6 / 2 8 如 上 图 , 阴影部 分就是 文 件头部信 息 。 2 图像像素数据部分 ( 如果是 2 4 位
26、真彩色 , 则 5 4 字节之后就是像素部 分 ) : 3 对文件 头部信息部分的解析 : 这里可以 分为两 块 : B M P 文件头和位图 信息头 从 0 开始 : 0 和 1 字节 是文 件的类 型 , 如果 是位图 文件类 型 , 必须分 别为 0 x 4 2 和 0 x 4 D 。 接下来的 部分可 以用一 个 结构体来 描述 。 3 到 1 4 字节的意义如下 : 1. typedef struc t tagBITMAPFILEHEADER 2. 3. / attention : sizeof(DWORD)=4 sizeof(WORD)=2 4. DWORD bfSize; / 文
27、件大 小 5. WORD bfReserved1; / 保留字 , 不考虑 未 来 之 芯 , 卓 我 M 3 1 7 / 2 8 6. WORD bfReserved2; / 保留字 , 同上 7. DWORD bfOffBits; / / 实际位图数据的偏移字节数 , 即前三个部分长度之和 8. BITMAPFILEHEADER,tagBITMAPFILEHEADER ; 头部信息 剩下的 部分就 是 位图信息 头 信息 : 1 4 到 5 3 字节内容的意 义如下 : 1. typedef struct tagBITMAPINFOHEADER 2. 3. / attention : si
28、zeof(DWORD)=4 sizeof(WORD)=2 4. DWORD biSize; / 指定此结构体的长度 , 为 40 5. LONG biWidth; / 位图宽 6. LONG biHeight; / 位图高 7. WORD biPlanes; / 平面数 , 为 1 8. WORD biBitCount; / 采用颜色位数 , 可以是 1 , 2 , 4 , 8 , 16 , 24 新的可以是 32 9. DWORD biCompression; / 压缩方式 , 可以是 0 , 1 , 2 , 其中 0 表示不压缩 10. DWORD biSizeImage; / 实际位图数
29、据占用的字节数 11. LONG biXPelsPerMeter; /X 方向分辨率 12. LONG biYPelsPerMeter; /Y 方向分辨率 13. DWORD biClrUsed; / 使用的颜色数 , 如果为 0 , 则表示默认值 (2 颜色位数 ) 14. DWORD biClrImportant; / 重要颜色数 , 如果为 0 , 则表示所有颜色都是重要的 15. 16. BITMAPINFOHEADER,tagBITMAPINFOHEADER ; 由上述分 析与 Wi n Hex 软件的分 析内容 结合得 到 该图片的 信息如 下 : 文件大小 : 4 3 8 保留字
30、 : 0 保留字 : 0 实际位图 数据的 偏移字 节 数 : 5 4 位图信息 头 : 结构体的 长度 : 4 0 位图宽 : 1 5 位图高 : 8 b i P l a n e s 平面数 : 1 b i B i t C o u n t 采用颜色位数 : 2 4 压缩方式 : 0 b i S i z e I m a g e 实际位图 数据占用 的字节 数 : 0 X 方向分辨 率 : 3 7 8 0 未 来 之 芯 , 卓 我 M 3 1 8 / 2 8 Y 方向分 辨率 : 3 7 8 0 使用的颜 色数 : 0 重要颜色 数 : 0 4 文 件像素部分的分析 有些读者 可能已 经发现
31、, 在像素部 分夹杂 着一些 值 为 0 的数据信息 , 如下 图 灰色部分所示 : 整张图片 都是灰 色的 , 为 什么会有 0 像素 的出现 呢 ? 由于 对齐 的数据 , 操 作系 统或者硬 件更容 易把它 调 入 ca ch e , 使 得 ca ch e 的 命中率提高 , 从而 提高访 问效率 。 也就是基 于性能 上得考 虑 , 所以 Wi n d o w s 规定一 个扫描行所占的字 节数必 须是 4 的 倍数 ( 即 以 l o n g 为单位 ) , 不足的以 0 填充 。 上面 分 析可知 ,位图宽 : 1 5 , 因此 , 未 补充字节 前字节 数为 1 5 * 3 等
32、于 4 5 字节 , 要到 4 的倍数 , 必须向上取 4 的倍 数即 4 8 , 所以就 有了不 上 3 个字 节 0 的结果 。 至此 , 整 个图像 文件的 大 小为 : 5 4 + ( 1 5 * 3 + 3 ) * 8 等于 4 3 8 字节 , 和前面所得到的信 息 文件 大小 : 4 3 8 是一致的 。 另外一点 需要注 意的是 显 示图像的 顺序是 由 下到 上 , 由左 到右 , 即像素 数 据部分的第一像素 数据是 我们见 到 的图像的 左下角 的像素 的 数据 ; 而 像素数 据的最 后 一个有效数据是我 们见到 的图像 的 右上角的 像素的 数据 。 下面我们 修改一
33、 下图片 来 验证一下 : 我们将左 下角画 上白色 , 右上角画 上黑色 , 图片放大之后 如 下 图片数据 分析如 下 : 未 来 之 芯 , 卓 我 M 3 1 9 / 2 8 我们可以 看到像 素部分 开 始部分是 白色像 素 ( 灰 色 部分 ) : 对应我们 图像的 左下角 。 后尾部分 是黑色 像素 ( 灰 色部分 ) : 对应我们 图像的 右上角 。 对 B M P 图像 文件内 容有 了具体的 了解之 后我们 开 始编写我 们的应 用程序 , 根据图片的头部信 息 , 合 法地读 出 其中的像 素部分 ( 由于 p c 机上 , 2 4 位真彩色 使 用比较广 ,在此只分 析
34、 2 4 为真彩色 )。 再回到前 面的 m a i n 函数 , 其中调 用了一 个 b m p 图片显示 函数 L cd _ sh o w _ b m p ,其源码如 下 : 未 来 之 芯 , 卓 我 M 3 2 0 / 2 8 1. /* 2. * 函数名 : Lcd_show_bmp 3. * 描述 : LCD 显示 RGB88 8 位图图片 4. * 输入 : x - 显示纵坐标 (0 - 239) 5. * y - 显示横坐标 (0 - 319) 6. * pic_name - 图片名称 7. * 输出 : 无 8. * 举例 : Lcd_show_bmp(0, 0,“/test
35、.bmp“); 9. * 注意 : 图片为 24 为真 彩色位图图片 10. 图片宽度不能超过 320 11. 图片在 LCD 上的粘贴范围为 : 纵 向 : x,x+ 图像高度 横向 Y , Y+ 图像宽度 12. 当图片为 320*240 时 - 建议 X 输入 0 y 输入 0 13. */ 14. BYTE pColorData960; 15. FATFS bmpfs2; 16. FIL bmpfsrc, bmpfdst; 17. FRESULT bmpres; 18. void Lcd_show_bmp(unsigned short int x, unsigned short int
36、 y,unsigned char *pic_name) 19. 20. int k; 21. int i; 22. int j; 23. int width; 24. int height; 25. int l_width; 26. BYTE red,green,blue; 27. BITMAPFILEHEADER bitHead; 28. BITMAPINFOHEADER bitInfoHead; 29. WORD fileType; 30. unsigned int read_num; 31. unsigned char tmp_name 20 ; 32. sprintf( cha r *
37、)tmp_name, “0:%s“ ,pic_name); 33. f_mount( 0 , 34. 35. bmpres = f_open( / 打开 bmp 文 件 未 来 之 芯 , 卓 我 M 3 2 1 / 2 8 36. 37. if (bmpres = FR_OK) 38. 39. USART1_printf(USART1, “Open file success r n“ ); 40. 41. / 读取位图文件 类型 信息 42. f_read( / 读取 1 、 2 字节 ( 文件 类型 ) 43. 44. if (fileType != 0x4d42 ) / 0x4d42 是
38、 b mp 图像类型 标志 45. 46. USART1_printf(USART1, “file is not .bmp file! r n“ ); 47. return ; 48. 49. else 50. 51. USART1_printf(USART1, “Ok this is .bmp file r n“ ); 52. 53. 54. / 读取 位图文件头信息结构 ( 该结构 已经在前面 描述过啦 ) 55. f_read( 56. 57. showBmpH ead( 58. USART1_printf(USART1, “ r n“ ); 59. 60. / 读取位图信息头信息 (
39、该结构 已经在前面 描述过啦 ) 61. f_read( 62. 63. showBmpInforHead( 64. USART1_printf(U SART1, “ r n“ ); 65. 66. 67. else 68. 69. USART1_printf(USART1, “file open fail! r n“ ); 70. return ; 未 来 之 芯 , 卓 我 M 3 2 2 / 2 8 71. 72. 73. 74. width = bitInfoHead.biWidth; 75. height = bitInfoHead.biHeight; 76. 77. l_width
40、 = WIDTH BYTES(width* bitInfoHead.biBitCount); / 计算位图的实际宽度并确保它为 32 的倍数 ( 4 字节 倍数 ) 78. 79. if (l_width 960 ) 80. 81. USART1_printf(USART1, “ nSORRY, PIC IS TOO BIG (= 24 ) 86. 87. 88. bmp(x,y,width, height); /LCD 参数相关设置 89. 90. for (i= 0 ;i 读 取 一行 并 显示 - - 读取 下 一行 并显 示 - . 直至 读完 所 有 行 。 另外一点 就是 : RG
41、 B 2 4 T O RG B 1 6 是 个 宏定义 , 因为 图像 数据 是 RG B 8 8 8 即 2 4为 真彩色 , 而我 们 的 L C D 是 RG B 5 6 5 即 1 6 为 色度 的 , 所以 我 们 需要 按 比例 将 2 4 为真彩色 压 缩 为 1 6 位 。 宏 定义 如下 : 1. #define RGB24TORGB16(R,G,B) (unsigned short int )(R) 3 ) 2 ) 3 ) 完成 L C D 截图 功能 。 我们 可以 根据 用 户 的 长 和 高 来构造 我们 前 面 的 信 息 头 , 并且 根据 长 与 四 字 节 对
42、齐 的关系 来 补 充 需要 的 0 大小 字节 。 在 m a i n 函数中 , 我们 调用 了 Sc r e e n _ sh o t 这个 函数 来截图 。 保存 的 图片 是 2 4 位的 真彩色 。 Sc r e e n _ sh o t 的 源码 如下 : 1. /* 未 来 之 芯 , 卓 我 M 3 2 4 / 2 8 2. * 函数名 : Screen_shot 3. * 描述 : 截取 LCD 指定位 置 指定宽高的像素 保存为 24 位真彩色 bmp 格式图片 4. * 输入 : x - 水平位置 5. * y - 竖直位置 6. * Width - 水平宽度 7. *
43、 Height - 竖直高度 8. * filename - 文件名 9. * 输出 : 0 - 成功 10. * - 1 - 失败 11. * 8 - 文件已存在 12. * 举例 : Screen_shot(0, 0, 320, 240, “/myScreen“); 全屏截图 13. * 注意 : x 范围 0,319 y 范围 0,239 Width 范围 0,320 - x Height 范围0,240 - y 14. * 如果文件已存在 , 将直接返回 15. * */ 16. int Screen_shot(unsigned short int x, unsigned short int y, unsigned short int Width, unsigned short int Height, unsigned char *filename) 17. / 直接 构造 前面 54 字节 的 头部信息 18. unsigned char header 54 =