210学习日记(10)_支持LCD
来源:互联网 发布:手机自动挂机赚钱软件 编辑:程序博客网 时间:2024/06/05 05:51
210学习日记(10)
--支持LCD
经过9章日志的努力,终于成功写好了bootloader。但是每次启动的时候,让7寸的LCD只显示背光,实在是浪费,我接下我将讲述如何让bootloader显示开机logo,即我的帅气照片。
其实写LCD程序,就是那么个事儿......
先做LCD的初始化工作,比如设置时间参数,分配显存等等操作,初始化完后,就完事儿了,以后什么都不需要做了,只需往显存里面写颜色数据就行。
一,简单测试:
以下为初始化LCD的代码:
void lcd_init(void)
{
/* 1. 设置相关GPIO引脚用于LCD */
GPF0CON = 0x22222222; // GPF0[7:0]
GPF1CON = 0x22222222; // GPF1[7:0]
GPF2CON = 0x22222222; // GPF2[7:0]
GPF3CON = 0x22222222; // GPF3[7:0]
/* 使能LCD本身 */
GPD0CON |= 1<<4;
GPD0DAT |= 1<<1;
/* 该寄存器是时钟相关
* Display path selection
* 10: RGB=FIMD I80=FIMD ITU=FIMD
*/
DISPLAY_CONTROL = 2<<0;
/* 2. 初始化210的display controller
* 2.1 hsync,vsync,vclk,vden的极性和时间参数
* 2.2 行数、列数(分辨率),象素颜色的格式
* 2.3 分配显存(frame buffer),写入display controller
*/
/*
* CLKVAL_F[13:6]:该值需要根据LCD手册做相应的修改
* HCLKD=166.75MHz,DCLK(min) = 20ns(50MHz)
* VCLK = 166.75 / (4+1) = 33.35MHz
* CLKDIR [4]:1 = Divided by CLKVAL_F
* ENVID [1]:1 = Enable the video output and the Display control signal.
* ENVID_F [0]:1 = Enable the video output and the Display control signal.
*/
VIDCON0 &= ~((3<<26) | (1<<18) | (0xff<<6) | (1<<2)); /* RGB I/F, RGB Parallel format, */
VIDCON0 |= ((4<<6) | (1<<4) );
/* 设置极性(该值需要根据LCD手册做相应的修改)
* IVDEN [4]:0 = Normal
* IVSYNC[5]:1 = Inverted
* IHSYNC[6]:1 = Inverted
* IVCLK [7]:0 = Video data is fetched at VCLK falling edge
*/
VIDCON1 &= ~(1<<7); /* 在vclk的下降沿获取数据 */
VIDCON1 |= ((1<<6) | (1<<5)); /* HSYNC极性反转, VSYNC极性反转 */
/* 设置时序(需要修改) */
VIDTCON0 = (VBPD << 16) | (VFPD << 8) | (VSPW << 0);
VIDTCON1 = (HBPD << 16) | (HFPD << 8) | (HSPW << 0);
/* 设置屏幕的大小
* LINEVAL[21:11]:多少行 = 480
* HOZVAL [10:0] :水平大小 = 800
*/
VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);
/* WSWP_F [15] :1 = Swap Enable(为什么要使能),很关键的一位,能够解决掉重影问题
* BPPMODE_F[5:2]:1011 = unpacked 24 BPP (non-palletized R:8-G:8-B:8 )
* ENWIN_F [0]: 1 = Enable the video output and the VIDEO control signal.
*/
WINCON0 &= ~(0xf << 2);
WINCON0 |= (0xB<<2)|(1<<15);
/* 窗口0,左上角的位置(0,0) */
/* 窗口0,右下角的位置(800,480) */
VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
/* 大小 */
VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1);
VIDW00ADD0B0 = FRAME_BUFFER;
/* VBASEL = VBASEU + (LINEWIDTH+OFFSIZE) x (LINEVAL+1)
* = 0 + (800*4 + 0) * 479
* =
*/
VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);
//VIDW00ADD1B0 = FRAME_BUFFER + HOZVAL * LINEVAL * 4; /* 新加的,是该这个吗? */
SHADOWCON = 0x1; /* 使能通道0 */
/* LCD控制器开启 */
VIDCON0 |= 0x3; /* 开启总控制器 */
WINCON0 |= 1; /* 开启窗口0 */
}
注意:
1).该程序适用的LCD型号是S70,若为其他型号,请根据自己的LCD手册修改注有要修改字样的地方!!
2).该部分程序放在了"Tiny210学习日记_代码"目录下了,名为"10_lcd",该部分程序只是循环显示红,绿,蓝,画了几个框框而已!!
3).另外一个程序放在了"Tiny210学习日记_代码"目录下了,名为"11_lcd",该部分程序显示一张图片!!
注意:
测试"11_lcd"的程序时,图片需要单独烧写到nand的0xC00000处!!!
二,显示开机logo:
(1).如何制作LCD可以显示的数据:
我知道往往有很多人想在LCD上面显示图片的时候,第一想法就是想把一张图片转换成一个数组,然后编译进程序里面,再来显示,当然,这也是一种方法。
而我,会介绍另外一种方法,直接将bmp格式的图片下载进开发板,就能够显示:
先说怎么生成bmp图片吧:(方法万千,我只说我的方法)
1).从网上下载任意格式,任意内容的图片(大小小于等于你的LCD尺寸,当然可以自己修剪大小);
2).用Img2Lcd工具(以贡献在该文件下了)打开图片,然后做以下设置:
输出数据类型:BMP格式(*.bmp) (我有试过用这个软件生成数组,但是显示的图片有问题)
扫描模式:水平扫描
输出灰度:24位真彩色(根据自己的LCD情况设置)
最大宽度和高度:800*480(根据自己的LCD大小设置)
注意:以上设置,全凭个人喜好...自己多试试,应该没有什么问题
3).保存
(2).说说BMP文件格式:
我只说一句,就是真正的颜色数据是从第55字节开始的,详细信号可以阅读文章:
http://www.blogjava.net/georgehill/articles/6549.html
或者自行google
(3).在显示图片的LCD程序中,相比较前面的LCD程序,在初始化函数中,我修改了一下时钟,使频率降低了一下,否则显示的图片有"亮斑"。
(4).LCD显示图片的功能我已经加入bootloader,请自己阅读代码。
注意:
支持开机LCD显示logo(一张图片)的bootloader的代码放在了"Tiny210学习日记_代码"目录下了,名为"bootloader_lcd"。
注:
如有问题,请到韦东山LINUX视频讨论群里面,我们一起讨论学习,或者加我QQ:317312379
- 210学习日记(10)_支持LCD
- 210学习日记(3)_支持串口
- 210学习日记(7)_支持NAND
- 210学习日记(8)_支持DDR
- 210学习日记(14)_支持声卡
- 210学习日记(6)_独立日
- 210学习日记(11)_中断
- 210学习日记(15)_移植DM9000
- 210学习日记_特别篇
- 210学习日记(5)_简单命令的实现.doc
- 210学习日记(9)_成功启动内核
- 210学习日记(13)_定时器和修改工具
- 210学习日记(16)_移植一线触摸
- 黑马程序员--Java学习日记10_交通灯系统
- 黑马程序员_Java学习日记10_集合框架2
- 黑马程序员_学习日记10_复习C#(基础)
- Linux 学习日记_下载Fedora
- 黑马程序员_学习日记3_WinForm
- 210学习日记(7)_支持NAND
- java 队列
- 210学习日记(8)_支持DDR
- 机房收费系统——建表
- 210学习日记(9)_成功启动内核
- 210学习日记(10)_支持LCD
- mac如何安装软件
- 单播、多播(组播)和广播的区别
- 评选优秀
- Cookie小结
- el表达式与jstl
- 红黑树代码
- 210学习日记(11)_中断
- 210学习日记(12)_IIC