天天看點

嵌入式應用開發第二階段

下面是嵌入式應用開發第二階段,主要介紹基本IO操作,如何使用開發闆的液晶屏,如何在LCD上顯示圖像,碰撞球實驗,BMP顯示

本文使用的是7寸800*480的液晶屏,每個像素點有4個位元組,0x 00 FF FF FF,第一個位元組保留,後3個位元組分别代表紅色,綠色,藍色

一、LCD 基本概念

LCD 的構造主要是在玻璃基闆當中放置液晶膜,基闆玻璃上設定TFT(薄膜半導體),

在其之上還有彩色濾光片,通過TFT 玻璃上的信号與電壓改變來控制液晶分子的轉動方向,

進而達到控制每個像素點偏振光出射與否而達到顯示目的。

1.1、像素

像素又稱畫素,為圖像顯示的基本機關。每個像素可有各自的顔色值,可采三原色顯示,因

而又分成紅、綠、藍三種子像素

1.2、分辨率

圖像效果最重要的名額系數之一是分辨率,分辨率是指機關面積顯示像素的數量,在日

常用語中之分辨率多用于圖像的清晰度。分辨率越高代表圖像品質越好,越能表現出更多的

細節;但相對的,因為紀錄的資訊越多,檔案也就會越大。

1.3色彩深度

一個像素所能表達的不同顔色數取決于比特每像素(BPP,bit per pixel)。這個最大數

可以通過取2 的色彩深度次幂來得到。例如,常見的取值有:

8 bpp:256 色,亦稱為“8 位色”。

16 bpp:216=65536 色,稱為高彩色,亦稱為“16 位色”。

24 bpp:224=16777216 色,稱為真彩色,通常的記法為“1670 萬色”,亦稱為“24位色”。

32 bpp:224 +28,計算機領域較常見的32 位色并不是表示232 種顔色,而是在24

位色基礎上增加了8 位(28=256 級)的灰階(亦稱“灰階”,有時亦被實作為alpha 透明

度),是以32 位色的色彩總數和24 位色是相同的,32 位色也稱為真彩色、或全彩色。

對于超過8 位的深度,這些數位就是三個分量(紅綠藍)的各自的數位的總和。一個

16 位的深度通常分為5 位紅色和5 位藍色,6 位綠色(眼睛對于綠色更為敏感)。24 位的

深度一般是每個分量8 位。而32 位的顔色深度也是常見的:這意味着24 位的像素有8 位

額外的數位來描述透明度。

1.4記憶體映射

讀者隻需知道有一種叫做幀緩沖機制的東西,使得核心可以将顯示卡硬體抽象成一塊可以直接操作的記憶體,将螢幕映射到使用者空間的虛拟記憶體上,這樣,我們就可以在應用程式直接寫屏了

二、檔案基本IO操作

1. open函數說明

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

原型:

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

功能:以指定的方式打開指定的檔案

參數:pathname 檔案名,可以相對路徑或絕對路徑

/ 開始的是絕對路徑 ,否則就是相對路徑

flags: 打開方式 ,常用: O_RDONLY, O_WRONLY, O_RDWR ,O_CREAT.

O_RDONLY 隻讀

O_WRONLY 隻寫

O_RDWR 讀寫

O_CREAT 當檔案不存在可以建立新檔案

傳回:

>0 成功,含義是檔案描述符,通過這個傳回值可以讀寫操作檔案

-1 失敗

2. read 函數

頭檔案:

#include <unistd.h>

原型:

ssize_t read(int fd, void *buf, size_t count);

功能:從 fd 指向的檔案中讀取 最多 conut 個資料,存放到buf指向緩沖區中

參數:

fd : 就是使用open函數打開後得到的傳回值。

buf : 存儲讀取到的結果

count :要讀取位元組數量

傳回:>=0 成功,值是讀取到的位元組數量,0表示已經到檔案末尾了。

-1 失敗

3. write函數

頭檔案:

#include <unistd.h>

原型:ssize_t write(int fd, const void *buf, size_t count);

功能:把buf指向的緩沖資料寫入到fd指向的檔案中,最多寫入 count 個

參數:

fd : 就是使用open函數打開後得到的傳回值。

buf : 資料源指針,存放等待寫入的資料

count :要寫入位元組數量

傳回:>=0 成功,值是寫入的位元組數量,0表示已經什麼都沒有做。

-1 失敗

4. 移動檔案讀寫位置(光标)

#include <sys/types.h>

#include <unistd.h>

原型:off_t lseek(int fd, off_t offset, int whence);

功能:重新定位檔案的讀寫位置。根據 whence 來使用 offset 對檔案讀寫位置進行調整。

參數:fd 就是使用open函數打開後得到的傳回值。

offset:要調整的偏移量,但是不是最終的檔案讀寫偏移位置,如何使用和 whence 有頭

whence:調整方式 ,可取值:

SEEK_SET 以檔案開頭為參考點,最終的讀寫是 offset 參數值

SEEK_CUR 以目前讀寫位置參考點,最終的讀寫位置是 【目前讀寫位置+offset】

SEEK_END 以檔案結尾為參考點,最終的讀寫位置是 【檔案大小+offset】

傳回:>=0 成功,調整後的檔案的讀寫位置

-1 失敗

三、LCD初始化

LCD 顯示器一般對應的裝置節點檔案是/dev/fb0,當然如果系統有多個顯示裝置的話,

還可能有/dev/fb1、/deb/fb2 等,這些檔案是讀寫顯示裝置的入口

1,打開液晶屏

int lcd = open("/dev/fb0", O_RDWR);

if(lcd == -1)

{

perror("打開 /dev/fb0 失敗");

exit(0);

}

2,映射一塊恰當大小的記憶體

char *p = mmap(NULL, 800*480*4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd, 0);

if(p == MAP_FAILED)

{

perror("映射記憶體失敗");

exit(0);

}

四、實戰

LCD的顯示原理和基本IO操作講完了,下面進行實戰練習

實驗一:液晶屏顯示德國國旗

實驗二:液晶屏顯示一個圓

實驗三:碰撞球

實驗四:BMP圖檔顯示

今天先到這裡,後續會将4個實驗講解一下