展开全部

办法,只有你懂!你能不能贴出你的程序,给32313133353236313431303231363533e59b9ee7ad9431333264643733我们参考参考呢?

LCD裸机驱动程序流程:

一、LCD初始化:

1、端口初始化:设置GPC和GPD为LCD输出端口模式

2、显示模式初始化:

LCDCON1:选择BBP(位每像素)模式、选择显示模式、决定VLCK频率

LCDCON2:bit[31:24](1:VPBD)、bit[23:14](320-1:行数)、bit[13:6](5:VFPD)、bit[5:0](1:VSPW)

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

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

LCDCON5:bit[11](5:6:5 Format)

3、帧缓初始化:设置帧缓冲器的起始地址、结束地址、虚拟屏

4、LCD其他杂项设置:屏蔽中断、调色板、禁止LPC3600/LCC3600模式

5、LCD开启和关闭:LCDCON1的第0位置1即可开启LCD

二、LCD显示:由于一帧中有240*320个像素点,每个像素点都有一个值(0-255),那么把每个像素点的值送到帧缓冲器中,即可实现显示功能。 如果想显示图片的话,需要把一张图片转化成数据,然后在程序中把每一个像素点送到帧缓冲器即可。

源程序:

//Main.c

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

实验环境:mini2440开发板

完成时间:2011,4,15

作者:阿龙

实现功能:在LCD上进行显示

遇到的问题:

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

#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 CLKVAL 4

#define LCD_LONG 320

#define LCD_WIDTH 240

#define LINEVAL LCD_LONG-1

#define LCD_YSIZE LCD_LONG

#define LCD_XSIZE LCD_WIDTH

#define LCD_UPPER_MARGIN 1

#define LCD_LOWER_MARGIN 5

#define LCD_VSYNC_LEN 1

#define LCD_RIGHT_MARGIN 39

#define LCD_LEFT_MARGIN 16

#define LCD_HSYNC_LEN 5

#define SCR_XSIZE LCD_XSIZE

#define SCR_YSIZE LCD_YSIZE

volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];

#define LCD_ADDR ((U32)LCD_BUFFER)

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

#define PAGEWIDE LCD_WIDTH

#define OFFSIZE 0

#define LCD_RIGHT_MARGIN 39

#define LCD_LEFT_MARGIN 16

#define LCD_HSYNC_LEN 5

#define ADC_FREQ 2500000

extern unsigned char sunflower_240x320[];

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

函数声明

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

void delay(int times);

void LCD_init(void);

void LCD_port_init(void);

void DisM_init(void);

void FraBuf_init(void);

void MASK(void);

static void Lcd_EnvidOnOff(int num);

void TFT_LCD_Show(void);

static void Lcd_ClearScr(U16 c);

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

void Set_Clk(void);

static void cal_cpu_bus_clk(void);

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

主函数

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

void Main(void)

{

/*时钟初始化*/

Set_Clk();

//MMU_Init(); //不能用MMU_Init()

/*LCD初始化*/

LCD_init();

/*LCD显示*/

TFT_LCD_Show();

}

void delay(int times)

{

int x,y;

for(x=times;x>0;x--)

for(y=400;y>0;y--);

}

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

LCD初始化

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

void LCD_init(void)

{

/*LCD端口初始化*/

LCD_port_init();

/*显示模式初始化*/

DisM_init();

/*LCD帧缓冲初始化*/

FraBuf_init();

/*LCD其他杂项屏蔽和处理*/

MASK();

/*LCD开启和关闭*/

Lcd_EnvidOnOff(1);

}

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

LCD端口初始化

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

void LCD_port_init(void)

{

rGPCCON = 0xaaaa02a8; //设置GPC为LCD模式

rGPCUP = 0xffffffff;

rGPDCON =0xaaaaaaa;

rGPCUP =0xffffffff;

}

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

LCD显示模式初始化

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

void DisM_init(void)

{

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

rLCDCON1 = (12<<1)|(3<<5)|(CLKVAL<<8); //选择BBP(位每像素)模式、选择显示模式、决定VCLK频率

/*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_YSIZE-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_XSIZE-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<<0)|(1<<3)|(1<<8)|(1<<9)|(1<<11);

}

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

LCD帧缓存寄存器初始化

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

void FraBuf_init(void)

{

/* 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);

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

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

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

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

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

rLCDSADDR3 = LCD_WIDTH;

}

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

对LCD其他的一些屏蔽和处理

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

void MASK(void)

{

/*屏蔽中断*/

rLCDINTMSK |= 3;

rTCONSEL &= (~7);

/*disable调色板*/

rTPAL = 0x0;

/*禁止LPC3600/LCC3600模式*/

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

}

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

LCD的开启与关闭函数

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

static void Lcd_EnvidOnOff(int onoff)

{

if(onoff==1)

rLCDCON1|=1; // ENVID=ON

else

rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off

}

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

LCD显示函数

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

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);

}

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

LCD全屏填充颜色函数

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

static void Lcd_ClearScr(U16 c)

{

unsigned int x,y;

for(y=0;y

for(x=0;x

{

LCD_BUFFER[y][x]=c; //把得到的值送到缓冲器中即可显示颜色

}

}

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

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;

}

}

}

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

时钟频率设置

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

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

}

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

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

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;

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

UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;

本回答由网友推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题相关推荐

  1. arm开发板放张图片动起来_如何看待第三届集成电路创新创业大赛arm杯北理在杯赛中居然可以在0.35s内播放完20张ppt?...

    感觉这比赛国赛比初赛还水,完全保密不说,作品不用检查的,明确看到有几个用了超规格的板子,显示用VGA或HDMI显示,也不检查ARM内核是否有移植进去,移植里是不是按在比赛要求有识别算法.就志愿者过来很 ...

  2. 嵌入式开发入门之经典 ARM开发板

    嵌入式开发入门之经典 开始进入嵌入式世界,真是一头雾水,不知道如何入手!也不知道该如何学习,学习什么,最近从网上转载这篇文章,对我启发很大,对于初始进入嵌入式的人们很有帮组,好多嵌入式大侠都说这是入门 ...

  3. arm开发板移植ALSA库与ALSA工具

    目录 首先我们需要下载两个所要用到的库文件(基于Ubuntu) 一:先配置ALSA库文件 1.先解压放到家目录下ALSA的源文件: 2.解压后进去解压得到的文件夹执行以下命令: 3.配置好以后执行 二 ...

  4. RV1109开发板ssh服务器移植到arm开发板

    RV1109开发板ssh服务器移植到arm开发板 ssh功能移植到RV1109开发板的,由于RV1109的SDK中,没有telnet功能,有时候adb功能在量产中需要关闭,避免造成设备留有漏洞,造成安 ...

  5. Firefly AIO-3399ProC ARM开发板环境配置过程

    一.硬件条件 Firefly AIO-3399ProC + Ubuntu18.04官方固件(5.11号) 二.修改python版本(选做) 讲一下我需要修改Python版本的原因,如果读者不需要的话, ...

  6. Friendly ARM开发板安装Linux系统教程

    友善之臂ARM9开发板安装Linux系统教程 前言:智能蘑菇房项目的运行环境是友善之臂ARM9开发板,所以需要在上面灌一个linux系统,下面我来简单介绍一下. 准备 读卡器 SD卡 串口线一根(US ...

  7. 中国嵌入式高端ARM开发板的江湖故事——详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局

    // Topic:中国嵌入式高端ARM开发板的江湖故事--详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局 //作者:gooogleman //版权:gooogleman  邮箱 ...

  8. 中国嵌入式高端ARM开发板的江湖故事 详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! // T ...

  9. 摄像头在liunx上的QT显示和OK6410 ARM开发板上的使用

    摄像头在liunx上的QT显示和OK6410 ARM开发板上的使用 发布者:旺旺雪饼   时间:2013-01-05 16:56:09 环境: Ubuntu10.04 arm linux OS: 3. ...

最新文章

  1. Android中View绘制流程以及invalidate()等相关方法分析
  2. Carbon和Polacode教程
  3. Java修炼之路——基础篇——数据类型
  4. ASP.NET MVC呼叫WCF Service的方法
  5. Java虚拟机(一)——内存管理
  6. 2. Anaconda下使用Pip或者conda安装库指南
  7. 基于随机优化算法的特征选择
  8. linux操作系统死机处理办法
  9. C++string基本概念
  10. PHP带头大哥的百宝囊!
  11. uniapp使用colorUI 组件
  12. fiddler+xpose_JustTrustMe: 解决app应用在开启抓包工具后无法联网问题
  13. Liunx 切换用户This account is currently not available
  14. python提取图片中的文字自动填表,python提取图片中的文字并生成word文档
  15. Unity多屏幕设置细节
  16. web前端开发技术期末考试_Web前端开发技术期末试题1
  17. 微信 语音转文字 java,微信语音转文字怎么操作?手把手教你,一秒钟搞定!
  18. 【郭东白架构课 模块二:创造价值】17|通用技能(下):架构师如何保障交付与沉淀知识?
  19. 工作居住证离职后应对
  20. 使用vue.js实现一款简易计算器可多则混合运算(加减乘除)

热门文章

  1. 数据挖掘Apriori算法
  2. linux内核 header.s,Linux启动代码header.S研究
  3. linux使用grep数字个数,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  4. 四边形可以分为几类_学习知识:四边形有几种类型
  5. mysql keepalived主主同步_KEEPALIVED+MYSQL主主同步=MYSQL高可用(HA)集群
  6. 猫狗识别——PyTorch
  7. 【DP】[ZJOI2008][HYSBZ/BZOJ1037]生日聚会Party
  8. darwin转发时,摄像机在3G和4G模式下的参数设置
  9. C#中动态加载和卸载DLL
  10. 使用DOS命令找到占用80端口的程序,关闭该程序