一、LCD屏应用
Linux下一切皆文件,我们的LCD屏再系统中也是一个文件,设备文件:/dev/fb0。
如果要在LCD屏显示数据,那我们就可以把数据写入LCD屏的设备文件。
1.显示颜色块
LCD屏分辨:800*480 像素 32位:说明一个像素点占4个字节,ARGB A:透明度 R:红 G:绿 B:蓝
在LCD屏上显示一种颜色,代码实现步骤:
1、打开LCD屏设备文件
2、准备颜色数据
3、写入数据
4、关闭文件
练习1:再LCD屏显示一种颜色
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
//打开LCD屏
int lcd_fd = open("/dev/fb0", O_RDWR);
if (lcd_fd == -1) {
perror("open lcd failed!\n");
return -1;
}
//写颜色数据到fb0
int red = 0x00ff0000;
int green = 0x0000ff00;
int n;
for(n=0; n<800*480; n++)
{
write(lcd_fd, &red, 4);
}
//关闭文件
close(lcd_fd);
return 0;
}
练习2:显示俄国的国旗(横屏显示)
练习3:显示法国的国旗(竖屏显示)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int fd_lcd;
int lcd_buf[800*480]; //显存。int -- 4B
int j,i;
fd_lcd = open("/dev/fb0", O_WRONLY);
if(fd_lcd == -1)
{
perror("open lcd");
return -1;
}
printf("fd_lcd = %d\n", fd_lcd);
for(j=0;j<480;j++)//蓝296,白240,红264
{
for(i=0;i<296;i++) lcd_buf[j*800+i]=0x000000FF;
for(i=296;i<536;i++) lcd_buf[j*800+i]=0x00FFFFFF;
for(i=536;i<800;i++) lcd_buf[j*800+i]=0x00FF0000;
}
write(fd_lcd,lcd_buf,sizeof(lcd_buf));
close(fd_lcd);
return 0;
}
思考:如何显示圆球
3、显示圆球
圆的方程式:(x-x0)*(x-x0) + (y-y0)*(y-y0) = r*r
其中(x0,y0)是圆心坐标,r是半径
x0=400,y0=240,r=100
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
//打开LCD屏
int lcd_fd = open("/dev/fb0", O_RDWR);
if (lcd_fd == -1) {
perror("open lcd failed!\n");
return -1;
}
//写颜色数据到fb0
int red = 0x00ff0000;
int green = 0x0000ff00;
int blue = 0x000000ff;
int x,y;
int x0 = 400,y0 = 240,r = 100;
for(y=0; y<480; y++)
{
for(x=0; x<800; x++)
{
if((x-x0)*(x-x0) + (y-y0)*(y-y0) <= r*r)
{
write(lcd_fd, &blue, 4);
}
else
{
write(lcd_fd, &red, 4);
}
}
}
//关闭文件
close(lcd_fd);
return 0;
}
练习4:再LCD屏显示一个圆球
练习5:在LCD屏显示一个彩虹
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <error.h>
#include <unistd.h>
#include <sys/mman.h>
int lcd_fd = -1; //帧缓冲文件描述符
int * plcd = NULL;//帧缓冲设备
//屏幕初始化
void CH_init()
{
int fd = open("/dev/fb0",O_RDWR);
if(fd==-1)
{
perror("open pingmv shibai");
}
lcd_fd = fd;
plcd = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//映射到屏幕
}
//画点函数
void huadian(int x0, int y0, int color)
{
if (x0 >= 0 && x0 < 480&&y0 >= 0 && y0 < 800 )
{
*(plcd + x0 * 800 + y0) = color;
}
}
//白屏
void chushihua()
{
int color = 0xffffffff;
for(int i = 0;i<480;i++)
{
for(int j = 0;j<800;j++)
{
huadian(i,j,color);
}
}
}
//画圆函数
void huayuan()
{
int color[800*480]={0};
for(int i=0;i<480;i++)
{
for(int j=0;j<800;j++)
{
if((i-480)*(i-480)+(j-400)*(j-400)>122500 && (i-480)*(i-480)+(j-400)*(j-400)<160000)
{
huadian(i,j,0x0F0FFaa0);
}
if((i-480)*(i-480)+(j-400)*(j-400)>90000 && (i-480)*(i-480)+(j-400)*(j-400)<122500)
{
huadian(i,j,0x0F0F0F00);
}
if((i-480)*(i-480)+(j-400)*(j-400)>62500 && (i-480)*(i-480)+(j-400)*(j-400)<90000)
{
huadian(i,j,0x0F0FFFF0);
}
}
}
}
//关闭屏幕
void guanbi_init()
{
munmap(plcd,800*480*4);
plcd = NULL;
close(lcd_fd);
}
int main()
{
CH_init();
chushihua();
huayuan();
guanbi_init();
}
练习6:在LCD屏显示一个太极图
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <sys/mman.h>
#include<unistd.h>
#include<math.h>
int *plcd = NULL;
#define WHITE 0x00FFFFFF
#define BLAK 0x00000000
void draw_point(int x, int y, int color)
{
if (x >= 0 && x<800 && y >= 0 && y<480)
{
*(plcd + y * 800 + x) = color;
}
}
void draw_circle(int x, int y,double r ,int color)
{
if (x >= 0 && x<480 && y >= 0 && y<800)
{
for (double i = 0; i < 480; i++)
{
for (double j = 0; j < 800; j++)
{
double all=(i-x)*(i-x)+(j-y)*(j-y);
double fc=sqrt(all);
if(r>fc)
{
draw_point(j, i, color);
// printf("fc=%lf\n",fc);
}
}
}
}
}
void draw_circle_b(int x, int y,double r ,int color)
{
if (x >= 0 && x<480 && y >= 0 && y<800)
{
for (double i = 0; i < 480; i++)
{
for (double j = 0; j < 800; j++)
{
if(i<x){
double all=(i-x)*(i-x)+(j-y)*(j-y);
double fc=sqrt(all);
if(r>fc)
{
draw_point(j, i, color);
// printf("fc=%lf\n",fc);
}
}
}
}
}
}
void clear(int color)
{
int x,y;
for(y=0;y<480;y++)
{
for(x=0;x<800;x++)
{
draw_point(x,y,color);
}
}
}
int main()
{
int lcd_fd = open("/dev/fb0",O_RDWR);
if (lcd_fd == -1)
{
perror("open lcd fail");
}
plcd = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED,lcd_fd,0);
if (plcd==NULL)
{
perror("mmao fail");
}
int color = 0x0000FFFF;
clear(0x00666666);
draw_circle(240, 400,200, BLAK);
draw_circle_b(240, 400,200, WHITE);
draw_circle(240, 300,100, WHITE);
draw_circle(240, 500,100, BLAK);
draw_circle(240, 300,25, BLAK);
draw_circle(240, 500,25, WHITE);
// draw_circle(240, 400,50, color);
close(lcd_fd);
munmap(plcd,800*480*4);
return 0;
}
回去准备图片
bmp格式,分辨率800*480,24位,1.09M