文件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)² + (y-b)² ≤ r²)
            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;
}
posted @ 2025-07-26 08:57  九思0404  阅读(8)  评论(0)    收藏  举报