b
承接实训第三天:zigbee无线传感网实训---LCD显示bmp图片及一些简单的c语言编程功能( On the third day)
一、修改实训第三天中练习2中的bug(在原码的基础上增加:lseek(bmp, 54, SEEK_SET);即可)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main(int argc, char **argv)
{
int lcd = open("/dev/fb0", O_RDWR);
if(lcd == -1)
{
perror("打开LCD失败");
exit(0);
}
// 2, 映射一块恰当大小的内存
char *p = mmap(NULL, // 不指定映射内存的位置,让系统自动选取
800*480*4, // 映射内存的大小
PROT_READ | PROT_WRITE, // 以读、写模式操作映射内存
MAP_SHARED, // 其他线程、进程可以共享访问这块内存
lcd, // LCD文件描述符
0 // 映射内存与LCD的偏移量,0代表完全重合
);
// 3, 准备数据
if(argc < 2)
{
printf("参数不对!\n");
close(lcd);
munmap(p, 800*480*4);
exit(0);
}
int bmp = open(argv[1], O_RDONLY);
if(bmp == -1)
{
perror("打开图片失败!");
close(lcd);
munmap(p, 800*480*4);
exit(0);
}
char bmp_buf[800*480*3];
lseek(bmp, 54, SEEK_SET);//bug修复处
int ret = read(bmp, bmp_buf, sizeof(bmp_buf));
if(ret <= 0)
{
perror("读取bmp数据失败!");
close(lcd);
close(bmp);
munmap(p, 800*480*4);
exit(0);
}
int lcd_buf[800*480];
// 4, 铺满整个映射内存
for(int i=0; i<800*480; i++)
{
lcd_buf[i]=bmp_buf[i*3] | bmp_buf[i*3+1]<<8 | bmp_buf[i*3+2]<<16;
}
for(int y=0; y<480; y++)
{
for(int x=0; x<800; x++)
{
memcpy(p+4*x+800*4*y, &lcd_buf[x+(479-y)*800], 4);
}
}
// 5, 释放资源
munmap(p, 800*480*4);
close(lcd);
return 0;
}
编译过程同实训第二天。
效果图:
二、常见的图片格式:
bmp jpg jpeg bng ....
除了bmp位图其他格式的图片全都是进过特定的图像压缩算法压缩过的若要在开发板显示其他格式的图片需要移植解码库 jpg及jpeg解码库移植
复制 jpegsrc.v9c.tar.gz到ubuntu的家目录
cp jpegsrc.v9c.tar.gz ~/
解压
cd ~
mkdir jpeg
tar zxvf jpegsrc.v9c.tar.gz -C ./jpeg
编译:
切换路径到/home/gec/jpeg/jpeg-9c/
cd jpeg/jpeg-9c/
配置:
./configure --prefix=/home/gec/jpeg/ --host=arm-none-linux-gnueabi
prefix//指定安装路径 host//指定编译器
编译:
make
安装:
make install
切换路径到/home/gec/jpeg
查看是否安装成功:
bin include lib share(存在这些内容则表示安装成功)
压缩库文件“lib”
tar zcvf jpeglib.tar.gz lib
拷贝到共享文件夹
cp jpeglib.tar.gz /mnt/hgfs/** //**表示自己创建的文件夹名
-----------------------------------------------------------
在LCD开发板中
将压缩包传输到开发板
tftp -g 192.168.1.** -r jpeglib.tar.gz //192.168.1.**表示本机IP
解压到你开发板的家目录下
cd ~
mkdir jpeg
tar zxvf jpeglib.tar.gz -C ~/jpeg
-------------------------------------------------------------
编译显示jpg图片代码
arm-none-linux-gnueabi-gcc show_jpg.c -o show_jpg -I/home/gec/jpeg/include -L/home/gec/jpeg/lib -ljpeg
-I --->指定头文件的路径
-L --->指明库文件所在路径
-l --->指定要连接的库名
动态库的命名libxxxx.so.**** ---> xxxx表示库的名字
将可执行程序下载到开发板
tftp -g 192.168.1.181 -r show_jpg
chomd 777 show_jpg //修改权限
tftp -g 192.168.1.181 -r 1.jpg
./show_jpg 1.jpg
出错:
./show_jpg: error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory
在环境变量中指定库文件的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/chongjiao/lib
”/chongjiao/lib“ 下载到开发板的lib的路径
一次的
想要永久保留将export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:“/chongjiao/lib”
写入/etc/profile即可
vi /etc/profile
写到最后一句export ***的下一行即可
练习:
在LCD屏上显示JPG图片:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <syslog.h>
#include <errno.h>
#include <linux/input.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdbool.h>
#includ