在S3C2440上运行GUI(支持半透明效果和触摸屏)【恢复】
最近弄了一块S3C2440的板子,将原来的GUI移植了上去,感觉S3C2440的速度还不错. 先上几张运行图片:http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_448390.jpg
(原文件名:IMAG0050.jpg)
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_448391.jpg
(原文件名:IMAG0051.jpg)
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_448392.jpg
(原文件名:IMAG0054.jpg)
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_448394.jpg
(原文件名:IMAG0056.jpg)
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_448395.jpg
(原文件名:IMAG0057.jpg)
本贴被 liuweiele 编辑过,最后修改时间:2008-10-11,18:16:19. 可直接下载到S3C2440上运行ourdev_448450.rar(文件大小:152K) (原文件名:S3C2440_GUI可执行文件.rar) 不错,要是能公布源代码,或者部分源代码就好了 期待源码。。 MARK 楼主也在看uCOSii o(∩_∩)o... 这是什么GUI啊,不错哦。 源码还在整理,过不久就会适当公布. 文件太大,好像传不上. 这个GUI暂时还没名字. 先上传一个主程序:
点击此处下载 ourdev_448630.rar(文件大小:2K) (原文件名:S3C2440_Main.rar) SystemSetup源码:
点击此处下载 ourdev_449430.rar(文件大小:62K) (原文件名:SystemSetup.rar)
本贴被 liuweiele 编辑过,最后修改时间:2008-10-12,12:29:14. 难道是友善之臂的? LS是说什么? 【14楼】 liuweiele
MINI2440哦
楼主觉得这个板子适合初学者吗?
各个资源模块没有都被封装起来吧?
我也想下手一块。初学,一个人单枪匹马,还是要找个合适的板子好点。
谢谢 相对之前的SBC2410,这个板子的资料还算是比较丰富.只是NEC3.5寸LCD的显示效果不太理想,对比度非常差.
FriendlyARM的售后服务的确不敢恭维.毕竟价格不贵.不过,板子做功还算不错. NEC LCD 驱动源码:
点击此处下载 ourdev_450853.rar(文件大小:2K) (原文件名:S3C2440LCD_NEC35.rar) 显示效果是差了点
是不是GAMA设置不是最佳呢
我玩过同为9320控制器的TFT LCD好几个厂家的
GAMA值设置都不同哦
楼主很厉害哦
不知怎么联系
我也入手一块,向楼主学习吧 移植openmoko呀 , 漂亮实用 显示效果和LCD的玻璃也有很大关系的.同样都是ILI9320,不同厂家生产的LCD显示效果差别都很大. LS说的openmoko是指什么? 不过这个GUI在ILI9320/9325和东华LCD屏运行的显示效果还是非常不错. 有什么需要也可以加我QQ:304466616 实现半透明算法:
U16 RGB565_Trans(U16 RGB1,U16 RGB2)
{
U8 R0,G0,B0,R1,G1,B1;
R0=(RGB1>>11)&0x1f;
G0=(RGB1>>5)&0x3f;
B0=(RGB1&0x1f);
////
R1=(RGB2>>11)&0x1f;
G1=(RGB2>>5)&0x3f;
B1=(RGB2&0x1f);
////
return RGB565((R0+R1)>>1,(G0+G1)>>1,(B0+B1)>>1);
} 请问楼主可以移植到s3c2410板上吗? 当然可以.我在S3C44b0X/S3C2410/S3C2440/HMS30C7210上都移植过. 这块板子是 "友善之臂" 的,如果是初学者,千万不要买"友善之臂"的板子. 【24楼】 liuweiele :
感谢你的函数,我就是需要这个例子,没能看懂GUI的代码,能帮忙解释2个问题吗?
U16 RGB565_Trans(U16 RGB1,U16 RGB2) //----------------------------------> 入口参数代表 RGB1上透明显示RGB2?
{
...
...
...
return RGB565((R0+R1)>>1,(G0+G1)>>1,(B0+B1)>>1); //------>能提供RGB565这个函数及其自函数吗?
}
谢谢!! 学习了。。。,不错的资料,楼主能上传全部GUI的代码吗,谢谢 Re 28楼:
问题1: 是的
问题2: #define RGB565(R,G,B) ((R<<11)|(G<<5)|(B)) Re29楼:
可以上传部分代码;但可能不方便上传全部代码,因涉及公司和商业利益!请大家见谅
本贴被 liuweiele 编辑过,最后修改时间:2008-10-14,22:40:38. 标记 感谢楼主答复,速度好快!悟了半天,上来改贴发现答案已经来了,感谢!!
过分的要求:
能发给立体按钮的函数吗? 如果牵涉到公司机密,麻烦指条路--> ucgui_324代码里那些自程序中需重点研究,
本贴被 myjnj 编辑过,最后修改时间:2008-10-14,22:49:03. Myjnj也在做半透明效果的GUI吗?请问你以前是如果实现半透明算法的? 下面是什么书? 这是一个3D的填充矩形,可以用来做按钮.
void GUI_3D_Rectangle(int x_addr,int y_addr,int dx,int dy,int Bright_RGB,int Dark_RGB,int Light_Way)
{
U16 Left_RGB,Up_RGB,Right_RGB,Down_RGB,RGB;
U8 r0,g0,b0,r1,g1,b1;
////
r0=(Bright_RGB>>Red)&0x1f;
g0=(Bright_RGB>>Green)&0x3f;
b0=(Bright_RGB>>Blue)&0x1f;
r1=(Dark_RGB>>Red)&0x1f;
g1=(Dark_RGB>>Green)&0x3f;
b1=(Dark_RGB>>Blue)&0x1f;
RGB=RGB565((r0+r1)>>1,(g0+g1)>>1,(b0+b1)>>1);
GUI_FillRectangle(x_addr+2,y_addr+2,dx-3,dy-3,RGB);
////
switch(Light_Way)
{
case Left:
Left_RGB=Bright_RGB;
Up_RGB=RGB;
Right_RGB=Dark_RGB;
Down_RGB=RGB;
break;
////////
case Up:
Left_RGB=RGB;
Up_RGB=Bright_RGB;
Right_RGB=RGB;
Down_RGB=Dark_RGB;
break;
////////
case Right:
Left_RGB=Dark_RGB;
Up_RGB=RGB;
Right_RGB=Bright_RGB;
Down_RGB=RGB;
break;
////////
case Down:
Left_RGB=RGB;
Up_RGB=Dark_RGB;
Right_RGB=RGB;
Down_RGB=Bright_RGB;
break;
////////
case Left_Up:
Left_RGB=Bright_RGB;
Up_RGB=Bright_RGB;
Right_RGB=Dark_RGB;
Down_RGB=Dark_RGB;
break;
////////
case Right_Up:
Left_RGB=Dark_RGB;
Up_RGB=Bright_RGB;
Right_RGB=Bright_RGB;
Down_RGB=Dark_RGB;
break;
////////
case Left_Down:
Left_RGB=Bright_RGB;
Up_RGB=Dark_RGB;
Right_RGB=Dark_RGB;
Down_RGB=Bright_RGB;
break;
////////
case Right_Down:
Left_RGB=Dark_RGB;
Up_RGB=Dark_RGB;
Right_RGB=Bright_RGB;
Down_RGB=Bright_RGB;
break;
////////
default: return;
}
////
GUI_Line(x_addr,y_addr,x_addr,y_addr+dy,Left_RGB); //Left(Outside).
GUI_Line(x_addr+1,y_addr+1,x_addr+1,y_addr+dy-2,Left_RGB); //Left(Inside);
GUI_Line(x_addr,y_addr,x_addr+dx,y_addr,Up_RGB); //Up(Outside).
GUI_Line(x_addr+1,y_addr+1,x_addr+dx-2,y_addr+1,Up_RGB); //Up(Inside);
GUI_Line(x_addr+dx,y_addr,x_addr+dx,y_addr+dy,Right_RGB); //Right(Outside).
GUI_Line(x_addr+dx-1,y_addr+1,x_addr+dx-2,y_addr+dy,Right_RGB); //Right(Inside).
GUI_Line(x_addr+1,y_addr+dy,x_addr+dx,y_addr+dy,Down_RGB); //Down(Outside).
GUI_Line(x_addr+2,y_addr+dy-1,x_addr+dx-1,y_addr+dy,Down_RGB); //Down(Inside);
} 经典的uC/OS呀. 刚刚得到一个结论:S3C2440(532M) 在MMU和Cache全开的情况下,速度超猛.如果只单开Cache而不开MMU的情况下,速度大打折扣.如果MMU和Cache全关闭,简直比开着Cache 的S3C44B0X(60M)还慢了一大截.<font color=#699bcd>本贴被 liuweiele
编辑过,最后修改时间:2008-10-15,00:07:01. 楼主为什么说:如果是初学者,千万不要买"友善之臂"的板子. 啊?能否分析一二?
也要弄块板子,也许你的分析能有帮助 ^_^ 友善之臂 的售后服务和技术支持非常差.SBC2410的资料很烂.最新MINI2440资料还算丰富. 刚刚入手MINI2440
友善留了一手哦 不提供LCD驱动板原理图 何必呢 我几个月前买的QQ2440准备学ARM 不过买的二手屏 屏是可以 也是没有驱动资料 友善 连LCD资料也不提供.更不用说原理图了 楼主有LCD的资料吗?
我还停留在ARM7时代 先裸机玩转先 LS想用什么样的LCD? ARM7用这个TFT LCD比较合适:分辨率240x320,1600万色,带触摸屏,LED背光(3.0V).
点击此处下载 ourdev_455552.pdf(文件大小:681K) <font color=green>(原文件名:TS8003B_TFT2.4_5879_2.4_A.pdf) 我就想要友善的那个NEC 的LCD的资料 楼主已经玩得很转了
佩服佩服 NEC 3.5寸LCD我也没资料.NEC这个屏显示效果很差(实际效果比照片上还差),不想用.过几天我会把MINI2440的LCD的PCB板改为东华4.3寸的(480x272),这个屏显示效果非常好.<font color=#699bcd>本贴被 liuweiele
编辑过,最后修改时间:2008-10-15,12:02:02. 感谢楼主的答复,我之前只是将背景图案的RGB三色除2,要显示的文字的颜色不变,这样处理文字没大问题,处理图标效果就不好了。
1楼上的IMAG0054.jpg中的图标处理的很好,应该不是用你帖子中的透明算法的,
用24楼的算法,得到的图片主次难以区分(如果色调相近的话)。 1楼 的半透明效果(指针式时钟) 就是用24楼的算法.只有时钟是半透明效果,其它图标是全透明背景. 好像这个是mini2440 NEC屏幕的资料 NEC触摸屏手册ourdev_466237.pdf(文件大小:205K) <font color=green>(原文件名:NEC触摸屏手册.pdf) 多谢 【51楼】 muyuyuzhong 共享. 我顶啊!刚买的MINI2440,向楼主学习. 【53楼】 sxl0679 是用哪个操作系统呢? 买板其实就希望有板整套资料,其实没啥啊,不就详细的电路图和底层的驱动而已 但这详细的电路图和底层的驱动可是些好东西啊!!! mark 我买MINI2440是为了学嵌入式LINUX的,以前学过一阵LINUX应用开发,现在的工作是给单片机写程序,用单片机玩系统太麻烦了,所以就买了ARM 同意,mini2440的nec3.5'对比度不好,色彩不够。 是的,看起来不怎么样. 二进制文件是通过先运行VIVI,然后通过USB下到0X30000000地址处。如果断电再重启,QQ2440开发板将直接运行LINUX系统了。
请问有没有办法让开发板自动运行由ADS生成的二进制文件?应该怎么做?可以以你的这个文件为例。谢谢! zan 【61楼】 luojinwen:
最简单的办法是把这个二进制文件烧到QQ2440的NorFlash中(可保留NandFlash中的VIVI,以方便可继续启动Linux),然后选择跳线丛NorFlash启动.搞定...
本贴被 liuweiele 编辑过,最后修改时间:2008-10-31,14:03:51. 谢谢liuweiele ,还想请教一个问题,我的NEC3.5驱动做好后,屏幕上出现前面十几个像素点无法显示,为黑屏,如图所示:
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_477118.jpg
NEC3.5LCD上显示图 (原文件名:222222.jpg)
请问是什么原因?驱动程序如下(先声明代码是网上下载的,我稍微做了修改,先感谢原作者):
刚把所有代码贴出来了,但太长,可能大家没有心情看完,所以修改了下,只把主要的部分贴出来了
/************************************************
NAME : LCDLIB.H
************************************************/
#ifndef __LCDLIB_H__
#define __LCDLIB_H__
#define MVAL (13)
#define MVAL_USED (0)
#define M5D(n) ((n) & 0x1fffff) // To get lower 21bits
#define MODE_TFT_1BIT_240320 (0x4101)
#define MODE_TFT_8BIT_240320 (0x4102)
#define MODE_TFT_16BIT_240320 (0x4104)
#define LCD_XSIZE_TFT_240320 (240)
#define LCD_YSIZE_TFT_240320 (320)
#define SCR_XSIZE_TFT_240320 (LCD_XSIZE_TFT_240320*2)
#define SCR_YSIZE_TFT_240320 (LCD_YSIZE_TFT_240320*2)
#define HOZVAL_TFT_240320 (LCD_XSIZE_TFT_240320-1)
#define LINEVAL_TFT_240320 (LCD_YSIZE_TFT_240320-1)
#define VBPD_240320 (1)
#define VFPD_240320 (5)
#define VSPW_240320 (1)
#define HBPD_240320 (36)
#define HFPD_240320 (19)
#define HSPW_240320 (5)
#define CLKVAL_TFT_240320 (4)
// 60hz @50Mhz
//VSYNC,HSYNC should be inverted
//HBPD=6VCLK,HFPD=2VCLK,HSPW=3VCLK
//VBPD=1HSYNC,VFPD=2HSYNC,VSPW=1HSYNC
#define LCDFRAMEBUFFER 0x33800000 //_NONCACHE_STARTADDRESS
// 1. The LCD frame buffer should be write-through or non-cachable.
// 2. The total frame memory should be inside 4MB.
// 3. To meet above 2 conditions, the frame buffer should be
// inside the following regions.
// 0x31000000~0x313ffffff,
// 0x31400000~0x317ffffff,
// 0x31800000~0x31bffffff,
// .....
// 0x33800000~0x33bffffff
extern U32 (*frameBuffer8BitTft240320);
extern U32 (*frameBuffer16BitTft240320);
#endif /*__LCDLIB_H__*/
/*****************************************
NAME: lcdlib.c
*****************************************/
#include <string.h>
#include "2440addr.h"
#include "2440lib.h"
#include "def.h"
//#include "option.h"
//#include "24xslib.h"
#include "lcdlib.h"
U32 (*frameBuffer8BitTft240320);
U32 (*frameBuffer16BitTft240320);
extern void SET_IF(void);
extern void CLR_IF(void);
U32 UserFrameBuffer;
int LCD2440_Init()
{
rCLKCON|=(1<<5);
rGPCUP=0x00000000; // Disable Pull-up register
rGPCCON=0xaaaaaaaa; //Initialize VD,LCDVF,VM,VFRAME,VLINE,VCLK,LEND
rGPDUP=0x00000000; //Enable Pull-up register
rGPDCON =0xaaaaaaaa; //Initialize VD
frameBuffer16BitTft240320=(U32 (*))LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// TFT LCD panel,16bpp TFT,ENVID=off
rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
rLCDCON4=(MVAL<<8)|(HSPW_240320);
rLCDCON5=(1<<11)|(1<<9)|(1<<8); //FRM5:6:5,HSYNC and VSYNC are inverted
rLCDSADDR1=(((U32)frameBuffer16BitTft240320>>22)<<21)|M5D((U32)frameBuffer16BitTft240320>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer16BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/1)<<11)|(LCD_XSIZE_TFT_240320/1);
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
//rLPCSEL&=(~7); // Disable LPC3600
rTCONSEL|=(7);
rTPAL=0; // Disable Temp Palette
return(1);
}
void Lcd_Init(int type)
{
//memset((BYTE*)UserFrameBuffer,0x00,LCD_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480*4);
//UserFrameBuffer = (U32 (*))malloc(LCD_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480);
switch(type)
{
case MODE_STN_1BIT:。。。。。。
case MODE_STN_2BIT:。。。。。。
case MODE_STN_4BIT:。。。。。。
case MODE_CSTN_8BIT:。。。。。。
case MODE_CSTN_12BIT:。。。。。。
case MODE_TFT_8BIT_240320:。。。。。
case MODE_TFT_16BIT_240320:
rCLKCON|=(1<<5);
rGPCUP=0x00000000; // Disable Pull-up register
rGPCCON=0xaaaaaaaa; //Initialize VD,LCDVF,VM,VFRAME,VLINE,VCLK,LEND
rGPDUP=0x00000000; //Enable Pull-up register
rGPDCON =0xaaaaaaaa; //Initialize VD
frameBuffer16BitTft240320=(U32 (*))LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// TFT LCD panel,16bpp TFT,ENVID=off
rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
rLCDCON4=(MVAL<<8)|(HSPW_240320);
rLCDCON5=(1<<11)|(1<<9)|(1<<8); //FRM5:6:5,HSYNC and VSYNC are inverted
rLCDSADDR1=(((U32)frameBuffer16BitTft240320>>22)<<21)|M5D((U32)frameBuffer16BitTft240320>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer16BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/1)<<11)|(LCD_XSIZE_TFT_240320/1);
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
//rLPCSEL&=(~7); // Disable LPC3600
rTCONSEL|=(7);
rTPAL=0; // Disable Temp Palette
break;
case MODE_TFT_1BIT_640480:.........
case MODE_TFT_8BIT_640480:..........
case MODE_TFT_16BIT_640480:..........
case MODE_TFT_24BIT_640480:...........
case MODE_TFT_1BIT_800600:.............
case MODE_TFT_8BIT_800600:................
case MODE_TFT_16BIT_800600:..............
default:break;
}
}
void Lcd_CstnOnOff(int onoff)
{
// 1:CSTN Panel on 0:CSTN Panel off //
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
rGPBUP=rGPBUP|(1<<5); // Pull-up disable
rGPBDAT=rGPBDAT&(~(1<<5))|(onoff<<5); // GPB5=On or Off
rGPBCON=rGPBCON&(~(3<<10))|(1<<10); //GPD9=output
}
void Lcd_EnvidOnOff(int onoff)
{
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}
void Lcd_Lpc3600Enable(void)
{
rTCONSEL &=~(7);
rTCONSEL |=(7); // 240320,Enable LPC3600
}
void Lcd_PowerEnable(int invpwren,int pwren)
{
//GPG4 is setted as LCD_PWREN
rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
//Enable LCD POWER ENABLE Function
rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3); // PWREN
rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN
}
void MoveViewPort(int type)
{
int vx=0,vy=0,vd;
vd=(type==MODE_STN_1BIT)*16+(type==MODE_STN_2BIT)*8+(type==MODE_STN_4BIT)*4
+(type==MODE_CSTN_8BIT)*2+(type==MODE_CSTN_12BIT)*4
+(type==MODE_TFT_1BIT_240320)*16+(type==MODE_TFT_8BIT_240320)*2+(type==MODE_TFT_16BIT_240320)*1
+(type==MODE_TFT_1BIT_640480)*16+(type==MODE_TFT_8BIT_640480)*2+(type==MODE_TFT_16BIT_640480)*1+(type==MODE_TFT_24BIT_640480)/2
+(type==MODE_TFT_1BIT_800600)*16+(type==MODE_TFT_8BIT_800600)*2+
(type==MODE_TFT_16BIT_800600)*1;
while(1)
{
/* switch(Uart_Getch())
{
case 'i':
if(vy>=vd)vy-=vd;
break;
case 'j':
if(vx>=vd)vx-=vd;
break;
case 'k':*/
//if((type==MODE_TFT_1BIT_800600)|(type==MODE_TFT_8BIT_800600)|(type==MODE_TFT_16BIT_800600))
/* if((type&0x4000)&&(type&0x400))
{
if(vx<=(SCR_XSIZE_TFT_800600-LCD_XSIZE_TFT_800600-vd))vx+=vd;
}
//else if((type==MODE_TFT_1BIT_640480)|(type==MODE_TFT_8BIT_640480)|
(type==MODE_TFT_16BIT_640480)|(type==MODE_TFT_24BIT_640480))
else if((type&0x4000)&&(type&0x200))
{
if(vx<=(SCR_XSIZE_TFT_640480-LCD_XSIZE_TFT_640480-vd))vx+=vd;
}
//else if((type==MODE_TFT_8BIT_240320)|(type==MODE_TFT_16BIT_240320))
else if((type&0x4000)&&(type&0x100))
{
if(vx<=(SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320-vd))vx+=vd;
}
//else if((type==MODE_CSTN_8BIT)|(type==MODE_CSTN_12BIT))
else if(type&0x2000)
{
if(vx<=(SCR_XSIZE_CSTN-LCD_XSIZE_CSTN-vd))vx+=vd;
}
else
{
if(vx<=(SCR_XSIZE_STN-LCD_XSIZE_STN-vd))vx+=vd;
}
// break;*/
// case 'm':
if((type&0x4000)&&(type&0x400))
{
if(vy<=(SCR_YSIZE_TFT_800600-LCD_YSIZE_TFT_800600-vd))vy+=vd;
else if(vy == 592)vy+=8;
}
else if((type&0x4000)&&(type&0x200))
{
if(vy<=(SCR_YSIZE_TFT_640480-LCD_YSIZE_TFT_640480-vd))vy+=vd;
}
else if((type&0x4000)&&(type&0x100))
{
if(vy<=(SCR_YSIZE_TFT_240320-LCD_YSIZE_TFT_240320-vd))vy+=vd;
}
else if(type&0x2000)
{
if(vy<=(SCR_YSIZE_CSTN-LCD_YSIZE_CSTN-vd))vy+=vd;
}
else
{
if(vy<=(SCR_YSIZE_STN-LCD_YSIZE_STN-vd))vy+=vd;
}
// break;
// case '\r':
// return;
// default:
// break;
// }*/
//Uart_Printf("vx=%3d,vy=%3d\n",vx,vy);
Lcd_MoveViewPort(vx,vy,type);
}
}
void Lcd_MoveViewPort(int vx,int vy,int type)
{
U32 addr;
switch(type)
{
case MODE_STN_1BIT:.......................
case MODE_STN_2BIT:.....................
case MODE_STN_4BIT:..........................
case MODE_CSTN_8BIT:..........................
case MODE_CSTN_12BIT:.........................
case MODE_TFT_1BIT_240320:
SET_IF();
#if (LCD_XSIZE_TFT_240320<512)
while((rLCDCON1>>18)<=1); // if x<512
#else
while((rLCDCON1>>18)==0); // if x>512
#endif
addr=(U32)frameBuffer8BitTft240320+(vx/8)+vy*(SCR_XSIZE_TFT_240320/8);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320/8))>>1));
CLR_IF();
break;
case MODE_TFT_8BIT_240320:
SET_IF();
#if (LCD_XSIZE_TFT_240320<64)
while((rLCDCON1>>18)<=1); // if x<64
#else
while((rLCDCON1>>18)==0); // if x>64
#endif
addr=(U32)frameBuffer8BitTft240320+(vx/1)+vy*(SCR_XSIZE_TFT_240320/1);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320))>>1));
CLR_IF();
break;
case MODE_TFT_16BIT_240320:
SET_IF();
#if (LCD_XSIZE_TFT_240320<32)
while((rLCDCON1>>18)<=1); // if x<32
#else
while((rLCDCON1>>18)==0); // if x>32
#endif
addr=(U32)frameBuffer16BitTft240320+(vx*2)+vy*(SCR_XSIZE_TFT_240320*2);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1));
CLR_IF();
break;
case MODE_TFT_1BIT_640480:..........................
case MODE_TFT_8BIT_640480:.....................................
case MODE_TFT_16BIT_640480:.........................
case MODE_TFT_24BIT_640480:...............................
case MODE_TFT_1BIT_800600:.................................
case MODE_TFT_8BIT_800600:.........................................
case MODE_TFT_16BIT_800600:...................................
default:break;
}
}
void LCD2440_SetPixel(U32 x,U32 y,U32 c)
{
c = (c << 8 ) & 0xffffff00;
if(x<SCR_XSIZE_TFT_240320 && y<SCR_YSIZE_TFT_240320)
frameBuffer16BitTft240320[(y)][(x)]=( frameBuffer16BitTft240320[(y)][(x)]
& (0x0) | ( c&0xffffff00)); // | ( c&0x00ffffff)); LSB
}
int LCD2440_GetPixel(U32 x,U32 y)
{
return(frameBuffer16BitTft240320[(y)][(x)]);
}
int LcdInit(void)
{
Lcd_Init(MODE_TFT_16BIT_240320); //LCD初始化
Glib_Init(MODE_TFT_16BIT_240320);
Lcd_PowerEnable(0, 1); //上电
Lcd_EnvidOnOff(1);
SetBackground(0x00,0x00);
return(1);
}
本贴被 luojinwen 编辑过,最后修改时间:2008-10-31,19:30:11. Re 【64楼】 luojinwen :应该是LCD参数设置不对,你可以用这个初始化程序试试看:
static int LCD_Init(void)
{
// #define MVAL (13) //Def=13
#define MVAL_USED (1) //0=each frame 1=rate by MVAL
#define INVVCLK (0)
#define INVVLINE (1)
#define INVVFRAME (1)
#define INVVD (0)
#define INVVDEN (0) //0=normal 1=inverted
#define INVPWREN (0)
#define INVLEND (0)
#define BSWP (0) //Byte swap control
#define HWSWP (1) //Half word swap control
#define M5D(n) ((n) & 0x1fffff) // To get lower 21bits
#define HOZVAL_TFT (LCD_XSIZE-1)
#define LINEVAL_TFT (LCD_YSIZE-1)
#define HFPD (19)
#define HSPW (5)
#define HBPD (36)
#define VFPD (5)
#define VSPW (1)
#define VBPD (1)
#define CLKVAL_TFT (4) //7
//////////////////////
rCLKCON |=(1<<5);
rGPCUP=0x00000000; // Disable Pull-up register
rGPCCON=0xaaaaaaaa; //Initialize VD,LCDVF,VM,VFRAME,VLINE,VCLK,LEND
rGPDUP =0x00000000; //Enable Pull-up register
rGPDCON =0xaaaaaaaa; //Initialize VD
////
rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// TFT LCD panel,16bpp TFT,ENVID=off
rLCDCON2 = (VBPD<<24) | (LINEVAL_TFT<<14) | (VFPD<<6) | (VSPW);
rLCDCON3 = (HBPD<<19) | (HOZVAL_TFT<<8) | (HFPD);
rLCDCON4 = (13<<8) | (HSPW);
rLCDCON5 = (1<<11) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (INVVD<<7) | (INVVDEN<<6) | (1<<3) |(BSWP<<1)|(HWSWP<<0) ;
rLCDSADDR1=(((U32)LCD_Buffer>> 22) << 21) | ((M5D((U32)LCD_Buffer>> 1)) << 0);
rLCDSADDR2=M5D( ((U32)LCD_Buffer+(LCD_XSIZE*LCD_YSIZE*2))>>1 );
rLCDSADDR3=(((LCD_XSIZE-LCD_XSIZE)/1)<<11)|(LCD_XSIZE/1);
//rLCDSADDR3=(((SCR_XSIZE-LCD_XSIZE)/1)<<11)|(LCD_XSIZE/1);
// rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
// rLPCSEL&=(~7); // Disable LPC3600
rTPAL=0; // Disable Temp Palette
LCD_DispOnOff(1);
////
Uart_Printf(0,"LCD_Init Over!!!\n");
return 1;
} RE【65楼】 liuweiele
谢谢,总算弄好了,经过反复调试,改了以下参数
#define VBPD_240320 (1)
#define VFPD_240320 (5)
#define VSPW_240320 (1)
#define HBPD_240320 (10)
#define HFPD_240320 (19)
#define HSPW_240320 (5) NEC这个3.5寸LCD对比度不理想. 最近增加了支持32位色带Alpha通道的图片显示功能,使图标显示效果大有改善(可以完全实现 PNG图片的显示效果):
bbs_upload/files_11/ourdev_577564.jpg
(原文件名:IMAG0439.jpg)
bbs_upload/files_11/ourdev_577565.jpg
(原文件名:IMAG0440.jpg)
bbs_upload/files_11/ourdev_577566.jpg
(原文件名:IMAG0442.jpg)
bbs_upload/files_11/ourdev_577567.jpg
(原文件名:IMAG0444.jpg)
bbs_upload/files_11/ourdev_577568.jpg
(原文件名:IMAG0445.jpg)
Alpha混合算法实现代码:
U16 RGB565_Alpha(U16 FrColor,U16 BkColor ,U8 Alpha)
{
int R,G,B,R0,G0,B0,R1,G1,B1;
U32 Alpha0,Alpha1;
////
R0 =(FrColor>>11)&0x1f;
G0 =(FrColor>>5)&0x3f;
B0 =(FrColor&0x1f);
R1 =(BkColor>>11)&0x1f;
G1 =(BkColor>>5)&0x3f;
B1 =(BkColor&0x1f);
Alpha0 =256-Alpha;
Alpha1 =Alpha;
R =(R0*Alpha0+R1*Alpha1)>>8;
G =(G0*Alpha0+G1*Alpha1)>>8;
B =(B0*Alpha0+B1*Alpha1)>>8;
return RGB565(R,G,B);
}
本贴被 liuweiele 编辑过,最后修改时间:2009-01-07,23:31:48. 非常感谢LZ,,我在用TQ2440,,,学习中,,,,, 带Cache或MMU的ARM才厉害! 其它的不行~ 请教下楼主 液晶上的图标透明显示是如何实现的 也就是图标的背景颜色和桌面的背景颜色是一样的 使用Alpha通道 想问一下楼主,800x600的液晶,mini2440那板子能驱动么?点击此处下载 ourdev_595404.pdf(文件大小:128K) (原文件名:NL8060BC29-01.pdf) 这是液晶的资料。 可以驱动. lvds接口的液晶能驱动么?是不是还需要转换? 楼主这个用的操作系统是ucos?是哪家公司的GUI?开源的?谢谢! . 这不是uCOS,也没有用哪家的GUI 你这没有源码,只能算是向大家炫耀而已,有什么用呢??? 源码太大,传不上. LZ买的是友善之臂的板子吧 性价比还是很高的 不过这种GUI ucos跑不出来吧 【83楼】 keangel
为什么说这种GUI用ucos跑不出来呢?
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_601147.jpg
(原文件名:IMAG0568.jpg)
本贴被 liuweiele 编辑过,最后修改时间:2009-01-24,23:12:19. 很期待LZ的源码啊,或者介绍一下程序部分嘛 Mini2440呢
O(∩_∩)O哈哈~
喜欢
更喜欢你的UI源代码 再次回帖,期待源码!!!! 源码正在升级~ 楼主什么时候放源码出来啊 很期待学习学习 mark 周一刚买了MINI2440,试了下TFT,很不错,
然后试了下半透明效果,发现有时候读取像素数据的时候错误,
于是弄了个镜像缓冲区,这样可以保证读取数据的正确性,
¥%……¥%&…… 其实这块屏幕的对比度是可以调节的, 屏幕背面有个可调节电位器, 螺丝刀调节一下对比度会更好。
过几天再驱动一下800 * 600 的TFT看看, 这块屏幕的颜色非常好,是老笔记本上拆下来的。 调背光电压的 这块屏的对比度最大为70:1 【63楼】 liuweiele
一般是把程序烧到NAND 留出NOR来启动吧
可以使用NOR的A选项把程序烧写到NAND的0地址 然后拨到NAND启动 过一会儿就能启动了 这个我试过 可能代码拷贝到内存得花上几秒
楼主提供的源代码不全啊 GUI.h我就找不到!
我也是最近才开始裸奔 目前搞定了屏显示自己的图片 其他功能正在尝试中 希望楼主提供源代码研究一下! 裸奔好, 可以摸透硬件, 先玩几个月的裸奔先。
BTW: 那个电位器真的不是背光亮度的, 电位器调节的是COM引脚电压,
背光只有几个LED,且电位器阻值为10K,不可能用这么大的电阻去调节背光电流。
看手册里面的框图就知道了, 动手调节一下更可以看得出效果。 为什么我在ram中可以正常运行的程序,用hjtag下载到norflash中,程序就不运行了呢? 把启动信息发上来看看 我也是用mini2440,初学的,下来研究一下,谢谢了! MARK!!! 我成功的烧写到了S3C2440 的板子上
也是有显示开机画面的
但是进入主菜单
触摸屏幕没有反应
无法进入相应的菜单
请教下这可能是什么问题
和您一样的开发板友善的
谢谢