文件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;
}

浙公网安备 33010602011771号