LCD-liquidcrystal display
的简称,液晶显示器按驱动方式分为1.静态驱动、2.简单矩阵驱动及3.主动矩阵驱动。
其中,简单矩阵又可分为1.扭转向列型(TN)和超转向列型(STN)两种,而主动矩阵驱动则以TFT为主。
TN与STN都采用场电压驱动方式,如果显示尺寸加大,中心部分对电机变化的反应时间就会变长,显示器的速度跟不上。为解决这个问题,主动矩阵驱动TFT被提出,他通过晶体管显示信号开启过关闭液晶分子的电压,从而避免了显示器对电场效应的依靠。
LCD一块屏显示图像不但需要LCD驱动器,还需要LCD控制器。很多主芯片cpu集成了LCD控制器。
依据显示原理:作为帧同步信号的vsync,每发出一个脉冲,都意味着新的一幅图像数据开始传送。而作为行同步信号的hsync,没发出一个脉冲,都表明新的一行图像资料开始发送。
LCD时序图
所有LCD显示图像的原理都是从上到下,从左到右的。一幅图像可以看做是一个矩形,由很多排列整齐的像素点一行一行组成,这些点称为像素。
VCLK:像素时钟信号
没发出一个脉冲信号,表示新的一个点图像数据开始传送。
LEND:行结束信号
帧缓冲
FrameBuffer从本质上讲是图形设备的硬件抽象。对开发者而言,FrameBuffer是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。通过不断的向framebuffer中写入数据,显示控制器就自动的从frame
buffer中取数据并显示出来。
嵌入式中从内存中分一部分出来作为显存;所以frame buffer的实质就是显存;
帧缓冲设备
帧缓冲设备时非常典型的字符设备。帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到/dev/fb31,而/dev/fb0则为当前缺省的帧缓冲设备,通常指向/dev/fb0。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31.
实验内容:
1.清除LCD
使用命令:ddif=/dev/zero of=/dev/fb0 bs=240 count=320
(dd是用来拷贝文件的if(infile)of
(outfile) bs :block size count:)
Bs=240
即,一个块为240个字节;count=320有320个块
2.运行应用程序,画图
./LCD
3.清除LCD
使用命令:ddif=/dev/zero of=/dev/fb0 bs=240 count=320
1.显示图片
2.cat
xx.bmp > /dev/fb0
总结:通过frame buffer我们可以去操作LCD的显示图像,即LCD显示图像来源于frame
buffer,而/dev/fb0又是frame
buffer的设备文件,所以操作/dev/fb0即是操作frame
buffer
平台设备分类方法是:总线;
字符设备分类方法:功能
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
int main () {
int fp=0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long screensize=0;
char *fbp = 0;
int x = 0, y = 0;
long location = 0;
fp = open ("/dev/fb0",O_RDWR);//打开frame buffer设备文件
if (fp < 0){
printf("Error : Can not open framebuffer device\n");
exit(1);
}
if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){ //获取LCD的一些配置参数
printf("Error reading fixed information\n");
exit(2);
}
if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
printf("Error reading variable information\n");
exit(3);
}
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; //单帧画面空间
/*这就是把fp所指的文件中从开始到screensize大小的内容给映射出来,得到一个指向这块空间的指针*/
fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);//把显存映射到进程空间中来,fbp为映射地址
if ((int) fbp == -1)
{
printf ("Error: failed to map framebuffer device to memory.\n");
exit (4);
}
/*这是你想画的点的位置坐标,(0,0)点在屏幕左上角*/
//画矩形
for(x=100;x<150;x++)
{
for(y=100;y<150;y++)
{
location = x * (vinfo.bits_per_pixel / 8) + y * finfo.line_length;
*(fbp + location) = 255; /* 蓝色的色深 */ /*直接赋值来改变屏幕上某点的颜色*/
*(fbp + location + 1) = 0; /* 绿色的色深*/ /*注明:这几个赋值是针对每像素四字节来设置的,如果针对每像素2字节,*/
*(fbp + location + 2) = 0; /* 红色的色深*/ /*比如RGB565,则需要进行转化*/
*(fbp + location + 3) = 0; /* 是否透明*/
}
}
munmap (fbp, screensize); /*解除映射*/
close (fp); /*关闭文件*/
return 0;
}
分享到:
相关推荐
mini2440开发板,裸机程序,包括开发板上的资源,学习嵌入式资料
最简单的 arm9裸机驱动按键的程序,初学者极易看懂。
ARM9 单个实验\ARM9_裸机lcd显示实验 用MDK编译通过,LCD显示实验 ,裸机提高篇
ARM2440-裸机实验教程ARM2440-裸机实验教程ARM2440-裸机实验教程ARM2440-裸机实验教程ARM2440-裸机实验教程
最简单的 arm9裸机定时器的程序,初学者极易看懂。
最简单的 arm9裸机驱动按键的程序,初学者极易看懂。
这是用arm-linux-gcc编译的ucosii的mini2440版本,正确的现象就是串口终端交叉的输出hello world 和my friend,同时led闪烁。
本人整理的mini2440开发板,linux移植笔记,适合初学者,物有所值 主要包括: ubuntu8-10环境建立ARM-Linux交叉编译环境.doc u-boot2008.10非nand_leagcy移植mini2440,支持yaffs,附源码.doc 移植Linux2.6.27.7到s3...
裸机代码。mini2440液晶显示裸机代码
本程序经过测试 ,在 mini2440 开发板 上 需要注意 用ads 做 arm920t 的开发 需要 做一些配置 ,特别是一个 初始化文件叫 init.o
arm 裸机 jz2440 arm 裸机 jz2440 arm 裸机 jz2440 arm 裸机 jz2440
TQ2440arm9裸机程序keil版
这个一个简单的用arm-linux-gcc编译的运行在mini2440上的裸机程序,移植了u-boot的启动代码。但目前只能用supervivi的D功能下载到内存中运行。程序功能:流水灯
这套程序是我用mini2440在MDK环境下自己写的裸机程序,包括LED,LCD,AD,中断,串口,定时器,触摸屏,希望可以给正在学ARM9的朋友一些帮助。
ARMBoot-1.1.0 在 mini2440 开发板上的移植 之稻草人手记 文章配套源码包3 armboot-org2mini2440.diff:patch补丁包 补丁方法:将原始的armboot程序包armboot-1.1.0.tgz 解开后,将armboot-org2mini2440.diff...
用ADS编译测试通过,裸机ARM软中断测试程序,可以通过uboot下载至NAND里运行,直接下载到SDRAM无法运行(因为没有开启MMU)。 http://blog.csdn.net/forsakening/article/details/9004812这里是我对代码及arm软中断的...
代码包含了arm9 基础部分的程序,只需在linux下简单编译就可以写进芯片
s3c2440 ARM9开发板 裸机例程,花500多购买开发板提供的,保证可用!
qemu mini2440 arm 模拟器 arm9 源代码
mini2440+ARM9开发板用户手册,提供mini2440开发所需要的资料