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的更多相关文章

  1. 裸机LCD驱动配置

    横屏4.3寸LCD为480*272(行:480个像素点        列:272个行) 1.1  LCD原理图 : Pin1:Von  电源正(这里由硬件自动控制) Pin2:VM/VDEN 数据使能 ...

  2. 实验九--裸机LCD

    一.环境 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.说明 有空补上 三.代码 Makefile: CC = arm-linux-gcc LD = arm-linux-ld ...

  3. s3c2440 lcd 显示图片裸机程序

    因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...

  4. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  5. ok6410的LCD裸机范例

    /****************************************** 实验步骤 1.配置引脚功能,将其GPI.GPJ引脚设置为VD数据输出模式,及GPJ后几位设置成LCD时钟输出: ...

  6. JZ2440 裸机驱动 第13章 LCD控制器(2)

    13.2 TFT LCD显示实例 13.2.1 程序设计     本实例的目的是从串口输出一个菜单,从中选择各种方法进行测试,比如画线. 画圆.显示单色.使用调色板等. 13.2.2代码详解     ...

  7. JZ2440 裸机驱动 第13章 LCD控制器(1)

    本章目标  了解LCD显示器的接口及时序: 掌握S3C2410/S3C2440 LCD控制器的使用方法: 了解帧缓冲区的概念,掌握如何设置帧缓冲区来显示图像: 13.1 LCD和LCD控制器 13.1 ...

  8. S5PV210的LCD控制器详解

    1.FIMD结构框图 (1)Samsung的s5pv210的LCD控制器叫做FIMD(也叫显示控制器).Display controller(显示控制器)包括用于将图像数据从相机接口控制器的本 地总线 ...

  9. LCD如何显示图像

    1.LCD显示主要相关概念 (1)像素(pixel) 整个图像是由一个个的像素组成的,像素就是一个显示点.像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的 ...

随机推荐

  1. Python的历史与基本知识入门

    一.Python简介 1.1989年由"龟叔"Guido van Rossum在圣诞节期间打发无聊时间编写. 2.Python是一门弱类型解释性语言. 3.优点:代码简洁,明确,优 ...

  2. (生产)axios - 请求接口

    参考:https://www.awesomes.cn/repo/mzabriskie/axios axios 介绍 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中 ...

  3. ListView中CheckBox错乱解决

    思路: ListView在复用的时候会出现很多问题,CheckBox状态会出现错乱,解决思路: 1.使用Map集合的键值对的形式来存放position位置上CheckBox的状态 2.监听CheckB ...

  4. Struts2_使用token拦截器控制重复提交(很少用)

    控制重复提交的方式:1.表单提交后页面重定向:2.Struts2.x token拦截器 大致流程: 例子: index.jsp <%@ page language="java" ...

  5. JavaScript基础:逻辑运算符——&&和||(短路判断)和!

    一.&&:所有条件都为true,返回true:只要有一个是false,返回false:不一定返回boolean类型值 1.可以操作任意类型的数据,不只是布尔型:(除了null.unde ...

  6. centos命令行常用操作

    1.查看某个端口占用 lsof -i tcp:80 2.查看是否安装了防火墙 service iptables status 查看是否启用防火墙/etc/init.d/iptables status ...

  7. 西门子 SINAMICS S120 Web server 用户名和默认密码

    sinamics web server可以通过浏览器查看驱动器故障等信息,是一个比较方便的辅助工具. 1. 一般用户 SINAMICS 密码 无 2. 管理员 Administrator 密码 Adm ...

  8. 初学React:定义一个组件

    接着聊React,今天说说如何创建一个组件类. <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. POJ-2395 Out of Hay---MST最大边

    题目链接: https://vjudge.net/problem/POJ-2395 题目大意: 求MST中的最大边,和POJ-2495类似 思路: 模板直接过 #include<iostream ...

  10. POJ-2376 Cleaning Shifts---区间覆盖&贪心

    题目链接: https://vjudge.net/problem/POJ-2376 题目大意: farmer John要安排他的牛清理牛棚,一共有T个牛棚要清理,每头牛可以清理相邻的牛棚.比如,一头牛 ...