⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmp_show.c

📁 s3c2410 linux操作系统下LCD的驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "def.h"
#include "uart.h"
#include "2410lib.h"
#include "BMP_show.h"
#include "240_320TFT_LCD.h"
#include "nandflash_k9f1208.h"





//================================================================================================
// BITMAP_FILE_HEADER  BITMAP_FILE_HEADER_U16的区别是 结构体在内存中的表示 。BITMAP_FILE_HEADER占
// 16字节  BITMAP_FILE_HEADER_U16占14字节  原因是内存对齐。前一个以对齐,所以在其一个变量后补充半字
// 导致bmp头文件时出错。解决的方法是换成半字对齐的数据结构,不存在字节补充。
typedef struct  tagBITMAPFILEHEADER{
  U16   bfType;       //两字节的内容用来识别位图的类型:‘BM’ : Windows 3.1x, 95, NT, …
  U32   bfSize;       //表示的整个文件的大小
  U32   bfReserved1;
  U32   bfOffBits;     //从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 
}BITMAP_FILE_HEADER; 


typedef struct  tagBITMAPFILEHEADER_U16{ 
  U16   bfType;       //两字节的内容用来识别位图的类型:‘BM’ : Windows 3.1x, 95, NT, …
  U16   bfSizel;       //表示的整个文件的大小
  U16   bfSizeh;
  U16   bfReserved1l;
  U16   bfReserved1h; 
  U16   bfOffBitsl; 
  U16   bfOffBitsh;    //从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 
}BITMAP_FILE_HEADER_U16;  
//================================================================================================





//================================================================================================
typedef struct  tagBITMAPINFOHEADER {
    U32    biSize;     //下面的长度表示:28h - Windows 3.1x, 95, NT, …
    U32    biWidth;    //以像素为单位的图像宽度 
    U32    biHeight;   //以像素为单位的图像长度 
    U16    biPlanes; 
    U16    biBitCount; // 每个像素的位数 
    U32    biCompression;
    U32    biSizeImage;
    U32    biXPelsPerMeter;
    U32    biYPelsPerMeter;
    U32    biClrUsed;
    U32    biClrImportant;
}BITMAP_INFO_HEADER ;


typedef struct  tagBITMAPINFOHEADER_U32 {
    U32    biSize;     //下面的长度表示:28h - Windows 3.1x, 95, NT, …
    U32    biWidth;    //以像素为单位的图像宽度 
    U32    biHeight;   //以像素为单位的图像长度 
    U32    biPlanes_biBitCount; // 每个像素的位数 
    U32    biCompression;
    U32    biSizeImage;
    U32    biXPelsPerMeter;
    U32    biYPelsPerMeter;
    U32    biClrUsed;
    U32    biClrImportant;
}BITMAP_INFO_HEADER_U32;
//================================================================================================


//=============================================================================================
typedef struct rgb_24bit {// bmp主数据区按b ,g ,r 的顺序存放各像素的信息  8bit数据 为以后数据处理方便变为16bit
    U16 B;
    U16 G;
    U16 R;
    U16 NUMBER;
}RGB_24bit;

typedef struct rgb_16bit {
    U8 first;
    U8 second;
    U16 NUMBER;
}RGB_16bit;
//=============================================================================================




static BITMAP_FILE_HEADER  BITMAP_FILE_HEADER1;
static BITMAP_FILE_HEADER_U16  BITMAP_FILE_HEADER1_U16;
static BITMAP_INFO_HEADER  BITMAP_INFO_HEADER1;
static BITMAP_INFO_HEADER_U32  BITMAP_INFO_HEADER1_U32;

 
extern unsigned short LCD_BUFER[SCR_YSIZE_TFT_240_320][SCR_XSIZE_TFT_240_320];
extern U8 BMP_RAM_BUFFER[512*32];




static void Get_Bmp_Imformation(U8 *bmp_address)
 {  U8 *struct_address;
    int i;
    struct_address = (LPSTR)&BITMAP_FILE_HEADER1_U16;
    i = sizeof(BITMAP_FILE_HEADER_U16);
    
    
    for(; i>0; i--)   {           //将bmp文件信息考到结构体中。
         *(struct_address++) = *(bmp_address++);
    }
    BITMAP_FILE_HEADER1.bfType  =    BITMAP_FILE_HEADER1_U16.bfType;
    BITMAP_FILE_HEADER1.bfSize  =    BITMAP_FILE_HEADER1_U16.bfSizel + ( BITMAP_FILE_HEADER1_U16.bfSizeh<<16); 
    BITMAP_FILE_HEADER1.bfReserved1 =BITMAP_FILE_HEADER1_U16.bfReserved1l + ( BITMAP_FILE_HEADER1_U16.bfReserved1h<<16); 
    BITMAP_FILE_HEADER1.bfOffBits =  BITMAP_FILE_HEADER1_U16.bfOffBitsl + ( BITMAP_FILE_HEADER1_U16.bfOffBitsh<<16) ;

   
    
    struct_address = (LPSTR)&BITMAP_INFO_HEADER1_U32;
    i = sizeof(BITMAP_INFO_HEADER_U32);
    for(; i>0; i--)   {           //将bmp文件信息考到结构体中。
         *(struct_address++) = *(bmp_address++);
    }    
    BITMAP_INFO_HEADER1.biSize          =  BITMAP_INFO_HEADER1_U32.biSize;
    BITMAP_INFO_HEADER1.biWidth         =  BITMAP_INFO_HEADER1_U32.biWidth;
    BITMAP_INFO_HEADER1.biHeight        =  BITMAP_INFO_HEADER1_U32.biHeight;
    BITMAP_INFO_HEADER1.biPlanes        =  BITMAP_INFO_HEADER1_U32.biPlanes_biBitCount & 0xFFFF;
    BITMAP_INFO_HEADER1.biBitCount      =  (BITMAP_INFO_HEADER1_U32.biPlanes_biBitCount>>16);
    BITMAP_INFO_HEADER1.biCompression   =  BITMAP_INFO_HEADER1_U32.biCompression;
    BITMAP_INFO_HEADER1.biSizeImage     =  BITMAP_INFO_HEADER1_U32.biSizeImage;
    BITMAP_INFO_HEADER1.biXPelsPerMeter =  BITMAP_INFO_HEADER1_U32.biXPelsPerMeter;
    BITMAP_INFO_HEADER1.biClrUsed       =  BITMAP_INFO_HEADER1_U32.biClrUsed;
    BITMAP_INFO_HEADER1.biClrImportant  =  BITMAP_INFO_HEADER1_U32.biClrImportant;
     
 }











U32 Load_OnePageOf_BMP( U32  bmp_start_address){
    
    int bad_block;
    int i; 
    U8* bmp_start_address1 ;
    bmp_start_address1 =(U8*)bmp_start_address;
    if(bmp_start_address>=0x30000000 & bmp_start_address<=0x34000000 )
        {
          for(i=0;i<512;i++)  BMP_RAM_BUFFER[i]=*bmp_start_address1++;          
          bmp_start_address +=512;        
         }          
    else if(bmp_start_address<=0x04000000)
         {
          bad_block = ReadOnePageFromNandFlash(bmp_start_address,BMP_RAM_BUFFER);
          bmp_start_address +=512*(1 + bad_block*32);
         }    
    return bmp_start_address;    
}



U32 Load_OneBlockOf_BMP( U32  bmp_start_address){
    
    int bad_block;
    int i; 
    U8* bmp_start_address1 ;
    bmp_start_address1 =(U8*)bmp_start_address;
    if(bmp_start_address>=0x30000000 & bmp_start_address<=0x34000000 )
        {
          for(i=0;i<512*PAGE_PER_BLOCK;i++)  BMP_RAM_BUFFER[i]=*bmp_start_address1++;          
          bmp_start_address +=512*PAGE_PER_BLOCK;        
         }          
    else if(bmp_start_address<=0x04000000)
         {
          bad_block = ReadOneBlockFromNandFlash(bmp_start_address,BMP_RAM_BUFFER);
          bmp_start_address +=512*PAGE_PER_BLOCK*(1 + bad_block*32);
         }    
    return bmp_start_address;    
}


void Display_OnePageOf_BMP_24(void)
{    
    U8  blank; // Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.这一点相当重要 
    U16 x0,y0;
    U16 RGB_LCD; 
    U16 i; 
    static BMP_Piex_PerLine = 0;
    static BMP_Lines = 0 ;  
    static RGB_24bit RGB_24bit1; 
    static U16 FIRST_DISPLAY_ADDR=0; 
    static U8 first_time=0;
     
    if((BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 !=0 )  
       blank =4- (BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 ; 
    else blank=0; 
    x0 = (SCR_XSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biWidth)/2; //  求得bmp图片方的起始点,使图片在虚拟显示空间的当中。
    y0 = (SCR_YSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biHeight)/2;
      
    if (first_time == 0) {
         FIRST_DISPLAY_ADDR = BITMAP_FILE_HEADER1.bfOffBits;
         first_time =1;
         RGB_24bit1.NUMBER = 0; 
      }             
    for(i=FIRST_DISPLAY_ADDR;i<512;i++)
        {        
                  if(RGB_24bit1.NUMBER==0)     
                        {  RGB_24bit1.B = BMP_RAM_BUFFER[i];  RGB_24bit1.NUMBER++;}
                  else if(RGB_24bit1.NUMBER==1) 
                        {  RGB_24bit1.G = BMP_RAM_BUFFER[i];  RGB_24bit1.NUMBER++;}
                  else if(RGB_24bit1.NUMBER==2)
                        {  RGB_24bit1.R = BMP_RAM_BUFFER[i];  RGB_24bit1.NUMBER++;}
                  if(RGB_24bit1.NUMBER==3){  //do not use   else if
                        RGB_24bit1.NUMBER = 0;
                        RGB_LCD = ( RGB_24bit1.B >>3 ) | ((RGB_24bit1.G >>2)<<5) | ((RGB_24bit1.R >>3)<<11);                                        
                        LCD_BUFER[y0-BMP_Lines+BITMAP_INFO_HEADER1.biHeight-1][x0+BMP_Piex_PerLine]= RGB_LCD; 
                        BMP_Piex_PerLine ++;  
                           if(BMP_Piex_PerLine == BITMAP_INFO_HEADER1.biWidth){
                                BMP_Piex_PerLine=0;
                                BMP_Lines++;
                                if(BMP_Lines== BITMAP_INFO_HEADER1.biHeight) return ;
                                i += blank;
                                if(i>511) {  FIRST_DISPLAY_ADDR = i - 512;   return ; } 
                           } 
                        }                                                                                                        
      }//end for
    FIRST_DISPLAY_ADDR=0;
}



void Display_OneBlockOf_BMP_24(void)
{    
    U8  blank; // Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.这一点相当重要 
    U16 x0,y0;
    U16 RGB_LCD; 
    U16 i; 
    static BMP_Piex_PerLine = 0;
    static BMP_Lines = 0 ;  
    static RGB_24bit RGB_24bit1; 
    static U16 FIRST_DISPLAY_ADDR=0; 
    static U8 first_time=0;
     
     if((BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 !=0 )  
       blank =4- (BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 ; 
    else blank=0; 
    
    x0 = (SCR_XSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biWidth)/2; //  求得bmp图片方的起始点,使图片在虚拟显示空间的当中。
    y0 = (SCR_YSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biHeight)/2;
      
    if (first_time == 0) {
         FIRST_DISPLAY_ADDR = BITMAP_FILE_HEADER1.bfOffBits;
         first_time =1;
         RGB_24bit1.NUMBER = 0; 
      }             
    for(i=FIRST_DISPLAY_ADDR;i<512*PAGE_PER_BLOCK;i++)
        {        
                  if(RGB_24bit1.NUMBER==0)     
                        {  RGB_24bit1.B = BMP_RAM_BUFFER[i];  RGB_24bit1.NUMBER++;}
                  else if(RGB_24bit1.NUMBER==1) 
                        {  RGB_24bit1.G = BMP_RAM_BUFFER[i];  RGB_24bit1.NUMBER++;}
                  else if(RGB_24bit1.NUMBER==2)
                        {  RGB_24bit1.R = BMP_RAM_BUFFER[i];  RGB_24bit1.NUMBER++;}
                  if(RGB_24bit1.NUMBER==3){  //do not use   else if
                        RGB_24bit1.NUMBER = 0;
                        RGB_LCD = ( RGB_24bit1.B >>3 ) | ((RGB_24bit1.G >>2)<<5) | ((RGB_24bit1.R >>3)<<11);                                        
                        LCD_BUFER[y0-BMP_Lines+BITMAP_INFO_HEADER1.biHeight-1][x0+BMP_Piex_PerLine]= RGB_LCD; 
                        BMP_Piex_PerLine ++;  
                           if(BMP_Piex_PerLine == BITMAP_INFO_HEADER1.biWidth){
                                BMP_Piex_PerLine=0;
                                BMP_Lines++;
                                if(BMP_Lines== BITMAP_INFO_HEADER1.biHeight) return ;
                                i += blank;
                                if(i>512*PAGE_PER_BLOCK-1) {  FIRST_DISPLAY_ADDR = i - 512*PAGE_PER_BLOCK;   return ; } 
                           } 
                        }                                                                                                        
      }//end for
    FIRST_DISPLAY_ADDR=0;
}

void Display_OnePageOf_BMP_16(void)
{    
    U8  blank; // Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.这一点相当重要 
    U16 x0,y0;
    U16 RGB_LCD; 
    U16 i; 
    static BMP_Piex_PerLine = 0;
    static BMP_Lines = 0 ;  
    static RGB_16bit RGB_16bit1; 
    static U16 FIRST_DISPLAY_ADDR=0; 
    static U8 first_time=0;
     
    if((BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 !=0 )  
       blank =4- (BITMAP_INFO_HEADER1.biWidth*BITMAP_INFO_HEADER1.biBitCount/8) % 4 ; 
    else blank=0;  
    x0 = (SCR_XSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biWidth)/2; //  求得bmp图片方的起始点,使图片在虚拟显示空间的当中。
    y0 = (SCR_YSIZE_TFT_240_320 - BITMAP_INFO_HEADER1.biHeight)/2;
      
    if (first_time == 0) {
         FIRST_DISPLAY_ADDR = BITMAP_FILE_HEADER1.bfOffBits;
         first_time =1;
         RGB_16bit1.NUMBER = 0; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -