arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题
展開全部
辦法,只有你懂!你能不能貼出你的程序,給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裸机不能正确显示图片的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: learnpython有中文版吗_简介
- 下一篇: maven 加入第三方库_maven加载