文件I/O第三天練習
練習:設計程序,實現在開發板的LCD 屏幕顯示三種顏色,拓展:在開發板的LCD 上畫一個圓
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
// 1. 打開LCD設備文件
int lcd_fd = open("/dev/fb0", O_RDWR); // 修正設備路徑為/dev/fb0
if (-1 == lcd_fd) {
perror("open lcd error"); // 使用perror輸出更詳細的錯誤信息
exit(1);
}
// 2. 準備顏色數據并寫入LCD
int colorbuf[800*480] = {0}; // 800x480分辨率,每個像素4字節
// 分段填充顏色
int i = 0;
for (; i < 800*160; ++i) { // 頂部160行黑色
colorbuf[i] = 0x00000000;
}
for (; i < 800*320; ++i) { // 中間160行紅色
colorbuf[i] = 0x00FF0000;
}
for (; i < 800*480; ++i) { // 底部160行黃色
colorbuf[i] = 0x00FFFF00;
}
// 寫入LCD設備
ssize_t ret = write(lcd_fd, colorbuf, 800*480*4);
if (ret == -1) {
perror("write to LCD failed");
close(lcd_fd);
exit(1);
}
// 3. 關閉LCD設備
close(lcd_fd);
return 0;
}
在開發板的LCD 上畫一個圓
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdlib.h>
#define WIDTH 800 // 屏幕寬度
#define HEIGHT 480 // 屏幕高度
#define CENTER_X 400 // 圓心X坐標
#define CENTER_Y 240 // 圓心Y坐標
#define RADIUS 10 // 圓半徑
int main() {
// 1. 打開FrameBuffer設備
int fb_fd = open("/dev/fb0", O_RDWR);
if (fb_fd == -1) {
perror("Failed to open framebuffer");
return 1;
}
// 2. 映射幀緩沖內存
unsigned int *fb_map = mmap(NULL, WIDTH*HEIGHT*4, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);
if (fb_map == MAP_FAILED) {
perror("Failed to mmap framebuffer");
close(fb_fd);
return 1;
}
// 3. 繪制圓形(紅色)
for (int y = CENTER_Y - RADIUS; y <= CENTER_Y + RADIUS; y++) {
for (int x = CENTER_X - RADIUS; x <= CENTER_X + RADIUS; x++) {
// 檢查像素是否在圓內(圓方程:(x-a)2 + (y-b)2 ≤ r2)
if ((x - CENTER_X)*(x - CENTER_X) + (y - CENTER_Y)*(y - CENTER_Y) <= RADIUS*RADIUS) {
// 確保坐標在屏幕范圍內
if (x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT) {
fb_map[y * WIDTH + x] = 0x00FF0000; // ARGB格式的紅色
}
}
}
}
// 4. 解除映射并關閉設備
munmap(fb_map, WIDTH*HEIGHT*4);
close(fb_fd);
return 0;
}
練習:設計程序,利用ioctl 函數獲取LCD 的硬件參數,把LCD 屏幕的寬和高以及色深的位數輸出到屏幕,下載程序到開發板并進行驗證。提示:必須包含該頭文件<linux/fb.h> !!!!
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <linux/fb.h>
int main(int argc, char const *argv[])
{
//1.打開LCD
int lcd_fd = open("/dev/fbb",0_RDWR);
//2.利用ioctl函數獲取LCD硬件參數
struct fb_var_screeninfo lcd_vinfo;
ioctl(lcd_fd,FBIOGET_VSCREENINFO,&led_vinfo);
//3.輸出LCD的寬、高
printf("led_height = %d\n", lcd_vinfo.vres); //480
printf("led width = %d\n", lcd_vinfo.xres); //800
return 0;
}

浙公網安備 33010602011771號