模拟智能家居项目
基本原理
-
流程
-
开发板 gec6818的开发板是一种arm板(是一个高级单片机) 芯片采用的是三星公司生产的S5P6818 采用的内核是cortexA53 本次我们采用的是模拟开发板 将模拟开发板的文件放到共享目录 然后根据文件里面的文档操作即可
-
显示屏的原理 开发板屏幕是由800480个像素点组成,那么分辨率是800480 每个像素点是占32bit,由a r g b 组成,各占8bit a 透明度 r 红色 g 绿色 b 蓝色
-
量化 8bit 0x00 ~ 0xff 0~255 由浅到深 就是把这个颜色分层次 分等级 通过控制数值的大小来控制颜色的深浅
-
帧缓冲 帧缓冲设备也是文件,对应的文件位置/dev/ubuntu_lcd
-
一切皆文件 就是在linux下,一切皆文件
-
linux系统下提供了对文件操作的API函数
1.open函数 头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 函数原型 int open(const char *pathname, int flags); 函数的功能 用来打开一个文件的 函数的参数 const char *pathname //带路径的文件名(相对路径,绝对路径) int flags //以何种方式打开这个文件 O_RDONLY //以只读的方式打开 O_WRONLY //以只写的方式打开 O_RDWR //以可读可写的方式打开 函数的返回值 成功:返回一个文件描述符(>= 0) 非负数,文件描述符就可以理解为那个文件。 失败:返回-1 2.write函数 头文件 #include <unistd.h> 函数原型 ssize_t write(int fd, const void *buf, size_t count); 函数的功能 将buf指向的内存区域的count个字节数的数据写入到fd(文件描述符)所代表的文件中去 函数的参数 int fd //你要写入到那个文件的文件描述符 const void *buf //你要写入到文件中去的数据的数据区域的首地址 size_t count //你要写入到文件中去的字节数 函数的返回值 成功:返回写入的字节数 失败:返回-1 3.close函数 函数原型 int close(int fd); 函数参数 int fd //填你要关闭的那个文件的文件描述符 返回值: 成功:返回0 失败:返回-1 4.lseek函数 头文件 #include <sys/types.h> #include <unistd.h> 函数原型 off_t lseek(int fd, off_t offset, int whence); 函数功能 用来定位一个已经打开的文件的光标位置 函数的参数 int fd //你要进行光标定位的文件 off_t offset //就是你要偏移的字节数但是必须要集合第三个参数使用 int whence //你从文件的哪个位置开始偏移 SEEK_SET //从文件的头开始偏移 SEEK_CUR //从文件的当前位置开始偏移 SEEK_END //从文件的末尾开始偏移 返回值 成功:返回从头开始偏移的字节数即光标位置(距离文件的头的字节数) 失败: 返回-1让屏幕显示大红色
-
实现任务
-
让屏幕显示大红色
-
实现步骤如下:
-
打开帧缓冲设备文件
-
定义一个800480个int的存储空间,将800480个大红色的颜色值存到这个定义的空间里面
-
将这个存储颜色值的空间里面的颜色值写到帧缓冲文件中去
-
关闭帧缓冲文件
-
-
让屏幕7种颜色循环显示
- 需要用到的函数 sleep
实现代码
-
p1
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { // 1.打开帧缓冲设备文件 int lcd_fd = open("/dev/ubuntu_lcd",O_RDWR); if(lcd_fd < 0) { printf("open lcd_fd error\n"); } // 2.定义一个800*480个int的存储空间,将800*480个大红色的颜色值存到这个定义的空间里面去 int buf[480][800] = {0}; int i,j; for(i = 0; i < 480; i++) //行 { for(j = 0; j < 800; j++) //列 { buf[i][j] = 0x00FF0000; } } // 3.将这个存储颜色值的空间里面的颜色值写到帧缓冲文件中去 int ret = write(lcd_fd,buf,800*480*4); if(ret < 800*480*4) { perror("write lcd_fd error\n"); } // 4.关闭帧缓冲文件 int value = close(lcd_fd); if(value == -1) { printf("close lcd_fd error\n"); } return 0; }
-
p2
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { // 1.定义一个800*480个int的存储空间,将800*480个你要显示的颜色值存到这个定义的空间里面去 int buf[480][800] = {0}; int color[7] = {0x00FF0000,0x00FFFF00,0x00FF00FF,0x0000FFFF,0x00FFFFFF,0x00000000,0x0000FF00}; int i,j,num; for(num = 0; num < 7; num++) //代表要显示的颜色值 { for(i = 0; i < 480; i++) //行 { for(j = 0; j < 800; j++) //列 { buf[i][j] = color[num]; } } // 2.打开帧缓冲设备文件 int lcd_fd = open("/dev/ubuntu_lcd",O_RDWR); if(lcd_fd < 0) { printf("open lcd_fd error\n"); } // 3.将这个存储颜色值的空间里面的颜色值写到帧缓冲文件中去 int ret = write(lcd_fd,buf,800*480*4); if(ret < 800*480*4) { printf("write lcd_fd error\n"); } // 4.关闭帧缓冲文件 int value = close(lcd_fd); if(value == -1) { printf("close lcd_fd error\n"); } sleep(2); } return 0; }