ARM9(S3C2440) LCD

发布者:RadiantGaze最新更新时间:2022-04-22 来源: eefocus关键字:ARM9  S3C2440  LCD 手机看文章 扫描二维码
随时随地手机看文章

LCD是liquid crystal display 的简称,液晶显示器按驱动方式分为静态驱动,简单矩阵驱动以及主动矩阵驱动。


简单矩阵驱动分为扭转向列型(TN)和超扭转向列型(STN)两种。


主动矩阵驱动则以TFT为主。


 (1)、 TN型驱动液晶,是LCD中最基本的,其他LCD都以TN型改进。他只能将入射光旋转90度,视角只有30度,色彩单一,对比度低,用于电子表和电子计算机。


(2)、 STN型驱动液晶。可将入射光旋转180度至270度,也改善了视角,通过塔配色滤光片,将单色矩阵的任意像素分成3个子像素,红绿蓝。


(3)、1,2都采用场电压驱动方式,如果现实尺寸加大,中心部分对电极变化的反应时间就会变长,显示器的速度跟不上,为了解决这个问题,主动矩阵驱动TFT


被提出,他通过晶体管显示信号开启或者关闭液晶分子电压,从而避免了显示器对电场效应的依靠。


LCD颜色显示


显示器上的每个像素的颜色都有3部分组成:


红绿蓝。他们被称为三原色。


这三者的混合几乎可以产生出任何我们能识别的颜色。比如根据颜色的浓烈程度将三原色都分为256个级别(0~255),混合255级的红色,255级的绿色,255级的蓝色,可以产生出白色。

LCD系统结构

S3C2440LCD控制器

LCD控制器

(1)、REGBANK有17个可编程寄存器组成,用来配置LCD控制器的各项参数。


(2)、LCDCDMA是专用DMA通道,自动从帧缓冲中传输视频数据到LCD控制器,利用DMA,视频数据可不经过CPU干扰就显示在屏幕上。


(3)、VIDPRCS接受从LCDCDMA来的视频数据并在将其改变到适合数据格式后经VD[23:0]将之送到LCD驱动器。


(4)、TIMEGEN产生LCD屏所需要的VFRAME,VLINE,VCLK,VM等控制信号。


时序图

(1)、VSYNV:帧同步信号


每发出一个脉冲,表示新的一屏图像数据开始传送。


(2)、HSYNC:行同步信号


每发出一个脉冲,表示新的一行图像数据开始传输。


(3)、VCLK:像素时钟信号


每发出一个脉冲,表示新的一个点图像数据开始传送。


(4)、LEND:行结束信号


 (5)、VBPD:表示在一帧图像开始时,帧同步信号以后的无效的行数,对应驱动中的upper_margin;


(6)、VFBD:表示在一帧图像结束后,帧同步信号以前的无效的行数,对应驱动中的lower_margin;


(7)、VSPW:表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;


(8)、HBPD:表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,对应驱动中的left_margin


(9)、HFPD:表示一行的有效数据结束到下一个水平同步信号开始逐渐的VCLK的个数,对应驱动中的right_margin


(10)、HSPW:表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len


(11)、通过VM信号改变控制像素点的显示或者熄灭


驱动程序流程

初始化流程

端口初始化

显示模式-LCDCON1

 

 

帧缓冲初始化

  

 

 

代码:


#define GLOBAL_CLK  1

#include

#include

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"


 


#define LCD_N35 //NEC 256K色240*320/3.5英寸TFT真彩液晶屏,每一条水平线上包含240个像素点,共有320条这样的线


#if defined(LCD_N35)


#define LCD_WIDTH 240

#define LCD_HEIGHT 320

#define LCD_PIXCLOCK 4


#define LCD_RIGHT_MARGIN 39

#define LCD_LEFT_MARGIN 16

#define LCD_HSYNC_LEN 5


#define LCD_UPPER_MARGIN 1

#define LCD_LOWER_MARGIN 5

#define LCD_VSYNC_LEN 1


#endif


void TFT_LCD_Test(void);


#define LCD_XSIZE  LCD_WIDTH

#define LCD_YSIZE  LCD_HEIGHT

#define SCR_XSIZE  LCD_WIDTH

#define SCR_YSIZE  LCD_HEIGHT


volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];  //定义320行,240列的数组,用于存放显示数据


              //320*240*2为帧缓冲大小,320×240等于点,每个点是2个字节


extern unsigned char sunflower_240x320[];


#define M5D(n) ((n)&0x1fffff)

#define LCD_ADDR ((U32)LCD_BUFFER)


#define ADC_FREQ 2500000


volatile U32 preScaler;


static void cal_cpu_bus_clk(void);

void Set_Clk(void);


/*演示函数*/

void delay(int times)

{

    int i,j;

    for(i=0;i       for(j=0;j<400;j++);

}


/*在屏幕上画图*/

static void Pait_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)

{

    int x,y;

    U32 c;

    int p = 0;

 

    for( y = 0 ; y < l ; y++ )

    {

     for( x = 0 ; x < h ; x++ )

     {

         c = bmp[p+1] | (bmp[p]<<8) ;


     if ( ( (x0+x) < SCR_XSIZE) && ( (y0+y) < SCR_YSIZE) )

         LCD_BUFFER[y0+y][x0+x] = c ;


         p = p + 2 ;      //一个点为两个字节

     } 

    }

}



/*填充全屏为某一颜色*/

static void Lcd_ClearScr( U16 c)

{

    unsigned int x,y ;

  

    for( y = 0 ; y < SCR_YSIZE ; y++ )

    {

     for( x = 0 ; x < SCR_XSIZE ; x++ )

     {

  LCD_BUFFER[y][x] = c ;  //填入数组,就自动在屏幕上显示了


} 

    }

}



/*LCD开关*/

static void Lcd_EnvidOnOff(int onoff)

{

    if(onoff==1)

 rLCDCON1|=1;              // ENVID=ON

    else

 rLCDCON1 =rLCDCON1 & 0x3fffe;  // ENVID Off

}


 

/*端口初始化*/

static void Lcd_Port_Init( void )

{

    rGPCUP=0xffffffff; // Disable Pull-up register

    rGPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK


    rGPDUP=0xffffffff; // Disable Pull-up register

    rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]

}


/*LCD初始化*/

static void LCD_Init(void)

{

 Lcd_Port_Init();


 /*显示模式初始化*/

 /*bit[17:8](4:CLKVAL);bit[6:5](11:TFT LCD panel);bit[4:1](1100:16 bpp for TFT)*/

 rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 <<  5) | (12 << 1);

 

 /*bit[31:24](1:VBPD);bit[23:14](320-1:行数);bit[13:6](5:VFPD);bit[5:0](1:VSPW)*/

    rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);

    

    /*bit[25:19](36:HBPD);bit[18:8](240-1:列数);bit[7:0](19:HFPD)*/

    rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH  - 1) <<  8) | (LCD_LEFT_MARGIN << 0);

    

    /*bit[15:8](13:MVAL,只有当LCDCON1 bit[7]MMODE=1才有效);bit[7:0](5:HSPW)*/

    rLCDCON4 = (13 <<  8) | (LCD_HSYNC_LEN << 0);

    

    /*bit[11](5:6:5 Format);bit[9](VLINE/HSYNC polarity inverted);bit[8](VFRAME/VSYNC inverted)

   bit[3](Enalbe PWERN signal),bit[1](half-word swap control bit)*/

 rLCDCON5   =  (1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0);

 

 

 


        /*帧缓冲地址初始化*/

 /*

 LCDBANK: 视频帧缓冲区内存地址30-22位

 LCDBASEU: 视频帧缓冲区的开始地址21-1位

 LCDBASEL: 视频帧缓冲区的结束地址21-1位

 */

 /*bit[29:21]:LCDBANK,bit[20:0]:LCDBASEU*/

     rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) <<  0);   //M5D为一个宏定义

    

     /*bit[20:0]:LCDBASEL*/

     rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);

   

   

     /*PAGEWIDTH:虚拟屏幕一行的字节数,如果不使用虚拟屏幕,设置为实际屏幕的行字节数

   OFFSIZE:虚拟屏幕左侧偏移的字节数,如果不使用虚拟屏幕,设置为0

 */

 /*bit[21:11]:OFFSIZE; bit[10:0]:PAGEWIDTH*/

     rLCDSADDR3 = LCD_WIDTH;       


 /*屏蔽中断*/

     rLCDINTMSK |= 3;

   rTCONSEL   &= (~7);

 

 /*disable调色板*/

    rTPAL = 0x0;

    

    /*禁止LPC3600/LCC3600模式*/

    rTCONSEL &= ~((1<<4) | 1);

    

    /*打开LCD*/

    Lcd_EnvidOnOff(1); 

}



void TFT_LCD_Show(void)

    /*红(255:0:0);绿(0:255:0);蓝(0:0:255);黑(0:0:0);白(255,255,255)*/

 

    /*在屏幕上显示三基色*/

 

    Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00)  )  ;  //clear screen black

    delay(10000);

  

    Lcd_ClearScr((0x1f<<11) | (0x00<<5) | (0x00));   //red

    delay(10000);

  

    Lcd_ClearScr((0x00<<11) | (0x3f<<5) | (0x00));   //green

    delay(10000);

   

    Lcd_ClearScr((0x00<<11) | (0x00<<5) | (0x1f));   //blue

    delay(10000);


    Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f)  )  ;  //clear screen white

    delay(10000);

 

    /*显示一副图片在屏幕上*/

    Pait_Bmp(0, 0, 240, 320, sunflower_240x320);

}

  


/*************************************************

Function name: Set_Clk()

Parameter    : void

Description  : 设置CPU的时钟频率

Return   : void

Argument     : void

Autor & date : Daniel

**************************************************/

void Set_Clk(void)

{

 int i;

 U8 key;

 U32 mpll_val = 0 ;

 i = 2 ;              //don't use 100M!

                   //boot_params.cpu_clk.val = 3;

 switch ( i ) {

 case 0: //200

  key = 12;

  mpll_val = (92<<12)|(4<<4)|(1);

  break;

 case 1: //300

  key = 13;

  mpll_val = (67<<12)|(1<<4)|(1);

  break;

 case 2: //400

  key = 14;

  mpll_val = (92<<12)|(1<<4)|(1);

  break;

 case 3: //440!!!

  key = 14;

  mpll_val = (102<<12)|(1<<4)|(1);

  break;

 default:

  key = 14;

  mpll_val = (92<<12)|(1<<4)|(1);

  break;

 }

 

 //init FCLK=400M, so change MPLL first

 ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON

 ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit

 cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M

}

/*************************************************

Function name: cal_cpu_bus_clk

Parameter    : void

Description  : 设置PCLKHCLKFCLK的频率

Return   : void

Argument     : void

Autor & date : Daniel

**************************************************/

static void cal_cpu_bus_clk(void)

{

 static U32 cpu_freq;

    static U32 UPLL;

 

 U32 val;

 U8 m, p, s;

 

 val = rMPLLCON;

 m = (val>>12)&0xff;

 p = (val>>4)&0x3f;

 s = val&3;


 //(m+8)*FIN*2 不要超出32位数!

 FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1< 

 val = rCLKDIVN;

 m = (val>>1)&3;

 p = val&1; 

 val = rCAMDIVN;

 s = val>>8;

 

 switch (m) {

 case 0:

  HCLK = FCLK;

  break;

 case 1:

  HCLK = FCLK>>1;

  break;

 case 2:

  if(s&2)

   HCLK = FCLK>>3;

  else

   HCLK = FCLK>>2;

  break;

 case 3:

  if(s&1)

   HCLK = FCLK/6;

  else

   HCLK = FCLK/3;

  break;

 }

 

 if(p)

  PCLK = HCLK>>1;

 else

  PCLK = HCLK;

 

 if(s&0x10)

  cpu_freq = HCLK;

 else

  cpu_freq = FCLK;

  

 val = rUPLLCON;

 m = (val>>12)&0xff;

 p = (val>>4)&0x3f;

 s = val&3;

[1] [2]
关键字:ARM9  S3C2440  LCD 引用地址:ARM9(S3C2440) LCD

上一篇:ARM汇编语言与C/C++的混合编程
下一篇:ARM9(S3C2440) Touch Screen

推荐阅读最新更新时间:2024-11-13 06:41

国内LCD面板发展迅速,杉杉股份拟收购LG化学偏光片业务
据悉,宁波杉杉股份有限公司拟以超过 7.7 亿美元的基准购买价,通过增资的方式取得持股公司 70%股权,间接购买 LG 化学在中国大陆、中国台湾和韩国的 LCD 偏光片业务及相关资产。 目前,我国已成为全球最大、增长速度最快的 LCD 市场。受益于我国下游面板行业的迅速发展,作为面板的核心材料之一的偏光片需求量稳步增长。杉杉股份通过本次收购进入全球仅由少数几家公司主导的 LCD 偏光片市场,并继续维持原 LG 化学在 LCD 偏光片市场的领先地位,利用其关键解决方案及技术来扩大市场占有份额。 本次交易标的为 LG 化学旗下在中国大陆、中国台湾和韩国的 LCD 偏光片业务及相关资产,具体包括:(1)北京乐金 100%
[嵌入式]
国内<font color='red'>LCD</font>面板发展迅速,杉杉股份拟收购LG化学偏光片业务
51单片机温度+pwm控制风扇转速,且温度在LCD1602上显示
原理图如下: 源代码如下: #include reg52.h #include intrins.h #include define.h #include delay.h #include LCD1602.h #include DS18B20.h #include HL_alarm.h sbit KEY3 = P3^5; //定义开始/停止 void zhuan(); unsigned char timer1; //***********************************************************************/ void main() { if(
[单片机]
51单片机温度+pwm控制风扇转速,且温度在<font color='red'>LCD</font>1602上显示
LCD1602液晶显示模块深入详解之软件篇(AVR)
LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前是一番努力(PROTEUS上也是这么做的),光标出来之后就相对很容易了。 那初始化的流程是怎么样的呢?我们还是看看HD44780的数据手册吧,如下图所示: 可以看到,初始化的主要步骤如下: (1)上电:这特么也算是一个步骤么?是的!如果你用的是其它液晶模块,比如LCD12864,会发现有一个复位引脚,LCD1602是没有复位引脚的,HD44780本身已经有内部复位逻辑。上电后复位其实会做很多事情的,主要如下: a. 清除屏
[单片机]
<font color='red'>LCD</font>1602液晶显示模块深入详解之软件篇(AVR)
苹果、三星推波助澜 OLED手机面板3年后超越LCD
苹果(Apple) iPhone X在发表后,对OLED面板在智能手机应用上产生推波助澜的效果,加上可折叠式手机呼之欲出,更为OLED面板出货添加柴火,业界预估,OLED手机面板市占有可能在3年后超越LCD面板,而近2年产能则都将处于吃紧状态。   面板与消费性电子产品市场息息相关,在韩国业者的大力鼓吹下,OLED面板在电视与智能手机市场占有率节节攀升,而最近刚发表的iPhone X在小尺寸领域中,将是推升OLED面板比重的大功臣。   苹果除了首款OLED手机iPhone X即将上市外,业界传出2018年苹果有可能会推出3款iPhone新机种,包括采用OLED面板的5.85吋和6.46吋手机,以及1款6.05吋的LCD手机等,这
[手机便携]
ARM9微控制器的软硬件平台设计
嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统;后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的,并且需要在设计之间进行权衡优化,根据实际应用进行外扩和裁剪。 基于ARM926EJS内核的LPC3180内部集成了丰富的外设资源,为嵌入式系统构建提供了很大的设计空间。本文结合笔者开发LPC3180嵌入式平台的实际经验,将具体介绍该系统的实现、结构组成和实验结果。 1 LPC3180芯片特性介绍 LPC3180是Philips公司新推出的一款ARM9微控制器。它采用90nm工艺技术,片内集成ARM9EJS处理器内核,具有高计算性能、低功耗的特性,这使得在很多对
[单片机]
<font color='red'>ARM9</font>微控制器的软硬件平台设计
基于s3c2440的12864液晶驱动
12864是128*64点阵液晶模块的点阵数简称,业界约定俗成的简称。 一、液晶显示模块概述 12864A-1 汉字图形点阵液晶显示模块,可显示汉字及图形,内置 8192 个中文汉字(16X16 点阵,16*8=128,16*4=64,一行只能写 8 个汉字,4 行;、128 个字符(8X16 点阵)及 64X256 点阵显示 RAM(GDRAM))。 主要技术参数和显示特性: 电源:VDD 3.3V~+5V(内置升压电路,无需负压); 显示内容:128 列× 64 行(128 表示点数) 显示颜色:黄绿 显示角度:6:00 钟直视 LCD 类型:STN 与 MCU 接口:8 位或 4 位并行/3 位串行 配置 LED 背光
[单片机]
手机进入OLED时代 LG显示:公司将继续生产LCD屏幕
新浪科技讯 北京时间6月5日上午消息,苹果将会在未来的iPhone上使用OLED屏幕,但是屏幕生产商LG显示(LG Display)依然认为LCD屏幕依然能够带来营收。    LG显示认为,虽然苹果和三星等公司都已经开始在自家手机上使用OLED屏幕,但是明年LG显示的营收中依然会有相当一部分来自于LCD屏幕的销售。LG显示研发总监Yoon Soo-young表示,大规模生产智能手机屏幕是非常困难的事情。    LG显示的强项是生产大尺寸OLED,例如电视屏幕,而他们的竞争对手三星则更擅长于生产小尺寸OLED,也就是智能手机所用的屏幕。三星目前已经锁定了所有高端iPhone屏幕的订单。LG显示的OLED项目从来没有给该公司带来过利润
[手机便携]
基于嵌入式系统的LCD人机交互菜单设计
近年来,LCD显示器的普及和微处理器向大容量的发展使嵌入式系统的人机交互功能得到了显著的提高。在很多场合下,良好的图形用户界面(GUI)和便捷的操作环境是影响产品成败的关键因素之一。如何充分利用成本低、资源少的单片机系统实现完善的人机交互功能已成为单片机设计者需要解决的一个问题。 目前,国内外许多先进的智能仪表不仅在测量精度和采样速率等方面有较高的性能指标,在人机交互的友好性方面也有许多独到之处。笔者在为德国TOX冲压技术有限公司研制智能压力监控仪的过程中,积累了一些嵌入式系统人机交互技术的没计经验。本文以此为实例,介绍其设计方法。 1 智能压力监控仪概述 智能压力监控仪是为德国TOX冲压技术有限公司研制的专用仪器。该
[单片机]
基于嵌入式系统的<font color='red'>LCD</font>人机交互菜单设计

推荐帖子

在子函数中关闭中断,回到主函数也是关闭的吧
在子函数中关闭中断,回到主函数也是关闭的吧如果不是,那是为什么呢谢谢在子函数中关闭中断,回到主函数也是关闭的吧_BIS_SR_IRQ(GIE);是什么意思他和_EINT();有什么不同还有一点问题你这个提问有点别扭首先要进中断GIE肯定要被置位因为GIE是SR寄存器里的一个位在中断之前SR是被圧栈的进入中断服务程序的时候GIE是自动关闭的(如果强行打开可能会出现中断嵌套)退出中断后SR被弹出所以恢复到进中断之前(还是置位的)。_BIS_SR_IRQ(GIE);这
yingguol 微控制器 MCU
找彩信外包
需要在arm9下的彩信收发功能。联系方式yuexianhanshu@yahoo.com找彩信外包只要彩信收发的程序,硬件已经有了找我们吧,刚做了6410下的彩信收发功能忘记了,联系QQ是:290052638
born 嵌入式系统
TM4C123GH6PZ单片机烧写HEX文件错误
用JFLASH烧写时出现如下错误:Endofpreparingflashprogramming-Startofdeterminingdirtyareasinflashcache-Endofdeterminingdirtyareas-CPUisrunningat15844kHz.-Startoferasingchip-Endoferasingchip-Startofrestoring-ERR
kbbwww1 微控制器 MCU
工业级4G路由器需要满足哪些要求
第一:通信接口的规范性  设计者在设计工业级4G路由器过程中要求设备模块化结构之间的通信接口要规范化,工业级4G路由器模块的维护与更新以及新模块的追加都不应影响元件其他通信模块。此外,工业4G路由器软件应要具备较高的容错能力以至于一般小的软件故障不应引起各类严重的系统再启动。第二:相对的独立性  及其重要的是,性能稳定的工业级4G路由器设计过程中配置的数据与处理程序应具备相对的独立性,而配置数据的任何变更都不应引起设备运行版本程序的变更以利于处理程序与任何局的配置数据的相适
蓝先生 工控电子
开关电源设计(2本PDF),运算放大器指南(1本PDF)
精通开关电源设计(中文版)开关电源设计(第3版)运算放大器权威指南开关电源设计(2本PDF),运算放大器指南(1本PDF)thankyou!!! 很好的资料,非常感谢分享,楼主辛苦了,很受用! 非常感谢老师无私奉献,我个人也是新手刚刚接触,希望能够给我惊喜
cute1996 电子竞赛
电路板故障汇总及维修技术的8个绝招
一、工控电路板电容损坏的故障特点及维修电容损坏引发的故障在电子设备中是最高的,其中尤其以电解电容的损坏最为常见。电容损坏表现为:容量变小;完全失去容量;漏电;短路。电容在电路中所起的作用不同,引起的故障也各有特点。在工控电路板中,数字电路占绝大多数,电容多用做电源滤波,用做信号耦合和振荡电路的电容较少。用在开关电源中的电解电容如果损坏,则开关电源可能不起振,没有电压输出;或者输出电压滤波不好,电路因电压不稳而发生逻辑混乱,表现为
吾妻思萌 开关电源学习小组
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved