裸机——LCD
1.先了解显示器们
CRT显示器
原理,使用电子轰击荧光粉实现显示。
特点,主动发光,颜色绚丽,但是大。
等离子显示器(PDP)
原理,在显示屏上排列上千个密封的小低压气体室,通过电流激发使其发出肉眼看不见的紫外光,然后紫外光碰击后面玻璃上的红、绿、蓝3色荧光体发出肉眼能看到的可见光,以此成像。
特点,主动发光,颜色绚丽,可以做很薄,但是耗电。
液晶屏(LCD)
原理,分两部分,一个背光光源,一个液晶盒,使用电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。
特点,被动发光,颜色不够亮,可以做很薄。
OLED
原理,为有机发光二极管。
特点,主动发光,颜色绚丽,可以做很薄很轻,柔性屏。
2. 大致了解下LCD的相关模块

显存,就是DDR上一部分用来专门存放图像信息。
LCD控制器,负责与LCD驱动器进行时序通信。
LCD驱动器,完成图像数字信号转换模拟信号,并输出给LCD面板
LCD面板,按照LCD驱动器给的模拟信号,通过电磁改变液晶分子的运动,从而改变偏振光,从而改变显示的颜色。
由于上面的整个流程都是硬件实现,所以操作LCD就只需要操作显存。
1. 对于LCD从两个层次来学习
(1)计算机中图像的表示方法和对LCD数据传输接口
(2)LCD时序通信和控制器设置,显存设置
2.1. 计算机中图像的表示方法
显示器的基本显像单位是像素,每个像素点只能显示一种颜色,而计算机使用二进制位指示该像素点的显示。
按照使用二进制位的数量,分为 1,8,16,32位色
1位色:只有亮和灭两种。
8位色:比如黑白影片就是8位色表示
16位 :彩色
32位:真彩色,人眼镜能分辨的颜色有限,32位就可以囊括大部分人能识别的颜色。
计算机中颜色的具体表示可以百度查表:
https://baike.baidu.com/item/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E9%A2%9C%E8%89%B2%E7%A0%81/10894232?fr=aladdin
2.3. LCD数据传输接口
LCD数据传输的方式依照使用的传输接口不同而不同。
我这里是 RGB接口,如下

24位数据线,说明支持并行传输
HSYNC、VSYNC、VDEN、VCLK: 为时序信号线。
3.1 LCD的时序和控制器
首先需要知道LCD驱动器是如何将像素点设置颜色的。
LCD驱动器,按照从上到下,从左至右的顺序进行扫描,将像素点颜色设置。

在每次进行扫描时,需要一段等待时间
扫描一行时,当开始需要等待 HSPW 时间
然后再 等待 HBPD 时间
扫描一行使用 HOZVAL
完成后,还需要等待 HFPD 时间,
其中 HOVZAL 与 一行的像素点个数有关
HSPW HBPD HFPD 与LCD设备本身相关。

扫描一列,也有上面的时序要求

具体如下:

这些时序信息,只需要写入LCD控制器,LCD控制器就会按照时序信息与LCD驱动器通信。
3.2 显存
显存本质就是内存,被设置用来专门存放图片信息,也就是像素点信息。
对于显存有几个重要属性
(1)显存的基地址
(2)该显存存储像素点的表示方式
(3)多窗口
(4)虚拟显示
对于多窗口,
每个窗口对应自己的显存,
通过调整窗口之间的关系,在一个物理屏幕上显示。
多窗口的好处是,多物理屏幕上一块空间的刷新,可以只重绘一个窗口,不需要重绘所有像素点。

虚拟显示
对于一个窗口中存放的图片,可以指定部分显示。

4.代码
#include "main.h"
#define GPF0CON (*(volatile unsigned long *)0xE0200120)
#define GPF1CON (*(volatile unsigned long *)0xE0200140)
#define GPF2CON (*(volatile unsigned long *)0xE0200160)
#define GPF3CON (*(volatile unsigned long *)0xE0200180)
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)
#define CLK_SRC1 (*(volatile unsigned long *)0xe0100204)
#define CLK_DIV1 (*(volatile unsigned long *)0xe0100304)
#define DISPLAY_CONTROL (*(volatile unsigned long *)0xe0107008)
#define VIDCON0 (*(volatile unsigned long *)0xF8000000)
#define VIDCON1 (*(volatile unsigned long *)0xF8000004)
#define VIDTCON2 (*(volatile unsigned long *)0xF8000018)
#define WINCON0 (*(volatile unsigned long *)0xF8000020)
#define WINCON2 (*(volatile unsigned long *)0xF8000028)
#define SHADOWCON (*(volatile unsigned long *)0xF8000034)
#define VIDOSD0A (*(volatile unsigned long *)0xF8000040)
#define VIDOSD0B (*(volatile unsigned long *)0xF8000044)
#define VIDOSD0C (*(volatile unsigned long *)0xF8000048)
#define VIDW00ADD0B0 (*(volatile unsigned long *)0xF80000A0)
#define VIDW00ADD1B0 (*(volatile unsigned long *)0xF80000D0)
#define VIDTCON0 (*(volatile unsigned long *)0xF8000010)
#define VIDTCON1 (*(volatile unsigned long *)0xF8000014)
#define HSPW (40) // 1~40 DCLK
#define HFPD (240 - 1) // 16 210 354
#define VSPW (20) // 1~20 DCLK
#define VFPD (30 - 1) // 7 22 147
// FB地址
#define FB_ADDR (0x23000000)
#define ROW (480)
#define COL (800)
#define HOZVAL (COL-1)
#define LINEVAL (ROW-1)
#define XSIZE COL
#define YSIZE ROW
// 初始化LCD
void lcd_init(void)
{
// 配置引脚用于LCD功能
GPF0CON = 0x22222222;
GPF1CON = 0x22222222;
GPF2CON = 0x22222222;
GPF3CON = 0x22222222;
// 打开背光 GPD0_0(PWMTOUT0)
GPD0CON &= ~();
GPD0CON |= (<<); // output mode
GPD0DAT &= ~(<<); // output 0 to enable backlight
// 10: RGB=FIMD I80=FIMD ITU=FIMD
DISPLAY_CONTROL = <<;
// bit[26~28]:使用RGB接口
// bit[18]:RGB 并行
// bit[2]:选择时钟源为HCLK_DSYS=166MHz
VIDCON0 &= ~( (<<)|(<<)|(<<) );
// bit[1]:使能lcd控制器
// bit[0]:当前帧结束后使能lcd控制器
VIDCON0 |= ( (<<)|(<<) );
// bit[6]:选择需要分频
// bit[6~13]:分频系数为5,即VCLK = 166M/(4+1) = 33M,设置实际工作频率为33M,是由于我的LCD驱动器最大工作频率为44M
VIDCON0 |= << | <<;
// H43-HSD043I9W1.pdf(p13) 时序图:VSYNC和HSYNC都是低脉冲
// s5pv210芯片手册(p1207) 时序图:VSYNC和HSYNC都是高脉冲有效,所以需要反转
VIDCON1 |= << | <<;
// 设置时序,可以在LCD的手册中找到
VIDTCON0 = VBPD<< | VFPD<< | VSPW<<;
VIDTCON1 = HBPD<< | HFPD<< | HSPW<<;
// 设置长宽(物理屏幕)
VIDTCON2 = (LINEVAL << ) | (HOZVAL << );
// 设置window0
// bit[0]:使能
// bit[2~5]:24bpp(RGB888)
WINCON0 |= <<;
WINCON0 &= ~();
WINCON0 |= () | (<<);
#define LeftTopX 0
#define LeftTopY 0
#define RightBotX 799
#define RightBotY 479
// 设置window0的上下左右
// 设置的是显存空间的大小
VIDOSD0A = (LeftTopX<<) | (LeftTopY << );
VIDOSD0B = (RightBotX<<) | (RightBotY << );
VIDOSD0C = (LINEVAL + ) * (HOZVAL + );
// 设置显存基地址和大小
VIDW00ADD0B0 = FB_ADDR;
VIDW00ADD1B0 = (((HOZVAL + )* + ) * (LINEVAL + )) & (0xffffff);
// 使能channel 0传输数据
SHADOWCON = 0x1;
}
裸机——LCD的更多相关文章
- 裸机LCD驱动配置
横屏4.3寸LCD为480*272(行:480个像素点 列:272个行) 1.1 LCD原理图 : Pin1:Von 电源正(这里由硬件自动控制) Pin2:VM/VDEN 数据使能 ...
- 实验九--裸机LCD
一.环境 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.说明 有空补上 三.代码 Makefile: CC = arm-linux-gcc LD = arm-linux-ld ...
- s3c2440 lcd 显示图片裸机程序
因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...
- tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一 ...
- ok6410的LCD裸机范例
/****************************************** 实验步骤 1.配置引脚功能,将其GPI.GPJ引脚设置为VD数据输出模式,及GPJ后几位设置成LCD时钟输出: ...
- JZ2440 裸机驱动 第13章 LCD控制器(2)
13.2 TFT LCD显示实例 13.2.1 程序设计 本实例的目的是从串口输出一个菜单,从中选择各种方法进行测试,比如画线. 画圆.显示单色.使用调色板等. 13.2.2代码详解 ...
- JZ2440 裸机驱动 第13章 LCD控制器(1)
本章目标 了解LCD显示器的接口及时序: 掌握S3C2410/S3C2440 LCD控制器的使用方法: 了解帧缓冲区的概念,掌握如何设置帧缓冲区来显示图像: 13.1 LCD和LCD控制器 13.1 ...
- S5PV210的LCD控制器详解
1.FIMD结构框图 (1)Samsung的s5pv210的LCD控制器叫做FIMD(也叫显示控制器).Display controller(显示控制器)包括用于将图像数据从相机接口控制器的本 地总线 ...
- LCD如何显示图像
1.LCD显示主要相关概念 (1)像素(pixel) 整个图像是由一个个的像素组成的,像素就是一个显示点.像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的 ...
随机推荐
- 在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移
我看到很多nopCommerce论坛的用户问他们如何使用Entity Framework(EF)代码优先迁移来自定义nopCommerce,添加新的字段和entites核心.我实际上在做nopComm ...
- spring-cloud构架微服务(1)-全局配置
使用spring-cloud是基于熟悉springboot基础上进行的.本篇介绍全局配置,spring-boot版本就以1.4.0来做吧.项目地址: https://git.oschina.net/b ...
- Unable to copy a file from obj\Debug to bin\Debug
1. Exit the VS2012, and then re-open the solution. 2. Clean the solution and build.
- 类型信息(RTTI和反射)——反射
运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就来说说反射. 重点说说通过反射获取方法以及调用方法,即类方法提取 ...
- 【转】C内存操作函数
一.malloc/calloc 名称: Malloc/calloc 功能: 动态内存分配函数 头文件: #include <stdlib.h> 函数原形: void *malloc(si ...
- 如何将Twitter的内容导入到SAP CRM和C4C
Twitter的内容导入SAP CRM Interaction Center呼叫中心 具体步骤查看我的博客Twitter(also Facebook) is official integrated i ...
- postman 1—官网下载及安装
测试过程中构造批量数据方式: 1 业务只关联数据库单张表,那么可以通过sql插入数据 也可以通过接口构造. 2 业务关联多张数据库表.要在多张表插入数据且保持数据的一致性,此时通过接口批量发送请求构造 ...
- CKEditor4x word导入不保存格式的解决方案
后台上传文档时,目前功能都通过word直接复制黏贴实现,之前和word控件朋友一起测试找个问题,原始代码CK4.X没有找个问题. 第一时间排查config.js的配置发现端倪,测试解决! 由于配合ck ...
- Math.random()随机生成x~y间的数字
JS如何随机产生数字呢?这就用到了Math.random()方法,它能够随机产生0~1间的数字,这个数可能为0,但会小于1. 那么,如果我想要大于等于1小于10之间的随机整数呢?需要分为以下几步: 1 ...
- P3901 【数列找不同】
这个题我们可以使用树状数组做 啥? 树状数组? 那个不是维护前缀和的东西吗? 各位看官,让我慢慢道来. 首先我们可以想到,对于一个询问$ [l,r] \(,只有\)[1,r]$中的数可能对这个询问有影 ...