日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/4/5 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

展開全部

辦法,只有你懂!你能不能貼出你的程序,給32313133353236313431303231363533e59b9ee7ad9431333264643733我們參考參考呢?

LCD裸機(jī)驅(qū)動(dòng)程序流程:

一、LCD初始化:

1、端口初始化:設(shè)置GPC和GPD為LCD輸出端口模式

2、顯示模式初始化:

LCDCON1:選擇BBP(位每像素)模式、選擇顯示模式、決定VLCK頻率

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

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

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

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

3、幀緩初始化:設(shè)置幀緩沖器的起始地址、結(jié)束地址、虛擬屏

4、LCD其他雜項(xiàng)設(shè)置:屏蔽中斷、調(diào)色板、禁止LPC3600/LCC3600模式

5、LCD開啟和關(guān)閉:LCDCON1的第0位置1即可開啟LCD

二、LCD顯示:由于一幀中有240*320個(gè)像素點(diǎn),每個(gè)像素點(diǎn)都有一個(gè)值(0-255),那么把每個(gè)像素點(diǎn)的值送到幀緩沖器中,即可實(shí)現(xiàn)顯示功能。 如果想顯示圖片的話,需要把一張圖片轉(zhuǎn)化成數(shù)據(jù),然后在程序中把每一個(gè)像素點(diǎn)送到幀緩沖器即可。

源程序:

//Main.c

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

實(shí)驗(yàn)環(huán)境:mini2440開發(fā)板

完成時(shí)間:2011,4,15

作者:阿龍

實(shí)現(xiàn)功能:在LCD上進(jìn)行顯示

遇到的問題:

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

#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[];

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

函數(shù)聲明

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

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

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

主函數(shù)

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

void Main(void)

{

/*時(shí)鐘初始化*/

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其他雜項(xiàng)屏蔽和處理*/

MASK();

/*LCD開啟和關(guān)閉*/

Lcd_EnvidOnOff(1);

}

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

LCD端口初始化

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

void LCD_port_init(void)

{

rGPCCON = 0xaaaa02a8; //設(shè)置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:行數(shù));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:列數(shù));bit[7:0](19:HFPD)*/

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

/*bit[15:8](13:MVAL,只有當(dāng)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: 視頻幀緩沖區(qū)內(nèi)存地址30-22位。 LCDBASEU: 視頻幀緩沖區(qū)的開始地址21-1位

LCDBASEL: 視頻幀緩沖區(qū)的結(jié)束地址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:虛擬屏幕一行的字節(jié)數(shù),如果不使用虛擬屏幕,設(shè)置為實(shí)際屏幕的行字節(jié)數(shù)

OFFSIZE:虛擬屏幕左側(cè)偏移的字節(jié)數(shù),如果不使用虛擬屏幕,設(shè)置為*/

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

rLCDSADDR3 = LCD_WIDTH;

}

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

對LCD其他的一些屏蔽和處理

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

void MASK(void)

{

/*屏蔽中斷*/

rLCDINTMSK |= 3;

rTCONSEL &= (~7);

/*disable調(diào)色板*/

rTPAL = 0x0;

/*禁止LPC3600/LCC3600模式*/

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

}

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

LCD的開啟與關(guān)閉函數(shù)

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

static void Lcd_EnvidOnOff(int onoff)

{

if(onoff==1)

rLCDCON1|=1; // ENVID=ON

else

rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off

}

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

LCD顯示函數(shù)

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

void TFT_LCD_Show(void)

{

/*紅(255:0:0);綠(0:255:0);藍(lán)(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全屏填充顏色函數(shù)

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

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;

}

}

}

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

時(shí)鐘頻率設(shè)置

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

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位數(shù)!

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;

本回答由網(wǎng)友推薦

已贊過

已踩過<

你對這個(gè)回答的評價(jià)是?

評論

收起

總結(jié)

以上是生活随笔為你收集整理的arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。