下面是嵌入式應用開發第二階段,主要介紹基本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個實驗講解一下