Oliver 发表于 2008-10-11 12:54:56

ARM7(LPC2104)模拟TFT-LCD(PSP)时序看见图片了【恢复】

最近有块ARM7板子玩弄,刚好有块480*272的PSP屏,可以试试.



ARM7没有LCD Driver,只好GPIO模拟时序了,勉强可以显示Flash中的图片.



电路是上次飞的面包板,http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=831940&bbs_page_no=1&search_mode=3&search_text=Oliver&bbs_id=9999



LPC2104内部PLL倍频到100MHZ,ARM的IO操作能力比较弱,因此智能刷频25HZ.



先上两张图.



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_447690.JPG

 (原文件名:DSC00141.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_447691.JPG

 (原文件名:DSC00143.JPG) 

Oliver 发表于 2009-1-22 01:06:45

新进度,互链一下:

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2199636&bbs_page_no=1&bbs_id=9999

qzzz 发表于 2008-12-8 22:50:04

路过,帮顶!

robinyuan 发表于 2008-12-8 22:41:23

非常谢谢!!!!

Oliver 发表于 2008-12-7 21:16:05

3 floors

robinyuan 发表于 2008-12-7 21:05:43

【19楼】 Oliver 



抱歉,我正在修改.因为昨晚只是个测试R5G6B5的程序,之后会传上来.不过是VB的,需要安装. 



图片大了取模会变得非常慢,如果你急请用我之前上传的. 



-----------------------------------------------------



Oliver给个地址吧,我没找到啊   

Oliver 发表于 2008-11-16 20:37:28

【33楼】 wgxrc:我也很想帮你看看,可最近我很多事物要处理,并且比较急,对不住了哈.



你可以初步计算一下,如果可行就先写个程序试试看.



如果你的控制器输出TFT时序同时还比较空闲的话就没问题.



对了,普通的DMA可对付不了TFT,必须同时得具备同步和时钟等信号的配合输出.



CPLD呢要能通问题不大,可要做稳定,精,形成产品的话还是好好磨练几年吧,几分种学会CPLD的是逗小孩的.

wgxrc 发表于 2008-11-16 19:52:23

PIC32有DMA,速度是80MHZ,1.5DMIPS/MHZ,你看一下行不?

Oliver 发表于 2008-11-16 19:42:21

我的CPLD板还是去年问ppa2001要的,嘿嘿,惭愧啊...



你可以咨询一下他还有无空板.



普通MCU的话还是放弃吧,我这块ARM都够呛,只能做到20HZ,标准60HZ的(ARM主频100MHZ).



PIC32估计也快不到哪里去的.放弃吧...必须得有硬件的DMA来完成.

wgxrc 发表于 2008-11-16 15:23:18

Oliver 你现在用的CPLD做个通用控制器板有没有多的,能不能卖我一块.

zjn8888 发表于 2008-11-16 12:21:58

NXP 的LPC2478,带LCD驱动,正好能用到480*272没有任何问题

Oliver 发表于 2008-10-12 12:01:38

9260啊?是不是少有的非BGA封装ARM,我是刚好有没用的EasyARM2104,所以试试,实际上CPU已经做不了任何事情了.



ARM9就简单多了,内部带硬件驱动器.



对了.如果有可能尽量用18位以上颜色.16位偏少.



有个问题就是存储器的分配...



用调色板转16位到18/24位明显也是不可行的.



还是把显存按24位分好.

ppa2001 发表于 2008-10-12 03:00:20

TO Oliver 

最近开始做AT9260.不过不怎么会~还的看看资料~英语难哈~

用LPC24XX驱动这屏效果不错,速度也不错的

用2410驱动过PSP,16位的,但颜色效果不好,后发现转接的排线有很大影响~

那种0.5mm间距的塑料排线明显比那种线排线颜色效果要好,

后发现别人的东西上,液晶排线上都套有磁环~看来排线的影响还是满大的~

本贴被 ppa2001 编辑过,最后修改时间:2008-10-12,03:14:27.

Oliver 发表于 2008-10-11 23:06:55

视频:

点击此处下载 ourdev_448930.rar(文件大小:9.88M) (原文件名:MOV00145.rar) 



【7楼】 155107149:

TAOBAO上买的,150左右,480*272,24位色的,



ARM9无所谓驱动不驱动那,因为本身带LCD控制器,



就是设置一下而已,可以直接享受成果了.

155107149 发表于 2008-10-11 22:30:05

强~

psp的屏哪来的?我想买块二手的屏(笔记本的不知道行不行,或者山寨机的),我有2410正打算学一下驱动lcd

Oliver 发表于 2008-10-11 22:29:01

ppa2001是看见我短信专门来捧场的?最近看你很少来活动,忙什么项目?



等会上段视频上来

ppa2001 发表于 2008-10-11 21:27:49

厉害哈,哈哈~

Oliver 发表于 2008-10-11 21:13:09

自己顶,嘿嘿

Oliver 发表于 2008-10-11 13:55:23

GetBmpDataourdev_447850.rar(文件大小:181K) (原文件名:pay500_78197.rar) 





彩色取模软件,我选择8位输出(R3G2B3),最后再用转换菜单把BMP数据转换成C格式.



这里有个问题,转化出来的数据多个h.



如0xff,0xcc,...变成0xffh,0xcch.



C编译器不认识,这时候用替换功能把"h,"替换成","就可以了.

本贴被 Oliver 编辑过,最后修改时间:2008-10-11,13:55:40.

Oliver 发表于 2008-10-11 13:48:48

简单程序

----------------------------------------

/*

lcd.h

*/



#ifndef __LCD_H__

#define        __LCD_H__



//p0.0~p0.7

//p0.2-r

//p0.3-g

//p0.4-b

#define        RGB_OUT                        IODIR |= 0x000000ff;

#define        RGB_DATA(x)    {IOCLR  = 0x000000ff;\

                                                IOSET  = x<<4;}



#define        VS_OUT                        IODIR |= 0x00000400                //p0.10

#define        VS_1                        IOSET  = 0x00000400

#define        VS_0                        IOCLR  = 0x00000400



#define        HS_OUT                        IODIR |= 0x00000800                //p0.11

#define        HS_1                        IOSET  = 0x00000800

#define        HS_0                        IOCLR  = 0x00000800



#define        CK_OUT                        IODIR |= 0x00001000                //p0.12

#define        CK_1                        IOSET  = 0x00001000

#define        CK_0                        IOCLR  = 0x00001000



#define        DISP_OUT                IODIR |= 0x00002000                //p0.13

#define        DISP_1                        IOSET  = 0x00002000

#define        DISP_0                        IOCLR  = 0x00002000



#define        VDD_EN_OUT                IODIR |= 0x00000100                //p0.8

#define        VDD_EN_1                IOSET  = 0x00000100

#define        VDD_EN_0                IOCLR  = 0x00000100





#define        CK_10                        {CK_1; CK_0; CK_1; CK_0; CK_1; CK_0; CK_1; CK_0; CK_1; CK_0;\

                                                 CK_1; CK_0; CK_1; CK_0; CK_1; CK_0; CK_1; CK_0; CK_1; CK_0;}



#define        CK_100                        {CK_10; CK_10; CK_10; CK_10; CK_10; CK_10; CK_10; CK_10; CK_10; CK_10;}



#define        NO_DIS_DATA                0x00





//x=0-479, y=0-271

extern void Dis(unsigned int x, unsigned int y, unsigned int x_wide, unsigned int y_hight, const unsigned char *p);

extern void Lcd_Init(void);



#endif



----------------------------------------------------------

/*

lcd.c

*/



#include "NXP/iolpc210x.h"  /* Defines Special function registers */

#include "intrinsics.h"



#include "lcd.h"

#include "EasyARM2104.h"



void Delay(void){

        unsigned long i;

        for(i=0; i<10000; i++){

                ;//_NOP();

        }

}



unsigned char dis_buf;



void Lcd_Line(void){

        unsigned int i;

        

        //hsync

        HS_0;

        //41 ck

        CK_10; CK_10; CK_10; CK_10;

        CK_1;  CK_0;

        HS_1;

        

        //2 ck

        CK_1; CK_0;

        CK_1; CK_0;

        

        //480 ck

        for(i=0; i<480; i++){

                CK_0;

                RGB_DATA(dis_buf);

                CK_1;

        }

        CK_0;

        

        //2 ck

        CK_1; CK_0;

        CK_1; CK_0;

}



//x=0-479, y=0-271

void Dis(unsigned int x, unsigned int y, unsigned int x_wide, unsigned int y_hight, const unsigned char *p){

        unsigned int i;

        unsigned int j;

        unsigned char k;

        

        //vsync

        VS_0;

        //10 line

        Lcd_Line(); Lcd_Line();

        Lcd_Line(); Lcd_Line();

        Lcd_Line(); Lcd_Line();

        Lcd_Line(); Lcd_Line();

        Lcd_Line(); Lcd_Line();

        VS_1;

        

        //2 line

        Lcd_Line();

        Lcd_Line();

        

        //272 line

        for(j=0; j<272; j++){

                if((j>=y) && (j<(y+y_hight))){

                        //480dot

                        for(i=0; i<480; i++){

                                if((i>=x) && (i<(x+x_wide ))){

                                        k = *p++;        //r

                                        

                                        //R3G2B3->R1G1B1

                                        dis_buf = 0;

                                        if((k & 0x07)>= 0x04)        //B3

                                                dis_buf = 0x04;

                                        

                                        if((k & 0x18)>= 0x10)        //G2

                                                dis_buf |= 0x02;

                                        

                                        if((k & 0xe0)>= 0x80)

                                                dis_buf |= 0x01;        //R3

                                }

                                else

                                        dis_buf = NO_DIS_DATA;

                        }

                }

                else{

                        for(i=0; i<480; i++)

                                dis_buf = NO_DIS_DATA;

                }

                

                Lcd_Line();

        }

        

        //2 line

        Lcd_Line();

        Lcd_Line();

        

        //disp

        DISP_1;

}



void Lcd_Init(void){

        VDD_EN_OUT;

        VDD_EN_0;

        

        DISP_OUT;

        DISP_0;

        

        RGB_OUT;

        RGB_DATA(0x00);

        

        VS_OUT;

        VS_0;

        

        HS_OUT;

        HS_0;

        

        CK_OUT;

        CK_0;

        

        VDD_EN_1;

        

        Delay();

        Delay();

        Delay();//>50ms

}





---------------------------------------

/*

main.c

*/

#include "NXP/iolpc210x.h"  /* Defines Special function registers */

#include "intrinsics.h"



#include "bmp.h"

#include "lcd.h"

#include "EasyARM2104.h"





void Init(void){

        __disable_interrupt();

        

        PINSEL0 = 0x00000000;

        PINSEL1 = 0x00000000;

        

        //ports

        KEY1_IN;

        KEY2_IN;

        KEY3_IN;

        KEY4_IN;

        KEY5_IN;

        KEY6_IN;

        

        Lcd_Init();

        

        //PLL

        //1.set

//        PLLCFG  = 0x60;        //0 11 00000 = *1,*16

//        PLLCFG  = 0x41;        //0 10 00001 = *2,*8

//        PLLCFG  = 0x42;        //0 10 00010 = *3,*8

//        PLLCFG  = 0x43;        //0 01 00011 = *4,*4

//        PLLCFG  = 0x44;        //0 01 00100 = *5,*4

//        PLLCFG  = 0x45;        //0 01 00101 = *6,*4

//        PLLCFG = 0x06;        //0 00 00110 = *7,*2

//        PLLCFG = 0x07;        //0 00 00110 = *8,*2

        PLLCFG = 0x08;        //0 00 00110 = *9,*2

//        PLLCFG = 0x09;        //0 00 01001 = *10,*2

        

        PLLFEED = 0xaa; PLLFEED = 0x55;

        

        //2.en

        PLLCON  = 0x01;        //PLL使能

        PLLFEED = 0xaa; PLLFEED = 0x55;

        

        //3.lock?

        while((PLLSTAT & 0x00000400) == 0x00000000);        //bit10(PLL LOCK)

        

        //4.con

        PLLCON  |= 0x02;        //PLL连接

        PLLFEED  = 0xaa; PLLFEED = 0x55;

        

        //system

        MAMCR        = 0x00;                //MAM控制寄存器

        //MAMTIM        = 0x09;                //MAM时序寄存器

        MAMTIM = 3/*2*/;

        MAMCR = 0x02;

        

        MEMMAP        = 0x01;                //存储器映射控制寄存器

        //MEMMAP = 0x02;

        

        PCON    = 0x00;                //功率控制寄存器(睡眠)

        PCONP         = 0x00000000;        //外设功率控制寄存器(模块关闭)

        

//        VPBDIV        = 0x00;                //VPB分频器寄存器1/4

        VPBDIV = 0x01;                //1:1

//        VPBDIV = 0x02;                // 1/2

        

        EXTINT         = 0x00;                //外部中断标志寄存器

        EXTWAKE = 0x00;                //外部中断唤醒寄存器

}



void main(void){

        unsigned char i;

        unsigned char j=20;

        

        Init();

        

        while(1){

                if(KEY1_STATE == 0)

                        j=50;

                if(KEY2_STATE == 0)

                        j=80;

                

                if(i <= j)

                        Dis(10, 10, 122, 96, &(I_F_U));

                else if(i <= j*2)

                        Dis(150, 150, 121, 96, &(shazhu));

                

                if(++i>= j*3)

                        i=0;

        }

}

Oliver 发表于 2008-10-11 13:00:07

忘了说了,因为面包板把R0-R7,G0-G7,B0-B7全部汇总成3根线了,因此只能显示RGB的8种颜色.

黑,红,绿,蓝,黄,紫,青,白.



如果硬件支持可以显示真彩,不过内存没这么大,图片数据现在是R3G2B3.256色的

wgxrc 发表于 2008-11-16 00:05:34

我就只要工业控制用就可以了.

wgxrc 发表于 2008-11-16 00:04:38

那请Oliver 推荐个带TFT控制器的ARM,以前没有接触过ARM,这次只能硬上了

Oliver 发表于 2008-11-15 22:50:18

抱歉,这个我也不是很清楚,一般通用控制器都是8色或者256色的,侧重点是应用于工业上.



很少看见真彩的.TFT控制器芯片好象有,但我没用过,如果你是用ARM的话或许简单些.

wgxrc 发表于 2008-11-15 22:43:41

那麻烦 Oliver 给我推荐个LCD driver的控制器,我想驱动一下这个TFT屏,样品已经过来了.呵呵

Oliver 发表于 2008-11-14 22:12:58

【22楼】 wgxrc :

抱歉我没用过PIC,如果没有LCD driver的控制器驱动TFT很困难的,即便是输出时序了,MCU也无暇干别的事情了.



我现在是中间用CPLD做个通用控制器,MCU通过总线操作SRAM.

wgxrc 发表于 2008-11-14 00:04:17

 请问Oliver 

如果我用PIC32能不能驱动这个屏?

Oliver 发表于 2008-10-14 12:16:13

【20楼】 tangfree:谢谢指点.



在好些资料上没看见这个备注,说明什么的.



AVR等若干带IIC的MCU没这个"BUG".IO就是IO,就算OC也是由程序选择或者烧程序时选择.



AVR没有这么高指令速度,存储器也没这么大,LPC2104和M128接近,可M128好象贵多了.

tangfree 发表于 2008-10-14 09:05:33

即便IIC被关了,工作在GPIO下,我告诉你它还是OC的。因为它的IO内部根本没有任何上拉,想用作IO,必须加上拉电阻。

Oliver 发表于 2008-10-13 22:48:46

【17楼】 robinyuan:抱歉,我正在修改.因为昨晚只是个测试R5G6B5的程序,之后会传上来.不过是VB的,需要安装.



图片大了取模会变得非常慢,如果你急请用我之前上传的.



【18楼】 hn_ny_dxs 夏风 :到现在为止也不知道是啥原因...

hn_ny_dxs 发表于 2008-10-13 22:22:59

可怜的ARM脑子转得挺快,腿脚却不灵活。

robinyuan 发表于 2008-10-13 22:01:57

嘿嘿,楼主杰作哦



24位取模软件能分享一下吗?

Oliver 发表于 2008-10-13 13:42:43

【15楼】 tangfree,当然...



我现在已经关闭所有第二地三功能了,通通工作在GPIO下,连SPI,IIC,TIMER.....的电源也关了.



这时候应该工作到推挽方式了...感觉莫名其妙的,有时不得不觉得AVR顺手.

tangfree 发表于 2008-10-13 09:42:06

所有的IIC都是OC的,不可能是推挽输出。

Oliver 发表于 2008-10-13 08:59:50

我要对24位bmp取出16位数据(B5G6R5)......之前的软件一打开24位就自动关了.并且只能打开BMP



我现在用picture.point取出X,Y像素的RGB值,转换16位输出到.txt文件

cctnt 发表于 2008-10-13 07:07:27

24位BMP不用取模

Oliver 发表于 2008-10-13 02:12:55

之前的图片为256色取模,找不到能打开24位BMP的取模软件,只能转成256色后取.



没办法自己写了个取模软件...



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_450450.JPG

 (原文件名:DSC00151.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_450451.JPG

 (原文件名:未命名.JPG) 

Oliver 发表于 2008-10-12 21:34:18

手上有ppa2001上次送的CPLD驱动PSP板,于是写了段CPLD程序把LCD的FPC端口映射到DIP,增加了颜色.



16位色图片:

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_450190.JPG

 (原文件名:DSC00147.JPG) 



PPA2001的PSP板到EASYARM2104的转接板:

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_450191.JPG

 (原文件名:DSC00148.JPG) 



全家福:

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_450192.JPG

 (原文件名:DSC00149.JPG) 



说来奇怪,LPC2104的P0.2,P0.3是IIC/PWM等的复用口,做GPIO的时候应该是推挽输出啊,结果是OC输出(没看见任何资料提到OC输出).



搞了一下午都没出线性红色,结果无意中把EEPROM的IIC跳线插上就好了.



晕,白忙活一下午...ARM的应用,资料比AVR/51什么的少多了.

v_8787 发表于 2010-4-22 17:36:27

2104能到100M?!还真没试过

zbjzxc 发表于 2010-4-22 17:52:17

顶~~

feixuehanyi 发表于 2010-5-25 20:07:55

advarx21ic 发表于 2021-4-3 17:35:39

挖到好货,可惜全部乱码
页: [1]
查看完整版本: ARM7(LPC2104)模拟TFT-LCD(PSP)时序看见图片了【恢复】