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

c = getc();
printf("%c\n\r", c);
switch(c)
{
case '':
{
Test_Lcd_Tft_8Bit_240320();
break;
} case '':
{
Test_Lcd_Tft_16Bit_240320();
break;
} case '':
{
Test_Lcd_Tft_8Bit_640480();
break;
} case '':
{
Test_Lcd_Tft_16Bit_640480();
break;
}
}
main.c主体代码
行号
11行/*
12行 *以240x320、8BPP的显示模式测试TFT LCD
13行 */
14行void Test_Lcd_Tft_8Bit_240320(void)
15行{
16行 Lcd_Port_Init(); //设置LCD引脚
17行 Tft_Lcd_Init(MODE_TFT_8BIT_240320); //初始化LCD控制器
18行 Lcd_PowerEnable(, ); //设置LCD_PWREN有效,它用于打开LCD的电源
19行 Lcd_EnvidOnOff(); //使能LCD控制器输出信号
lcdlib.c->Test_Lcd_Tft_8bit_240320()_1
Lcd_Palette8Bit_Init(); //初始化调色板
ClearScr(0x0); //清屏
printf("[TFT 64K COLOR(16bpp) LCD TEST]\n"); printf("1. Press any key to draw line\n");
get();
DrawLine( , , , , ); //颜色为DEMO256pal[0]
DrawLine( , , , , ); //颜色为DEM0256pal[1]
DrawLine(, , , , ); //...
DrawLine( , , , , );
DrawLine( , , , , );
DrawLine(, , , , );
DrawLine(, , , , );
DrawLine( , , , , ); printf("2. Press any key to draw circles\n");
getc();
Mire(); printf("3. Press any key to fill the screem with one color\n");
getc();
ClearScr(); //输出单色图像,颜色值等于DEMO256pal[128] printf("4. Press any key to fill the screem by temporary palette\n");
getc();
ClearScrWithTmpPlt(0x0000ff); //输出单色图像,颜色为蓝色 printf("5. Press any key to fill the screem by palette\n");
getc();
DisableTmpPlt(); //关闭临时调色板寄存器
ChangePalette(0xffff00); //改变整个调色板为黄色,输出单色图像 printf("6. Press any key to stop the testing\n");
getc();
Lcd_EnvidOnOff();
}
lcdlib.c->Test_Lcd_Tft_8bit_240320()_2
/*
*初始化LCD控制器
*输入参数:
*type:显示模式
* MODE_TFT_8BIT_240320:240*320 8bpp的TFT LCD
* MODE_TFT_16BIT_240320:240*320 16bpp的TFT LCD
* MODE_TFT_8BIT_640480:640*480 8bpp的TFT LCD
* MODE_TFT_16BIT_640480:640*480 16bpp的TFT LCD
*/
void Tft_Lcd_Init(int type)
{
switch(type)
{
case MODE_TFT_8BIT_240320:
/*
*设置LCD控制器的控制寄存器LCDCON1~5
*1.LCDCON1
* 设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1) x 2]
* 选择LCD类型:TFT LCD
* 设置显示模式:8BPP
* 先禁止LCD信号输出
*2.LCDCON2/3/4
* 设置控制信号的时间参数
* 设置分辨率,即行数和列数
*现在,可以根据公式算出显示器的分辨率
*当HCLK = 100MHz时,
*Frame Rate = 1/[{(VSPW+1) + (VBPD+1) + (LIINEVAL+1) + (VFPD+1)} x
* {(HSPW+1) + (HBPD+1) + (HFPD+1) + (HOZVAL+1)} x
* {(2x(CLKVAL+1)/(HCLK))}]
* = 60Hz
*3.LCDCON5
* 设置显示模式为8BPP时,调色板中的数据格式为5:6:5
* 设置HSYNC、VSYNC脉冲的极性(这需要参考具体的LCD的接口信号):反转字节交换使能
*/
LCDCON1 = (CLKVAL_TFT_240320 << ) | (LCDTYPE_TFT << ) | \
(BPPMODE_8BPP << ) | (ENVID_DISABLE << );
LCDCON2 = (VBPD_240320 << ) | (LINEVAL_TFT_240320 << ) | \
(VFPD_240320 << ) | (VSPW_240320);
LCDCON3 = (HBPD_240320 << ) | (HOZVAL_TFT_240320 << ) | (HFPD_240320);
LCDCON4 = HSPW_240320;
LCDCON5 = (FORMAT8BPP_565 << ) | (HSYNC_INV << ) | (VSYNC_INV << ) | \
(BSWP << );
lcddrv.c->Tft_Lcd_Init()
行号
78行 /*
79行 *设置LCD控制器的地址寄存器:LCDSADDR1~3
80行 *帧内存与视口(view point)完全吻合
81行 *图像数据格式如下(8BPP时,帧缓冲区中的数据为调色板中的索引值):
82行 * |--------- PAGEWIDTH ----------|
83行 * y/x 0 1 2 239
84行 * 0 idx idx idx ... idx
85行 * 1 idx idx idx ... idx
86行 *1.LCDSADDR1
87行 * 设置LCDBANK、LCDBASEU
88行 *2.LCDSADDR2
89行 * 设置LCDBASEL:帧缓冲区的结束地址A[21:1]
90行 *3.LCDSADDR3
91行 * OFFSIZE等于0,PAGEWIDTH等于(240/2)
92行 */
93行 LCDSADDR1 = ((LCDFRAMEBUFFER >> ) << ) | LOWER21BITS (LCDFRAMEBUFFER >> );
94行 LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ \
95行 (LINEVAL_TFT_240320 + ) x (HOZVAL_TFT_240320 + ) x ) >> );
96行 LCDSADDR3 = ( << ) | (LCD_XSIZE_TFT_240320/);
97行
设置LCD控制器的地址寄存器
行号
98行 /*禁止临时调色板寄存器*/
99行 TPAL = ;
100行
101行 fb_base_addr = LCDFRAMEBUFFER;
102行 bpp = ;
103行 xsize = ;
104行 ysize = ;
105行
行号
296行 /*
297行 *设置调色板
298行 */
299行 void Lcd_Palette8Bit_Init(void)
300行 {
301行 int i;
302行 volatile unsigned int *palette;
303行
304行 LCDCON5 |= (FORMAT8BPP_565 << ); //设置调色板中数据格式为:5:6:5
305行
306行 palette = (volatile unsigned int *)PALETTE;
307行 for(i = ; i < ; i++)
308行 *palette++ = DEMO256pal[i];
309行 }
310行
Lcd_Palette8Bit_Init()
(4)ChangePalette函数。
行号
311行 /*
312行 *改变调色板为一种颜色
313行 *输入参数:
314行 * color:颜色值,格式为0xRRGGBB
315行 */
316行 void ChangePalette(UINT32 color)
317行 {
318行 int i;
319行 unsigned char red, green, blue;
320行 UINT32 *palette;
321行
322行 palette = (UINT32 *)PALETTE;
323行 for(i = ; i < ; i++)
324行 {
325行 red = (color >> ) & 0xff;
326行 green = (color >> ) & 0xff;
327行 blue = (color >> ) & 0xff;
328行 color = (red << ) | (green << ) | blue; //格式:5:6:5
329行
330行 while((LCDCON5 >> ) == ); //等待直到VSTATUS不为“有效”
331行 *palette++ = color;
332行 }
333行 }
334行
ChangePalette()
/*
*设置是否输出LCD电源开关信号LCD_PWREN
*输入参数:
* invpwren:0表示LCD_PWREN有效时为正常极性
* 1表示................反转极性
* pwren :0表示LCD_PWREN输出有效
* 1表示LCD_PWREN输出无效
*/
void Lcd_PowerEnable(int invpwren, int pwren)
{
GPGCON = (GPGCON & (~( << ))) | ( << ); //GPG4用于LCD_PWREN
GPGUP = (GPGUP & (~( << ))) | ( << ); //禁止内部上拉 LCDCON5 = (LCDCON5 & (~( << ))) | (invpwren << ); //设置LCD_PWREN的极性:正常/反转
LCDCON5 = (LCDCON5 & (~( << ))) | (pwren << ); //设置是否输出LCD_PWREN
}
Lcd_PowerEnable()
/*
*设置LCD控制器是否输出信号
*输入参数:
*onoff:
* 0:关闭
* 1:打开
*/
void Lcd_EnvidOnOff(int onoff)
{
if(onoff == )
LCDCON1 |= ; //ENVID ON
else
LCDCON1 &= 0x3fffe; //ENVID OFF
}
Lcd_EnvidOnOff
/*
*使用临时调色板寄存器输出单色图像
*输入参数:
* color:颜色值,格式为0xRRGGBB
*/
void ClearScrWithTmpPlt(UINT32 color)
{
TPAL = ( << ) | ((color & 0xffffff) << );
} /*
*停止使用临时调色板寄存器
*/
void DisableTmpPlt(void)
{
TPAL = ;
}
ClearScrWithTmpPlt()和DisableTmpPlt()
行号
8行 extern unsigned int fb_base_addr;
9行 extern unsigned int bpp;
10行 extern unsigned int xsize;
11行 extern unsigned int ysize;
12行
13行 /*
14行 *画点
15行 *输入参数:
16行 * x、y:像素坐标
17行 * color:颜色值
18行 * 对于16BPP:color的格式为0xAARRGGBB(AA = 透明度),
19行 * 需要转换为5:6:5格式
20行 * 对于8BPP:color为调色板中索引值,
21行 * 其颜色取决于调色板中的数值
22行 */
23行 void PutPixel(UINT32 x, UINT32 y, UINT32 color)
24行 {
25行 UINT8 red, green, blue;
26行
27行 switch(bpp){
28行 case :
29行 {
30行 UINT16 *addr = (UINT16 *)fb_base_addr + (y * xsize + x);
31行 red = (color >> ) & 0xff;
32行 green = (color >> ) & 0xff;
33行 blue = (color >> ) & 0xff;
34行 color = (red << ) | (green << ) | blue; //格式:5:6:5
35行 *addr = (UINT16)color;
36行 break;
37行 }
38行
39行 case :
40行 {
41行 UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize + x);
42行 *addr = (UINT8)color;
43行 break;
44行 }
45行
46行 default:
47行 break;
48行 }
49行 }
50行
PutPixel
JZ2440 裸机驱动 第13章 LCD控制器(2)的更多相关文章
- JZ2440 裸机驱动 第13章 LCD控制器(1)
本章目标 了解LCD显示器的接口及时序: 掌握S3C2410/S3C2440 LCD控制器的使用方法: 了解帧缓冲区的概念,掌握如何设置帧缓冲区来显示图像: 13.1 LCD和LCD控制器 13.1 ...
- JZ2440 裸机驱动 第6章 存储控制器
本章目标: 了解S3C2410/S3C2440地址空间的布局 掌握如何通过总线形式访问扩展的外设,比如内存.NOR Flash.网卡等 ························ ...
- JZ2440 裸机驱动 第10章 系统时钟和定时器
本章目标 了解S3C2410/S3C2440的时钟体系结构 掌握通过设置MPLL改变系统时钟的方法 掌握在不同的频率下设置存储控制器的方法 掌握PWM定时器的用法 ...
- JZ2440 裸机驱动 第8章 NAND Flash控制器
本章目标 了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用 NAND ...
- JZ2440 裸机驱动 第14章 ADC和触摸屏接口
本章目标: 了解S3C2410/S3C2440和触摸屏的结构: 了解电阻触摸屏的工作原理和等效电路图: 了解S3C2410/S3C2440触摸屏控制器的多种工作模式: ...
- JZ2440 裸机驱动 第12章 I2C接口
本章目标: 了解I2C总线协议: 掌握S3C2410/S3C2440中I2C接口的使用方法: 12.1 I2C总线协议及硬件介绍 12.1.1 I2C总线协议 1 I2C总线的概念 2 I2C总线的信 ...
- JZ2440 裸机驱动 第7章 内存管理单元MMU
本章目标: 了解虚拟地址和物理地址的关系: 掌握如何通过设置MMU来控制虚拟地址到物理地址的转化: 了解MMU的内存访问权限机制: 了解TLB.Cache.Write ...
- JZ2440 裸机驱动 第9章 中断体系结构
本章目标: 了解ARM体系CPU的7种工作模式 了解S3C2410/S3C2440中断体系结构 掌握S3C2410/S3C2440的中断服务程序的编写方法 9.1 S3C241 ...
- JZ2440 裸机驱动 第5章 GPIO接口
本章目标: 掌握嵌入式开发的步骤:编程.编译.烧写程序.运行 通过GPIO的操作了解软件如何控制硬件 5.1 GPIO硬件介绍 S3C2440A有130个多功能输入/输出口引脚 ...
随机推荐
- linux分析、诊断及调优的必备“杀器”之一
下面分别列出linux分析.诊断及调优时用到的工具,并分别进行说明,以方便自己和其他同学参考学习,禁止转载. 1.top top - 02:06:59 up 4 days, 17:14, 2 user ...
- django url 使用总结
1 无参数情况 配置URL及其视图如下: (r'^hello/$', hello) def hello(request): return HttpResponse("Hello World& ...
- c中gets函数使用可能导致缓冲区溢出
头文件:#include <stdio.h> gets()函数用于从缓冲区中读取字符串,其原型如下: char *gets(char *string); gets()函数从流中读取字 ...
- Xshell5 Xftp安装图解
1Xshell5 Xftp_5安装图解 2.1Xshell5安装 2.2Xftp安装
- 深入理解java异常【绝对经典,推荐最少看五遍】
http://blog.csdn.net/hguisu/article/details/6155636 补充:检查异常(checkedException)与运行异常,什么时候throw,什么时候thr ...
- 使用Messenger 从Activity发送数据到service 通过后台计算结果Log输出;
package com.lixu.messenger; import android.app.Activity; import android.app.Service; import android. ...
- Hadoop序列化和反序列化
1. 序列化从头说 在面向对象程序设计中,类是个很重要的概念.所谓“类”,可以将它想像成建筑图纸,而对象就是根据图纸盖的大楼.类,规定了对象的一切.根据建筑图纸造房子,盖出来的就是大楼,等同于将 ...
- 一张图告诉你为何必须学Python?
互联网行业的薪资高.发展前景好,已经是人尽皆知的事了.越来越多的人对编程有了兴趣,想通过加入大公司实现人生逆袭,我们身边也涌现出了一些从零学习.变身大神的励志故事. 但更多的人还是选择观望:有人觉得编 ...
- 未能加载文件或程序集“Microsoft.Office.Interop.Excel
解决方法:未能加载文件或程序集“Microsoft.Office.Interop.Excel...” 2010-07-25 08:06:15 来源:源码之家 站长整理 [大 中 小] ...
- tp 邮件发送
1.需要phpmail邮件发送包, 2.邮件发送函数function sendMail($to, $title, $content){ require_once('./PHPMailer_v5.1/c ...