Linux項目開發—電子相冊

1.簡述:電子相冊,開發一個在ARM9開發板上的電子相冊,實現圖片的播放;

2.工具、材料:電腦(帶有Ubuntu等系列Linux系統)、ARM9系列開發板、串口線一根、串口通信軟件SecureCRT;

3.基本流程:

a.編寫好源代碼後在Ubuntu上編譯爲arm指令的可執行文件;a1:Linux下編譯一般用gcc,基本用法爲:gcc example.c  -o out; a2:這樣編譯出來的可執行文件還不能直接在linux上執行,需要賦予權限:chmod +x out (+x  —— -x);a3:執行源程序:./out  ;

b.經過a編譯出來的可執行文件還是隻能在電腦上執行,不能再arm開發板上面執行,這是因爲arm和intel的彙編代碼和指令集不一樣,則需要通過使用gcc另一個方法:arm-linux-gcc example.c -o out ;

c.編寫好可在arm上執行的文件後則需要導入到開發板上,通過串口線連接開發板和電腦,打開SecureCRT,點擊連接,選擇對應的com接口,連接好後傳輸即可;再經過a2 a3;

 圖1:效果展示

4.系列知識補充:

a.常用linux指令:除3中提到的幾個外,補充如下  a1: cd   cd  / 跳轉根目錄   cd 文件夾 跳轉到指定文件夾     note:可以只輸入文件夾前幾個字符用TAB補齊;a2:ls  顯示當前文件夾下的文件, ls -l  查看詳細信息;a3:su 切換用戶  直接su 切換管理員root用戶 ,su 用戶名 切換對應用戶,   note:有些可能會出現密碼錯誤無法切換root用戶,sudo passwd root 改一下密碼,一般都可以解決; a4: rm   例如刪庫跑路指令: rm -rf /*   ,沒事刪刪玩還可以,別刪習慣了-_~; a5: mkdir 創建目錄 ,對應刪除目錄:rmdir   note:文件夾不能和文件同名字的,這個在win下面也是對得;  a6:man  這是一個厲害的命令,可以man許多東西  note:  q退出,n、N搜索; a7:快捷鍵 ctrl c:退出正在執行的文件;ctrl l 清屏;

b.linux的文件:例如屏幕文件:/dev/fb0,使用方法同樣是open,write,close;對觸摸屏操作,獲取觸摸軌跡方向;

c.圖片及播放:在這裏我們採用bmp格式圖片,即位圖,這種圖片是沒有壓縮的,讀取既顯示,採用雙向循環鏈表把圖片文件鏈接起來,根據獲取到的觸摸事件手指滑動方向來決定鏈表移動方向;

5.部分代碼及實現:

1 頭文件聲明
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include <sys/mman.h>
#include<linux/input.h>
#include<stdlib.h>
#include<string.h>
2 定義各種變量
int fd_lcd,*plcd;//屏幕文件,映射
int fd_bmp;//圖片文件


3 相關函數定義
1.對一個像素點進行操作,顯示顏色

void lcd_draw_point(int x,int y,int color)//寫像素點函數
{
	if(x>=800||y>=480)//屏幕大小爲480*800,超過範圍輸出顯示超界並返回
	{
		printf("point limited\n");
		return;
	}
	*(plcd+800*y+x)=color;//對應點進行賦值,顯示對應顏色
}

2.對全屏進行顏色刷新爲指定顏色

void lcd_clean(int color)		//填充指定顏色
{
	int x,y;
	for(y=0;y<480;y++)
	{
		for(x=0;x<800;x++)
		{
			lcd_draw_point(x,y,color);在全屏像素點逐個調用寫像素點函數,顯示指定顏色
		}
	}
}

3.對圖片讀取寫入到屏幕文件顯示出來,及顯示動效

void draw_pic(struct node * Q)//畫圖片
{
	xg++;//xg爲圖片顯示動畫效果,在這裏設定3種效果,通過xg自加再對3求餘對應各個效果
	printf("\n\n%s\n\n",Q->picname);
	fd_bmp=open(Q->picname,O_RDWR);//打開圖片文件,Q->picname爲鏈表元素值,圖片名
	if(fd_bmp == -1)//打開屏幕失敗的返回值是-1
	{
		printf("open bmp  error\n");
		return ;
	}
	char buf[800*450*3+54];//對應圖片文件字節數
	read(fd_bmp, buf, 800*450*3+54);//圖片的顏色讀入到buf數組
	close(fd_bmp);//關閉圖片文件
	char b,g,r;
	int color,i,x,y;
	if(xg%3==0)//打印效果1,效果原理爲按部分顯示,將圖片分爲幾個部分逐步顯示出來,爲突出動態效果,每個顯示段中間使用暫停。
	{
		i = 0;
		for(y=50;y>=0;y--)
		{
			for(x=0;x<800;x++)
			{
				b = buf[54+i];
				g = buf[55+i];
				r = buf[56+i];
				color = (r<<16) | (g<<8) | b;
				lcd_draw_point(x,y,color);//一個個顯示顏色
				i+=3;
			}
		}
		…………
		usleep(200);//暫停一會,毫秒級別
		i = 0;
		for(y=250;y>=0;y--)
		{
			for(x=0;x<800;x++)
			{
				b = buf[54+i];
				g = buf[55+i];
				r = buf[56+i];
				color = (r<<16) | (g<<8) | b;
				lcd_draw_point(x,y,color);
				i+=3;
			}
		}
		usleep(200);
	}
}

4.根據手指滑動返回的參數控制鏈表順序並將傳入draw_pic()子程序顯示相應的圖片

int touch(int f)//傳遞觸摸方向的值和鏈表
{
	struct node * U;
	U=L;
	if(f==1)
	{
		fd_lcd=open("/dev/fb0",O_RDWR);//打開屏幕文件
	if(fd_lcd= = -1)//打開失敗返回-1
	{
		printf("open fd_lcd error\n");
		return -1;
	}
	plcd=mmap(NULL,800*480*4,PROT_WRITE | PROT_READ, MAP_SHARED,fd_lcd,0);//把文件或設備映射到內存中,操作內存的數據就相當於操作屏幕
	if(plcd == MAP_FAILED)
		{
			printf("mmap failed\n");
			return -1;
		}
	printf("mmap success\n");
		printf("shun xu \n");
		L=U->next;
		draw_pic(L);	
		printf("shun xu \n");
	munmap(plcd,800*480*4);
	close(fd_lcd);
	return 1;
	}
		
	if(f==2)
	{
		fd_lcd=open("/dev/fb0",O_RDWR);//打開屏幕文件
		if(fd_lcd==-1)
		{
			printf("open fd_lcd error\n");
			return -1;
		}
		plcd=mmap(NULL,800*480*4,PROT_WRITE | PROT_READ, MAP_SHARED,fd_lcd,0);
		if(plcd == MAP_FAILED)
			{
				printf("mmap failed\n");
				return -1;
			}
		printf("mmap success\n");
			printf("ni xu \n");
			L=U->pre;
			draw_pic(L);
			printf("ni xu \n");
		munmap(plcd,800*480*4);
		close(fd_lcd);
		return 1;
	}
}

附:設計報告、 源代碼

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章