zigbee无线传感网实训---在LCD屏上显示JPG图片、 触摸屏、相册(The fourth day)
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 jpegtar 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 jpegtar 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>#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>#include "jpeglib.h"struct imginfo
{int width;int height;int pixel_size;
};char *readjpg(char const *filename, int size)
{char *jpg_buffer = calloc(1, size);// 不断读取JPG信息,放入jpg_bufferint fd = open(filename, O_RDONLY);int n = 0;while(size > 0){n = read(fd, jpg_buffer+n, size); size -= n;}close(fd);return jpg_buffer;
}int main(int argc, char const *argv[]) // ./showjpg xxx.jpg
{struct stat info;bzero(&info, sizeof(info));stat(argv[1], &info);char *jpg_buffer = readjpg(argv[1], info.st_size);// 声明解压缩结构体,以及错误管理结构体struct jpeg_decompress_struct cinfo;struct jpeg_error_mgr jerr;// 使用缺省的出错处理来初始化解压缩结构体cinfo.err = jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);// 配置该cinfo,使其从jpg_buffer中读取jpg_size个字节// 这些数据必须是完整的JPEG数据jpeg_mem_src(&cinfo, jpg_buffer, info.st_size);// 读取JPEG文件的头,并判断其格式是否合法int ret = jpeg_read_header(&cinfo, true);if(ret != 1){fprintf(stderr, "[%d]: jpeg_read_header failed: ""%s\n", __LINE__, strerror(errno));exit(1);}// 开始解压jpeg_start_decompress(&cinfo);// 将图片的宽、高、深度信息保存起来struct imginfo imageinfo;imageinfo.width = cinfo.output_width;imageinfo.height = cinfo.output_height;imageinfo.pixel_size = cinfo.output_components;int row_stride = imageinfo.width * imageinfo.pixel_size;// 根据图片的尺寸大小,分配一块相应的内存bmp_buffer// 用来存放从jpg_buffer解压出来的图像数据unsigned long rgb_size;unsigned char *rgb_buffer;rgb_size = imageinfo.width * imageinfo.height * imageinfo.pixel_size;rgb_buffer = (unsigned char *)calloc(1, rgb_size);// 循环地将图片的每一行读出并解压到bmp_buffer中int line = 0;while(cinfo.output_scanline < cinfo.output_height){unsigned char *buffer_array[1];buffer_array[0] = rgb_buffer +(cinfo.output_scanline) * row_stride;jpeg_read_scanlines(&cinfo, buffer_array, 1);}// 解压完了,将jpeg相关的资源释放掉jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);free(jpg_buffer);// 将rgb_buffer中的数据,妥善地放到lcd上去显示int lcd = open("/dev/fb0", O_RDWR);// 获取LCD的屏幕参数信息struct fb_var_screeninfo vinfo;bzero(&vinfo, sizeof(vinfo));ioctl(lcd, FBIOGET_VSCREENINFO, &vinfo);int lcd_w = vinfo.xres;int lcd_h = vinfo.yres;int lcd_bpp = vinfo.bits_per_pixel;char *p = mmap(NULL, lcd_w * lcd_h * lcd_bpp/8, PROT_READ|PROT_WRITE,MAP_SHARED, lcd, 0);int w = imageinfo.width;int h = imageinfo.height;for(int j=0; j<480 && j<h; j++){for(int i=0; i<800 && i<w; i++){memcpy(p + 4*i + 800*4*j+vinfo.red.offset/8, rgb_buffer + 3*i + w*3*j+0, 1);memcpy(p + 4*i + 800*4*j+vinfo.green.offset/8,rgb_buffer + 3*i + w*3*j+1, 1);memcpy(p + 4*i + 800*4*j+vinfo.blue.offset/8, rgb_buffer + 3*i + w*3*j+2, 1);}}munmap(p, 800*480*4);free(rgb_buffer);close(lcd);return 0;
}
相关编译操作看上面笔记.
结果图:
触摸屏
输入子系统管理结构体:
struct input_event {struct timeval time; //时间戳__u16 type; //事件类型__u16 code; //事件代码(代号)__s32 value; //事件的值};
解释:
type:3 //事件类型EV_ABS (触摸屏事件)
code:0 //事件代码ABS_X (X轴坐标)
value:343 //值
type:3
code:1 //事件代码ABS_Y (Y轴坐标)
value:343
type:3
code:24 //事件代码ABS_PRESSURE(压力值)
value:200
type:1 //事件类型EV_KEY (按键事件)
code:330 //事件代码BTN_TOUCH (按钮)
value:1 //值按下
type:0 code:0 value:0 //同步
type:3 code:24 value:0
type:1 code:330 value:0
type:0 code:0 value:0
查找字串:strstr(str1, str2);
作用:判断str2是否是str1的子串
返回值:是返回子串首次出现的位置
否返NULL
---------------------------------------------------------------
练习:
1、获取触摸屏坐标(touch.c)
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <strings.h>
#include <linux/input.h>int main(void)
{//打开触摸屏int ts = open("/dev/input/event0", O_RDONLY);if(ts == -1){perror("打开触摸屏失败:");exit(0);}struct input_event myevent;bzero(&myevent, sizeof(myevent));while(1){read(ts, &myevent, sizeof(myevent));if(myevent.type == EV_ABS){if(myevent.code == ABS_X){printf("X:%d ",myevent.value);}if(myevent.code == ABS_Y){printf("Y:%d\n",myevent.value);}}}close(ts);return 0;
}
编译操作:
虚拟机:
arm-none-linux-gnueabi -gcc touch.c -o touch
lcd开发板:
tftp -g 192.168.1.176 -r touch
chomd 777 touch
./touch
效果图:
存在bug。
修复bug:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <strings.h>
#include <linux/input.h>void get_xy(int *x, int *y)
{//打开触摸屏int ts = open("/dev/input/event0", O_RDONLY);if(ts == -1){perror("打开触摸屏失败:");exit(0);}struct input_event myevent;bzero(&myevent, sizeof(myevent));bool x_flag = false;bool y_flag = true;while(1){read(ts, &myevent, sizeof(myevent));if(myevent.type == EV_ABS){if(myevent.code==ABS_X && x_flag==false && y_flag == true){*x = myevent.value;x_flag = true;y_flag = false;}if(myevent.code==ABS_Y && x_flag == true && y_flag == false){*y = myevent.value;x_flag = false;y_flag = true;}if(myevent.code==ABS_PRESSURE && myevent.value==0)break;}if(myevent.type==EV_KEY && myevent.code==BTN_TOUCH && myevent.value==0)break;}//printf("X:%d Y:%d\n", *x, *y);close(ts);return ;
}int main(void)
{int x,y;while(1){get_xy(&x, &y);printf("X:%d Y:%d\n", x,y);}return 0;
}
效果:
2、整合代码完成lcd触摸屏图片浏览功能:要求可浏览jpg、bmp图片(相册)
bmp.c
#include <errno.h>
#include "bmp.h"/*初始化LCD屏*/char *init_lcd(int lcd,struct fb_var_screeninfo *vinfo)
{//获取LCD屏硬件参数ioctl(lcd, FBIOGET_VSCREENINFO, vinfo);//LCD屏像素点的位深int bpp = vinfo->bits_per_pixel;//LCD屏可显示的像素点个素(字节)int screensize = vinfo->xres * vinfo->yres * bpp/8;//给LCD申请显存char *fbmem = mmap(NULL, screensize, PROT_READ|PROT_WRITE,MAP_SHARED, lcd, 0);if(fbmem == MAP_FAILED){perror("映射显存失败");exit(0);}return fbmem;
}/*获取bmp图片的rgb数据*/
char * load_bmp(const char *bmpfile, struct image_info *minfo)
{//打开bmp图片int fd = open(bmpfile, O_RDONLY);if(fd == -1){fprintf(stderr, "opening \"%s\" failed: %s\n",bmpfile, strerror(errno));exit(0);}// 获得文件大小,并分配内存struct stat fileinfo;fstat(fd, &fileinfo);int rgb_size = fileinfo.st_size;char *rgb_buf = calloc(1, rgb_size);// 读取BMP内容到内存中struct bitmap_header header;struct bitmap_info info;struct rgb_quad quad;//读取文件头read(fd, &header, sizeof(header));//读取信息头read(fd, &info, sizeof(info));if(info.compression != 0){read(fd, &quad, sizeof(quad));fprintf(stderr, "read quad! \n");}//读取rgb数据read(fd, rgb_buf, rgb_size);//将bmp图片的宽度、高度和图片的色彩深度信息保存下来minfo->width = info.width;minfo->height= info.height;minfo->pixel_size = info.bit_count/8;close(fd);return rgb_buf;
}/*显示bmp图片*/
void display(char *bmpfile, //图片路径struct fb_var_screeninfo *vinfo,//lcd硬件参数int xoffset, //x轴的偏移量(相对于坐标原点)int yoffset //y轴的偏移量)
{//打开LCD屏int lcd = open("/dev/fb0", O_RDWR);//初始化LCD屏char *FB = init_lcd(lcd,vinfo);//初始化保存图片信息的结构体struct image_info *minfo = calloc(1, sizeof(struct image_info));//获取图片的rgb数据char *rgb_buf = load_bmp(bmpfile, minfo);char *tmp = rgb_buf;//清除屏幕(全屏显示白色)int x, y, k = 0x00FFFFFFFF;for(x=0; x<vinfo->yres; x++){for(y=0; y<vinfo->xres; y++){memcpy(FB+(4*y)+((vinfo->xres)*4*x), &k, 4);}}// 从最后一行开始显示BMP图像int pad = ((4-( minfo->width * minfo->pixel_size ) % 4)) % 4; // 0-3rgb_buf += (minfo->width * minfo->pixel_size + pad) * (minfo->height-1); //偏移映射区域(相对于坐标原点(0,0))FB += (yoffset * vinfo->xres + xoffset) * 4;//每一行显示的最大值int lcd_w = vinfo->xres - xoffset;//没列显示的最大值int lcd_h = vinfo->yres - yoffset;//开始显示for(x=0; x<lcd_h && x<minfo->height; x++){for(y=0; y<lcd_w && y<minfo->width; y++){unsigned long lcd_offset = (vinfo->xres*x + y) * 4;memcpy(FB + lcd_offset + vinfo->red.offset/8, rgb_buf + 2, 1);memcpy(FB + lcd_offset + vinfo->green.offset/8, rgb_buf + 1, 1);memcpy(FB + lcd_offset + vinfo->blue.offset/8, rgb_buf + 0, 1);rgb_buf += minfo->pixel_size;}rgb_buf += pad;rgb_buf -= (minfo->width * minfo->pixel_size + pad) * 2;}/* 取消内存映射 */munmap(FB, (vinfo->xres * vinfo->yres * vinfo->bits_per_pixel/8));close(lcd);free(tmp);
}
bmp.h
//
// Copyright(C), 2013-2017, GEC Tech. Co., Ltd.
//
// 文件: piano/inc/bmp.h
// 日期: 2017-9
// 描述: 处理BMP格式图像数据头文件
//
// 作者: Vincent Lin (林世霖) 微信公众号:秘籍酷
//
// 技术微店: http://weidian.com/?userid=260920190
// 技术交流: 260492823(QQ群)
//#ifndef __BMP_H_
#define __BMP_H_#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <pthread.h>#define LCD "/dev/fb0"struct bitmap_header
{int16_t type;int32_t size; // 图像文件大小int16_t reserved1;int16_t reserved2;int32_t offbits; // bmp图像数据偏移量
}__attribute__((packed));struct bitmap_info
{int32_t size; // 本结构大小 int32_t width;int32_t height;int16_t planes; // 总为零int16_t bit_count; // 色深int32_t compression;int32_t size_img; // bmp数据大小,必须是4的整数倍int32_t X_pel;int32_t Y_pel;int32_t clrused;int32_t clrImportant;
}__attribute__((packed));struct rgb_quad
{int8_t blue;int8_t green;int8_t red;int8_t reserved;
}__attribute__((packed));struct image_info
{int width;int height;int pixel_size;
};void display(char *bmpfile, struct fb_var_screeninfo *vinfo, int xoffset, int yoffset);
void draw_piano(char *FB, struct fb_var_screeninfo *vinfo, char *backgound);
char *load_bmp (const char *bmpfile, struct image_info *imginfo);#endif
jpg.h
#ifndef __JPG_H_
#define __JPG_H_#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>#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>#include "jpeglib.h"struct imginfo
{int width;int height;int pixel_size;
};char *readjpg(char const *filename, int size);
int show_jpg(char *jpgpath);#endif
show_jpg.c
#include "jpg.h"char *readjpg(char const *filename, int size)
{char *jpg_buffer = calloc(1, size);// 不断读取JPG信息,放入jpg_bufferint fd = open(filename, O_RDONLY);int n = 0;while(size > 0){n = read(fd, jpg_buffer+n, size); size -= n;}close(fd);return jpg_buffer;
}int show_jpg(char *jpgpath) // ./showjpg xxx.jpg
{//获取文件属性struct stat info;bzero(&info, sizeof(info));stat(jpgpath, &info);//读取JPEG文件char *jpg_buffer = readjpg(jpgpath, info.st_size);// 声明解压缩结构体,以及错误管理结构体struct jpeg_decompress_struct cinfo;struct jpeg_error_mgr jerr;// 使用缺省的出错处理来初始化解压缩结构体cinfo.err = jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);// 配置该cinfo,使其从jpg_buffer中读取jpg_size个字节// 这些数据必须是完整的JPEG数据jpeg_mem_src(&cinfo, jpg_buffer, info.st_size);// 读取JPEG文件的头,并判断其格式是否合法int ret = jpeg_read_header(&cinfo, true);if(ret != 1){fprintf(stderr, "[%d]: jpeg_read_header failed: ""%s\n", __LINE__, strerror(errno));exit(1);}// 开始解压jpeg_start_decompress(&cinfo);// 将图片的宽、高、深度信息保存起来struct imginfo imageinfo;imageinfo.width = cinfo.output_width;imageinfo.height = cinfo.output_height;imageinfo.pixel_size = cinfo.output_components;int row_stride = imageinfo.width * imageinfo.pixel_size;// 根据图片的尺寸大小,分配一块相应的内存bmp_buffer// 用来存放从jpg_buffer解压出来的图像数据unsigned long rgb_size;unsigned char *rgb_buffer;rgb_size = imageinfo.width * imageinfo.height * imageinfo.pixel_size;rgb_buffer = (unsigned char *)calloc(1, rgb_size);// 循环地将图片的每一行读出并解压到bmp_buffer中int line = 0;while(cinfo.output_scanline < cinfo.output_height){unsigned char *buffer_array[1];buffer_array[0] = rgb_buffer +(cinfo.output_scanline) * row_stride;jpeg_read_scanlines(&cinfo, buffer_array, 1);}// 解压完了,将jpeg相关的资源释放掉jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);free(jpg_buffer);// 将rgb_buffer中的数据,妥善地放到lcd上去显示int lcd = open("/dev/fb0", O_RDWR);// 获取LCD的屏幕参数信息struct fb_var_screeninfo vinfo;bzero(&vinfo, sizeof(vinfo));ioctl(lcd, FBIOGET_VSCREENINFO, &vinfo);int lcd_w = vinfo.xres;int lcd_h = vinfo.yres;int lcd_bpp = vinfo.bits_per_pixel;char *p = mmap(NULL, lcd_w * lcd_h * lcd_bpp/8, PROT_READ|PROT_WRITE,MAP_SHARED, lcd, 0);int w = imageinfo.width;int h = imageinfo.height;for(int j=0; j<480 && j<h; j++){for(int i=0; i<800 && i<w; i++){memcpy(p + 4*i + 800*4*j+vinfo.red.offset/8, rgb_buffer + 3*i + w*3*j+0, 1);memcpy(p + 4*i + 800*4*j+vinfo.green.offset/8,rgb_buffer + 3*i + w*3*j+1, 1);memcpy(p + 4*i + 800*4*j+vinfo.blue.offset/8, rgb_buffer + 3*i + w*3*j+2, 1);}}munmap(p, 800*480*4);free(rgb_buffer);close(lcd);return 0;
}
touch.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <strings.h>
#include <linux/input.h>#include "bmp.h"
#include "jpg.h"/*初始化LCD屏*/char *init_lcd(struct fb_var_screeninfo *vinfo)
{//打开LCD屏int lcd = open("/dev/fb0", O_RDWR);//获取LCD屏硬件参数ioctl(lcd, FBIOGET_VSCREENINFO, vinfo);//LCD屏像素点的位深int bpp = vinfo->bits_per_pixel;//LCD屏可显示的像素点个素(字节)int screensize = vinfo->xres * vinfo->yres * bpp/8;//给LCD申请显存char *fbmem = mmap(NULL, screensize, PROT_READ|PROT_WRITE,MAP_SHARED, lcd, 0);if(fbmem == MAP_FAILED){perror("映射显存失败");exit(0);}return fbmem;
}/*判断参数是否正确*/
void usage(int argc, char **argv)
{if(argc != 4){printf("参数不对\n");exit(0);}
}int init_touch(void)
{//打开触摸屏int ts = open("/dev/input/event0", O_RDONLY);if(ts == -1){perror("打开触摸屏失败:");exit(0);}return ts;
}void get_xy(int ts, int *x, int *y)
{struct input_event myevent;bzero(&myevent, sizeof(myevent));bool x_flag = false;bool y_flag = true;while(1){read(ts, &myevent, sizeof(myevent));if(myevent.type == EV_ABS){if(myevent.code==ABS_X && x_flag==false && y_flag == true){*x = myevent.value;x_flag = true;y_flag = false;}if(myevent.code==ABS_Y && x_flag == true && y_flag == false){*y = myevent.value;x_flag = false;y_flag = true;}if(myevent.code==ABS_PRESSURE && myevent.value==0)break;}if(myevent.type==EV_KEY && myevent.code==BTN_TOUCH && myevent.value==0)break;}return ;
}int main(int argc,char **argv)
// int main()
{int x,y;struct fb_var_screeninfo my_vinfo;int i = 0;// printf("size=%d",argc);// //将图片路径存起来// char *img_pathname[argc];// for(int i=0;i<argc;i++){// strcpy(img_pathname[i],argv[i]);// }char *img_pathname[] = {"/aaa/image/j1.jpg","/aaa/image/1.bmp","/aaa/image/2.bmp","/aaa/image/3.bmp","/aaa/image/4.bmp","/aaa/image/5.bmp"};//初始化LCD屏char *p = init_lcd(&my_vinfo);//初始化触摸屏int ts = init_touch();//先显示一张图片display(img_pathname[i], p, &my_vinfo, 0, 0);while(1){//获取触摸屏坐标get_xy(ts, &x, &y);printf("X:%d Y:%d\n", x, y);//对坐标点进行处理if(x>0 && x<100 && y>160 && y<320){//重置坐标,为下一次获取做准备x = 0;y = 0;//计数i--;if(i<0)i=4;//显示if(strstr(img_pathname[i],".bmp")){display(img_pathname[i], //图片路径p, //映射内存的地址&my_vinfo, //lcd硬件参数0, //x轴的偏移量(相对于坐标原点)0 //y轴的偏移量);}if(strstr(img_pathname[i],".jpg") || strstr(img_pathname[i],".jpeg")){show_jpg(img_pathname[i]);}}if(x>700 && x<800 && y>160 && y<320){x = 0;y = 0;i++;if(i>4)i=0;if(strstr(img_pathname[i],".bmp")){display(img_pathname[i], //图片路径p, //映射内存的地址&my_vinfo, //lcd硬件参数0, //x轴的偏移量(相对于坐标原点)0 //y轴的偏移量);}if(strstr(img_pathname[i],".jpg") || strstr(img_pathname[i],".jpeg")){show_jpg(img_pathname[i]);}}}//关闭触摸屏close(ts);return 0;
}
编译过程:
虚拟机:
arm-none-linux-gnueabi-gcc *.c -o main -I/home/gec/jpeg/include -L/home/gec/jpeg/lib -ljpeg打开tftp软件找到要执行软件的目录LCD开发板:
tftp -g 192.168.1.181 -r main
chomd 777 main //修改权限
./main
注:实训第五天将实现LCD开发板连接摄像头实时显示:zigbee无线传感网实训---实现LCD开发板连接摄像头实时显示(The Fifth day)
zigbee无线传感网实训---在LCD屏上显示JPG图片、 触摸屏、相册(The fourth day)相关推荐
- zigbee无线传感网实训---zigbee显示温湿度以及连接LCD开发板显示温湿度(The Eighth day)
承接第七天:zigbee无线传感网实训---实现LCD开发板播放音乐并切换歌曲(The Seventh day) 一.实验准备器材如图: 二:步骤 ============= ...
- zigbee无线传感网实训---linux命令的简单了解(one day)
嵌入式软件介绍: 1.VMware 虚拟机 安装虚拟机将芯片虚拟化一块出来运行linux系统 2.Ubuntu18.04 ...
- 【单片机原理及应用日志】用取模软件提取汉字字模,在LCD屏上显示界面
用取模软件提取汉字字模 在LCD屏上显示界面 用取模软件提取汉字字模 打开取模软件 汉字取模 2.1 点击模式,选择字符模式 2.2点击选项,进行设置 设置如下,点阵内的数字手动输入999,然后点击确 ...
- zigbee无线传感网技术与应用开发v2.0_ZigBee网络架构详解
2020年11月13日 16:16 在万物互联-物联网的背景下,zigbee网络应用越加广泛,zigbee技术具有强大的组网能力,可以形成星型.树型和网状网3种结构,这三种网络结构各有优势,大家可以根 ...
- zigbee无线传感网技术与应用开发v2.0_物联网通讯协议——Zigbee
一.什么是Zigbee ZigBee是一种新兴的短距离.低速率无线网络技术.具有成本低.体积小.能量消耗小和传输速率低等优势. ZigBee是介于无线标识技术和蓝牙之间的一种技术,主要用于近距离无线连 ...
- Zigbee无线传感网 CC2530+DHT11DS18B20 温湿度采集 串口上位机显示
文章目录 一.介绍 二.上位机数据采集 (一)采集数据 (二)拓扑结构 (三)新节点加入网络 (四)节点事件 三.实现分析 (一)配置文件 (二)发送 (三)短地址和数据获取 (四)数据包分析 (五) ...
- 武汉理工大学 mooc网 的无线传感网技术笔记
武汉理工大学 mooc网 的无线传感网技术笔记 只有截屏,该笔记仅供学习使用. 第一章 P1 第一章 P2 第一章 P3 第二章 P1 信源熵的定义:信源各个离散消息的自信息量的数学期望(即概率加权的 ...
- 《高级计算机网络》之无线传感网——大连理工大学研究生课程整理笔记(非常详细,通俗易懂)
注:本文是根据大连理工大学研究生课程<高级计算机网络>整理的笔记,非常全面和详细,通俗易懂,对于您考试或者面试都会有很大的帮助,如果对您有用,请点个赞吧!! <高级计算机网络> ...
- Zigbee 无线传感网络 无线通信技术 协议体系结构 OSAL
什么是zigbee 无线传感网络的无线通信技术可以采用zigbee,蓝牙,wifi和红外 Zigbee技术是一种短距离,低复杂度,低功耗,低成本,低数据速率的双向无线通信技术,是一组基于IEEE802 ...
最新文章
- When should static_cast, dynamic_cast and reinterpret_cast be used?
- Java基础知识——类装载器与反射机制
- java系统高并发解决方案
- 使用BH1750测量激光发射器的强度
- Android深度探索第四章感想
- WireShark抓包之提示Alert Level: Fatal, Description: HandShake Failure
- 警告用户:VoIP电话存在诸多风险
- 地灾应急暨地灾危险性评估培训班学习笔记
- 武汉科技大学城市学院计算机二级考试,湖北省计算机等级考试一年有几次报名...
- C# 操作MSSQL数据库类
- Maven异常总结002---nexus服务器启动失败wrapper | The nexus service was launched, but failed to start.
- fread 单独测试没有问题 在正式项目里面丢数据 可能是系统资源不足 预读出了问题
- webstorm主题设置
- 关于Tomcat和Servlet容器的小结
- 一个大学生的人生随笔
- 中外大都市人口密度的数据比较
- DDR5 trainning
- 32位计算机百度盘,【安装包】正版office_2010(win7专用【32位】)
- 2022年江苏省建筑三类人员(项目负责人B证)练习题及答案
- js判断是否为移动端
热门文章
- 【联合早报】全球普惠区块链峰会—— 跃大校长张起杰:培育学生面对未来职场需求...
- 快速构建页面APP程序员的人生计划
- NLP论文解读《Learning Text Similarity with Siamese Recurrent Networks》
- 微服务:Nacos将微服务注册到指定的命名空间下
- 3D设计软件中怎么创建重合参考平面?
- 【转】Html Agility Pack ── 一个分析HTML的工具
- 【一致性仿真】Fixed-time bipartite consensus of multi-agent systems with disturbances
- 设备健康管理:如何运用人工智能技术提升维护效率?
- java学习-zxing生成二维码矩阵的简单例子
- vue3+vite+ts 封装axios踩坑记录