1.
硬件体系架构
1. LCD
硬件体系
1.1
液晶
液晶属于一种有机化合物,分子形状为长棒状,在不同的电流作用下,分子会做有规律的旋转,这样对光线(背光灯产生)产生了一定的控制,形成一个像素,而很多像素又可构成完整图象。
1.2 LCD~
液晶屏
LCD是Liquid Crystal Display的简称。液晶显示器按驱动方式可分为
STN,GF,TFT等种类,其中TFT屏在嵌入式开发中经常使用。
1.3 LCD
驱动芯片
LCD驱动芯片是控制液晶分子发生变化的模块,
它为液晶分子
的偏转提供电压。通常情况下,LCD驱动芯片都与液晶屏面板做到一个电路板上。
1.4 LCD
控制器
液晶要能正确的显示图像,除了要有LCD驱动芯片,还要有LCD控制器来给LCD驱动芯片提供必要的数据和控制信号.多数ARM处理器内部都集成有LCD控制器。
拥有四个寄存器,如图:
1.
REGBANK: 由17个可编程的寄存器组和一块
256*16的调色板内存组成,通过这些寄存器,
可以配置LCD控制器.
2.
LCDCDMA: 一个专用的DMA,它能自动地
把在帧内存中的视频数据传送到LCD驱动器,通
过使用这个DMA通道,视频数据在不需要CPU
的干预的情况下显示在LCD屏上.
3.
VIDPRCS: 接收来自LCDCDMA的数据,将数据转换
为合适的数据格式,比如说4/8位单扫,4位双扫显示模
式,然后通过数据端口VD[23:0]传送视频数据到LCD驱
动器;
4.
TIMEGEN: 由可编程的逻辑组成,他生成LCD驱动器
需要的控制信号,比如VSYNC、HSYNC、VCLK和
LEND等,而这些控制信号又与REGBANK寄存器组中
的配置密切相关,通过不同的配置,TIMEGEN就能产
生这些信号的不同值,从而支持不同的LCD驱动器(即不
同的STN/TFT屏)。
2.LCD
显示与信号
2.1
图解LCD图形
显示过程
1. 显示从屏幕左上角第一行的第一个点开始,一个点一个点地在LCD上显示,当显示到屏幕的最右边就结束这一行(Line)。
2. 接下来显示指针又回到屏幕的左边从第二行开始显示,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换。
3. 以此类推,显示指针就这样一行一行的显示至矩形的右下角才把一幅图像(帧:frame)显示完成。
2.2时序信号
VSYNC:垂直同步信号
HSYNC:水平同步信号
VCLK:象素时钟信号
VD[23:0]:LCD像素数据输出端口
VDEN:数据使能信号
?LEND:行结束信号
2.2
显示过程与时序
1. 显示从屏幕左上角第一行的第一个点开始,一个点一个点地在
LCD上显示,点与点之间的时间间隔为VCLK(像素时钟信号);
当显示到屏幕的最右边就结束这一行(Line),这一行的显示对应时
序图上的HSYNC(水平同步信号)
2. 接下来显示指针又回到屏幕的左边从第二行开始显示,显示指
针在从第一行的右边回到第二行的左边是需要一定的时间的,我
们称之为行切换。
3. 以此类推,显示指针就这样一行一行的显示至矩形的右下角才
把一幅图像(帧:frame)显示完成,这一帧的显示时间在时序图上
表示为VSYNC(垂直同步信号)。
3.编写代码
/* * lcd
.c
* * Created
on: 2016
-10
-8
* Author
: root
*/ #define GPCCON
(*(volatile unsigned long
*) 0x56000020
) #define GPDCON
(*(volatile unsigned long
*) 0x56000030
) #define GPGCON
(*(volatile unsigned long
*) 0x56000060
) #define LCDCON1
(*(volatile unsigned long
*) 0X4D000000
) #define LCDCON2
(*(volatile unsigned long
*) 0X4D000004
) #define LCDCON3
(*(volatile unsigned long
*) 0X4D000008
) #define LCDCON4
(*(volatile unsigned long
*) 0X4D00000C
) #define LCDCON5
(*(volatile unsigned long
*) 0X4D000010
) #define LCDSADDR1
(*(volatile unsigned long
*) 0X4D000014
) #define LCDSADDR2
(*(volatile unsigned long
*) 0X4D000018
) #define LCDSADDR3
(*(volatile unsigned long
*) 0X4D00001C
) #define TPAL
(*(volatile unsigned long
*) 0X4D000050
) #define CLKVAL 4
//10
= 100
/((CLKVAL
+1
)*2
) #define VSPW 9
//1
+9
=10 #define VBPD 1
//1
+1
= 2 #define LINEVAL 271 #define VFPD 1
//1
+1
= 2 #define HSPW 40
//40
+1
= 41 #define HBPD 1 #define HOZVAL 479 #define HFPD 1 unsigned short LCDBUFFER
[272
][480
]; void lcd_port_init
() { //引脚初始化 GPDCON
= 0xaaaaaaaa
; GPCCON
= 0xaaaaaaaa
; } void lcd_control_init
() { //时序初始化 LCDCON1
= (CLKVAL
<<8
)|(0x3
<<5
)|(0xc
<<1
)|(0
<<0
); LCDCON2
= (VBPD
<<24
)|(LINEVAL
<<14
)|(VFPD
<<6
)|(VSPW
<<0
); LCDCON3
= (HBPD
<<19
)|(HOZVAL
<<8
)|(HFPD
<<0
); LCDCON4
= (HSPW
); LCDCON5
= (1
<<11
)|(1
<<9
)|(1
<<8
);//|(1
<<0
); //帧缓冲初始化 LCDSADDR1
= (((unsigned long
)LCDBUFFER
>>22
)<<21
)|(((unsigned long
)LCDBUFFER
>>1
)&0x1fffff
); LCDSADDR2
= (((unsigned long
)LCDBUFFER
+272
*480
*2
)>>1
&0x1fffff
); LCDSADDR3
= (0
<<11
)|(480
*2
/2
); TPAL
= 0
; } void lcd_init
() { lcd_port_init
(); lcd_control_init
(); //打开LCD电源 GPGCON
|= 0b11
<<8
; LCDCON5
|= (1
<<3
); LCDCON1
|= 1
; } void point
(unsigned
int x
,unsigned
int y
,unsigned
int color
) { unsigned
int red
, green
, blue
; red
= (color
>>19
) & 0x1f
; green
= (color
>>10
) & 0x3f
; blue
= (color
>>3
) & 0x1f
; LCDBUFFER
[y
][x
] = (unsigned short
)(red
<<11
)|(green
<<6
)|(blue
<<0
); } void Paint_Bmp
(unsigned short x0
,unsigned short y0
,unsigned short wide
,unsigned short high
,const unsigned char
*bmp
) { unsigned short x
,y
,c
; unsigned long p
= 0
; for(y
= y0
; y
< y0
+high
;y
++) { for(x
= x0
; x
< x0
+wide
;x
++) { c
= bmp
[p
] | (bmp
[p
+1
]<<0
); if ((x
<480
) && (y
< 272
)) LCDBUFFER
[y
][x
] = c
; p
= p
+2
; } } } void clearSrc
(unsigned
int color
) { TPAL
= (1
<<24
)|(color
&0xffffff
); } const unsigned char bmp
[90208
]; void lcd_test
() { int x
; for(x
=0
; x
<480
; x
++) { point
(x
++,150
,0xFF0000
); } Paint_Bmp
(0
,0
,220
,220
,bmp
); clearSrc
(0xff0000
); }
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(34) | 评论(0) | 转发(0) |
0
上一篇:设置使Linux下双击文件夹时不要每次都打开一个新窗口
下一篇:触摸屏学习
相关热门文章
SHTML是什么_SSI有什么用...
查看linux中某个端口(port)...
卡尔曼滤波的原理说明...
shell中字符串操作
关于java中的“错误:找不到或...
给主人留下些什么吧!~~
评论热议