Linux 外设驱动 应用 5 LCD 控制实验

LCD 控制实验

  • [1 原理介绍](#1 原理介绍)
  • [1.1 液晶屏](#1.1 液晶屏)
    • [1.2 光源](#1.2 光源)
  • [1.3 硬件接口](#1.3 硬件接口)
  • [2 代码编写](#2 代码编写)
  • [2.1 初始化屏幕](#2.1 初始化屏幕)
    • [2.2 测试亮点](#2.2 测试亮点)
    • [2.3 画水平线](#2.3 画水平线)
    • [2.4 画垂直线](#2.4 画垂直线)
    • [2.5 画正方形](#2.5 画正方形)
  • [3 测试结果](#3 测试结果)
    • [3.1 进入fb显示环境](#3.1 进入fb显示环境)
    • [3.2 运行程序](#3.2 运行程序)

1 原理介绍

1.1 液晶屏

液晶得名于其物理特性:它的分子晶体,以液态存在而非固态。这些晶体分子的液体特性使得它具有两种非常有用的特点:

1)如果让电流通过液晶层,这些分子将会以电流的流向方向进行排列,如果没有电流,它们将会彼此平行排列。

2)如果提供了带有细小沟槽的外层,将液晶倒入后,液晶分子会顺着槽排列,并且内层与外层以同样的方式进行排列。

液晶的第三个特性是很神奇的:液晶层能使光线发生扭转。液晶层表现的有些类似偏光器,这就意味着它能够过滤除了那些从特殊方向射入之外的所有光线。此外,如果液晶层发生了扭转,光线将会随之扭转,以不同的方向从另外一个面中射出。液晶的这些特点使得它可以被用来当作一种开关------即可以阻碍光线,也可以允许光线通过。液晶单元的底层是由细小的脊构成的,这些脊的作用是让分子呈平行排列。上表面也是如此,在这两侧之间的分子平行排列,不过当上下两个表面之间呈一定的角度时,液晶随着两个不同方向的表面进行排列,就会发

生扭曲。结果便是这个扭曲的螺旋层使通过的光线也发生扭曲。如果电流通过液晶,所有的分子将会按照电流的方向进行排列,这样就会消除光线的扭转。

如果将一个偏振滤光器放置在液晶层的上表面,扭转的光线通过(如 A),而没有发生扭转的光线(如 B)将被阻碍。因此可以通过电流的通断改变LCD 中的液晶排列,使光线在加电时射出,而不加电时被阻断。也有某些设计为了省电的需要,有电流时,光线不能通过,没有电流时,光线通过。

LCD 显示器的基本原理就是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。因此,LCD 的驱动控制归于对每个液晶单元的通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。

1.2 光源

LCD 的发光原理是通过控制加电与否来使光线通过或挡住,从而显示图形。光源的提供方式有两种:透射式和反射式。笔记本电脑的 LCD 显示屏即为透射式,屏后面有一个光源,因此外界环境可以不需要光源。而一般微控制器上使用的 LCD 为反射式,需要外界提供光源,靠反射光来工作。电致发光(EL)是液晶屏提供光源的一种方式。电致发光的特点是低功耗,与二极管发光比较而言体积小。

电致发光(EL)是将电能直接转换为光能的一种发光现象。电致发光片是利用此原理经过加工制作而成的一种发光薄片,其特点是:超薄、高亮度、高效率、低功耗、低热量、可弯曲、抗冲击、长寿命、多种颜色选择等。因此,电致发光片被广泛应用于各种领域。

1.3 硬件接口

2 代码编写

2.1 初始化屏幕

c 复制代码
if (fb_Init() == -1)
{
printf("Initialize Framebuffer LCD failed.\n");
exit(1);
}
x_max = fb_GetScreenWidth() - 1;
y_max = fb_GetScreenHeight() - 1;
color_max = fb_GetScreenBpp() - 1;

2.2 测试亮点

c 复制代码
printf("Test PutPixel:\t\t");
for(y = 0; y <= y_max; y += 10)
{
for (x = 0; x <= x_max; x += 10)
{
fb_PutPixel(x, y, color);
}
}
printf("Press any key to continue...\n");
getchar();

2.3 画水平线

c 复制代码
printf("Test DrawLine_H blue:\t");
fb_Clear(SYS_BLACK);
for(y = 0; y <= y_max; y += 10)
{
fb_DrawLine_H(0, x_max, y, color);
}

2.4 画垂直线

c 复制代码
printf("Test DrawLine_V: green\t");
for(x = 0; x <= x_max; x += 10)
{
	fb_DrawLine_V(x, 0, y_max, color);
}

2.5 画正方形

c 复制代码
printf("Test DrawRect:\t\t");
fb_Clear(SYS_BLACK);
for(y = 0; y <= y_max; y += 20)
{
for (x = 0; x <= x_max; x += 20)
{
fb_DrawRect(x, y, x + 10, y + 10, color);
}
}

3 测试结果

3.1 进入fb显示环境

bash 复制代码
# echo 1 > /sys/class/graphics/fb0/rotate

3.2 运行程序

屏幕出现运行的效果

相关推荐
Getgit几秒前
Linux 下查看 DNS 配置信息的常用命令详解
linux·运维·服务器·面试·maven
zhangrelay1 小时前
Linux(ubuntu)如何锁定cpu频率工作在最低能耗模式下
linux·笔记·学习
_OP_CHEN1 小时前
【Linux系统编程】(二十)揭秘 Linux 文件描述符:从底层原理到实战应用,一篇吃透 fd 本质!
linux·后端·操作系统·c/c++·重定向·文件描述符·linux文件
chem41111 小时前
玩客云 边缘AI模型 本地搭建部署 llama.cpp qwen
linux·人工智能·llama
一个平凡而乐于分享的小比特2 小时前
Linux内核中的BogoMIPS详解
linux·bogomips
橘颂TA2 小时前
【Linux 网络】TCP 拥塞控制与异常处理:从原理到实践的深度剖析
linux·运维·网络·tcp/ip·算法·职场和发展·结构与算法
zbguolei2 小时前
CentOS 7.6离线安装Nginx
linux·nginx·centos
苏宸啊2 小时前
Linux开发工具(二)
linux
Linux技术芯3 小时前
黄益平《金融的价值》解码:从浙金中心风暴看金融风险识别与普通人理财生存指南
linux
2401_873587823 小时前
Linux——应用层协议定制
linux·运维·网络协议