搜索
bottom↓
回复: 41

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

[复制链接]

出0入0汤圆

发表于 2008-10-11 12:54:56 | 显示全部楼层 |阅读模式
最近有块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.



先上两张图.





 (原文件名:DSC00141.JPG) 





 (原文件名:DSC00143.JPG) 

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2009-1-22 01:06:45 | 显示全部楼层
新进度,互链一下:

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

出0入0汤圆

发表于 2008-12-8 22:50:04 | 显示全部楼层
路过,帮顶!

出0入0汤圆

发表于 2008-12-8 22:41:23 | 显示全部楼层
非常谢谢!!!!

出0入0汤圆

 楼主| 发表于 2008-12-7 21:16:05 | 显示全部楼层
3 floors

出0入0汤圆

发表于 2008-12-7 21:05:43 | 显示全部楼层
【19楼】 Oliver 



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



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



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



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

出0入0汤圆

 楼主| 发表于 2008-11-16 20:37:28 | 显示全部楼层
【33楼】 wgxrc:我也很想帮你看看,可最近我很多事物要处理,并且比较急,对不住了哈.



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



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



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



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

出0入0汤圆

发表于 2008-11-16 19:52:23 | 显示全部楼层
PIC32有DMA,速度是80MHZ,1.5DMIPS/MHZ,你看一下行不?

出0入0汤圆

 楼主| 发表于 2008-11-16 19:42:21 | 显示全部楼层
我的CPLD板还是去年问ppa2001要的,嘿嘿,惭愧啊...



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



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



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

出0入0汤圆

发表于 2008-11-16 15:23:18 | 显示全部楼层
Oliver 你现在用的CPLD做个通用控制器板有没有多的,能不能卖我一块.

出0入0汤圆

发表于 2008-11-16 12:21:58 | 显示全部楼层
NXP 的LPC2478,带LCD驱动,正好能用到480*272没有任何问题

出0入0汤圆

 楼主| 发表于 2008-10-12 12:01:38 | 显示全部楼层
9260啊?是不是少有的非BGA封装ARM,我是刚好有没用的EasyARM2104,所以试试,实际上CPU已经做不了任何事情了.



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



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



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



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



还是把显存按24位分好.

出0入0汤圆

发表于 2008-10-12 03:00:20 | 显示全部楼层
TO Oliver 

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

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

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

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

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

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

出0入0汤圆

 楼主| 发表于 2008-10-11 23:06:55 | 显示全部楼层
视频:

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



【7楼】 155107149:

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



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



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

出0入0汤圆

发表于 2008-10-11 22:30:05 | 显示全部楼层
强~

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

出0入0汤圆

 楼主| 发表于 2008-10-11 22:29:01 | 显示全部楼层
ppa2001是看见我短信专门来捧场的?最近看你很少来活动,忙什么项目?



等会上段视频上来

出0入0汤圆

发表于 2008-10-11 21:27:49 | 显示全部楼层
厉害哈,哈哈~

出0入0汤圆

 楼主| 发表于 2008-10-11 21:13:09 | 显示全部楼层
自己顶,嘿嘿

出0入0汤圆

 楼主| 发表于 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.

出0入0汤圆

 楼主| 发表于 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[480];



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[0][0]));

                else if(i <= j*2)

                        Dis(150, 150, 121, 96, &(shazhu[0][0]));

                

                if(++i>= j*3)

                        i=0;

        }

}

出0入0汤圆

 楼主| 发表于 2008-10-11 13:00:07 | 显示全部楼层
忘了说了,因为面包板把R0-R7,G0-G7,B0-B7全部汇总成3根线了,因此只能显示RGB的8种颜色.

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



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

出0入0汤圆

发表于 2008-11-16 00:05:34 | 显示全部楼层
我就只要工业控制用就可以了.

出0入0汤圆

发表于 2008-11-16 00:04:38 | 显示全部楼层
那请Oliver 推荐个带TFT控制器的ARM,以前没有接触过ARM,这次只能硬上了

出0入0汤圆

 楼主| 发表于 2008-11-15 22:50:18 | 显示全部楼层
抱歉,这个我也不是很清楚,一般通用控制器都是8色或者256色的,侧重点是应用于工业上.



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

出0入0汤圆

发表于 2008-11-15 22:43:41 | 显示全部楼层
那麻烦 Oliver 给我推荐个LCD driver的控制器,我想驱动一下这个TFT屏,样品已经过来了.呵呵

出0入0汤圆

 楼主| 发表于 2008-11-14 22:12:58 | 显示全部楼层
【22楼】 wgxrc :

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



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

出0入0汤圆

发表于 2008-11-14 00:04:17 | 显示全部楼层
 请问Oliver 

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

出0入0汤圆

 楼主| 发表于 2008-10-14 12:16:13 | 显示全部楼层
【20楼】 tangfree:谢谢指点.



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



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



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

出0入0汤圆

发表于 2008-10-14 09:05:33 | 显示全部楼层
即便IIC被关了,工作在GPIO下,我告诉你它还是OC的。因为它的IO内部根本没有任何上拉,想用作IO,必须加上拉电阻。

出0入0汤圆

 楼主| 发表于 2008-10-13 22:48:46 | 显示全部楼层
【17楼】 robinyuan:抱歉,我正在修改.因为昨晚只是个测试R5G6B5的程序,之后会传上来.不过是VB的,需要安装.



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



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

出0入0汤圆

发表于 2008-10-13 22:22:59 | 显示全部楼层
可怜的ARM脑子转得挺快,腿脚却不灵活。

出0入0汤圆

发表于 2008-10-13 22:01:57 | 显示全部楼层
嘿嘿,楼主杰作哦



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

出0入0汤圆

 楼主| 发表于 2008-10-13 13:42:43 | 显示全部楼层
【15楼】 tangfree,当然...



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



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

出0入0汤圆

发表于 2008-10-13 09:42:06 | 显示全部楼层
所有的IIC都是OC的,不可能是推挽输出。

出0入0汤圆

 楼主| 发表于 2008-10-13 08:59:50 | 显示全部楼层
我要对24位bmp取出16位数据(B5G6R5)......之前的软件一打开24位就自动关了.并且只能打开BMP



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

出0入0汤圆

发表于 2008-10-13 07:07:27 | 显示全部楼层
24位BMP不用取模

出0入0汤圆

 楼主| 发表于 2008-10-13 02:12:55 | 显示全部楼层
之前的图片为256色取模,找不到能打开24位BMP的取模软件,只能转成256色后取.



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





 (原文件名:DSC00151.JPG) 





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

出0入0汤圆

 楼主| 发表于 2008-10-12 21:34:18 | 显示全部楼层
手上有ppa2001上次送的CPLD驱动PSP板,于是写了段CPLD程序把LCD的FPC端口映射到DIP,增加了颜色.



16位色图片:



 (原文件名:DSC00147.JPG) 



PPA2001的PSP板到EASYARM2104的转接板:



 (原文件名:DSC00148.JPG) 



全家福:



 (原文件名:DSC00149.JPG) 



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



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



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

出0入0汤圆

发表于 2010-4-22 17:36:27 | 显示全部楼层
2104能到100M?!还真没试过

出0入0汤圆

发表于 2010-4-22 17:52:17 | 显示全部楼层
顶~~

出0入0汤圆

发表于 2010-5-25 20:07:55 | 显示全部楼层

出0入0汤圆

发表于 2021-4-3 17:35:39 来自手机 | 显示全部楼层
挖到好货,可惜全部乱码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表