新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于s3c2440實現的裸機數碼相框

        基于s3c2440實現的裸機數碼相框

        作者: 時間:2016-11-11 來源:網絡 收藏
        實現數碼相框之前,要將圖片轉換為二進制數組,用的是Image2Lcd這個軟件。將軟件各選項與自己的開發板、寄存器中像素設置等設置成相同。如下圖:

        本文引用地址:http://www.104case.com/article/201611/316628.htm

        具體程序實現如下:

        #define U32 unsigned int
        #include "gImage_xiaogou.h"
        #include "ningbo.h"
        #include "tushu.h"
        #include "bailu.h"
        #include "yejing.h"

        #define M5D(n) ((n) & 0x1fffff) /*用于設置顯示緩存區時,取低21位地址*/

        #define rGPCCON (*(volatile unsigned *)0x56000020) /*定義LCD管腳VM、VLINE、VCLK、LEND等*/
        #define rGPCDAT (*(volatile unsigned *)0x56000024)
        #define rGPCUP (*(volatile unsigned *)0x56000028)

        #define rGPDCON (*(volatile unsigned *)0x56000030) /*24位數據信號線*/
        #define rGPDDAT (*(volatile unsigned *)0x56000034)
        #define rGPDUP (*(volatile unsigned *)0x56000038)

        #define rGPGCON (*(volatile unsigned *)0x56000060) /*中斷引腳,電源信號引腳*/
        #define rGPGDAT (*(volatile unsigned *)0x56000064)
        #define rGPGUP (*(volatile unsigned *)0x56000068)


        #define rLCDCON1 (*(volatile unsigned *)0x4d000000) /*LCD control 1*/
        #define rLCDCON2 (*(volatile unsigned *)0x4d000004) /*LCD control 2*/
        #define rLCDCON3 (*(volatile unsigned *)0x4d000008) /*LCD control 3*/
        #define rLCDCON4 (*(volatile unsigned *)0x4d00000c) /*LCD control 4*/
        #define rLCDCON5 (*(volatile unsigned *)0x4d000010) /*LCD control 5*/

        #define rLCDSADDR1 (*(volatile unsigned *)0x4d000014) /*STN/TFT Frame buffer start address 1*/
        #define rLCDSADDR2 (*(volatile unsigned *)0x4d000018) /*STN/TFT Frame buffer start address 2*/
        #define rLCDSADDR3 (*(volatile unsigned *)0x4d00001c) /*STN/TFT Virtual screen address set*/

        #define rLCDINTMSK (*(volatile unsigned *)0x4d00005c) /*LCD Interrupt mask*/
        #define rTCONSEL (*(volatile unsigned *)0x4d000060) /*LPC3600 Control --- edited by junon*/

        #define LCD_WIDTH 320 /*屏幕的寬*/

        #define LCD_HEIGHT 240 /*屏幕的高*/

        /*垂直同步信號的脈寬、后肩和前肩*/

        #define VSPW (3-1)
        #define VBPD (15-1)
        #define VFPD (12-1)

        /*水平同步信號的脈寬、后肩和前肩*/

        #define HSPW (30-1)/*LCDCON4中設置*/
        #define HBPD (38-1)
        #define HFPD (20-1)

        /*顯示尺寸*/

        #define LINEVAL (LCD_HEIGHT-1)
        #define HOZVAL (LCD_WIDTH-1)

        /*for LCDCON1*/

        #define CLKVAL_TFT 6 /*設置時鐘信號頻率為7.1M*/
        #define MVAL_USED 0 /*設置VM信號的信號反轉效率,用于STN LCD*/
        #define PNRMODE_TFT 3 /*設置LCD類型 TFT型LCD*/
        #define BPPMODE_TFT 13 /*24位TFT型LCD 24BPP*/

        /*for LCDCON5*/

        #define BPP24BL 0 /*32位數據表示24位顏色值時,低位數據有效,高8位無效*/
        #define INVVCLK 0 /*像素值在VCLK下降沿有效*/
        #define INVVLINE 1 /*翻轉HSYNC信號*/
        #define INVVFRAME 1 /*翻轉VSYNC信號*/
        #define INVVD 0 /*正常VD信號極性*/
        #define INVVDEN 0 /*正常VDEN信號極性*/
        #define PWREN 1 /*使能PWREN信號*/
        #define BSWP 0 /*顏色數據字節不交換*/
        #define HWSWP 0 /*顏色數據半字不交換*/

        /*定義顯示緩存區*/

        volatile U32 LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];

        /*延時程序*/

        void delay(int a)

        {

        int k;

        for(k=0;k

        ;

        }


        void paint(const unsigned char ch[])
        {

        int x,y ;
        int t=0;

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

        {

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

        {

        LCD_BUFFER[y][x] = (ch[t]<<16)|(ch[t+1]<<8)|(ch[t+2]);/*圖像為24位像素,圖像.h文件中都是8為數據,所以每次需要3個八位數據。*/
        t=t+3;

        }

        }

        }

        void Main(void)
        {

        //配置LCD相關引腳

        rGPCUP = 0x00000000;
        rGPCCON = 0xaaaa02a9; //1010 1010 1010 1010 0000 0010 1010 1001
        rGPDUP = 0x00000000;
        rGPDCON = 0xaaaaaaaa;

        rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE_TFT<<5)|(BPPMODE_TFT<<1)|0; /*設置LCD的類型、像素時鐘、設置像素位數、使能LCD信號的輸出。*/
        rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW); /*這個非常重要。設置垂直方向各信號時間參數。*/
        rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD); /*設置水平方向各信號的時間參數*/
        rLCDCON4=(HSPW); /*設置HSYNC信號脈沖寬度*/
        rLCDCON5 = (BPP24BL<<12) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (0<<7) | (INVVDEN<<6) | (PWREN<<3) |(BSWP<<1) | (HWSWP);

        rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
        rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(LCD_WIDTH*LCD_HEIGHT*4))>>1 );
        rLCDSADDR3=LCD_WIDTH*32/16;
        /***************************************************************************************************************
        s3c2440中,寄存器LCDSADDR1和LCDSADDR2用于設置顯示緩存區,即把我們定義的那個二維數組告訴s3c2440。其中LCDBANK的9位數據指定LCD的BANK,
        即顯示緩存區的第30位到第22位地址;LCDBASEU的21位數據指定了LCD的基址,即顯示緩存區開始地址的第21位到第1位;LCDBASEL的21位數據指定了LCD的尾址,
        即顯示緩存區結束地址的第21位到第1位。例如,我們想要在尺寸為320×240的屏幕上顯示24位顏色,定義的顯示緩存區數組為LCD_BUFFER[240][320],
        則LCDBANK等于LCD_BUFFER的第30位到第22位數據值(因為LCD_BUFFER表示的就是數組的首地址),LCDBASEU等于LCD_BUFFER的第21位到第1位數據值,
        由于是用32位數據表示24為顏色,因此每個像素值是4個字節,所以LCDBASEL等于(LCD_BUFFER+(240×320×4))結果的第21位到第1位的數據值。
        另外寄存器LCDSADDR3有兩個內容:OFFSIZE和PAGEWIDTH。OFFSIZE用于虛擬屏幕的偏移長度,如果我們不使用虛擬屏幕,就把它置為0;PAGEWIDTH定義了視口的寬,
        單位是半字,如在上面的例子中,PAGEWIDTH應該為320×32÷16。

        ****************************************************************************************************************/
        rLCDINTMSK|=(3); /*屏蔽LCD中斷*/
        rTCONSEL = 0; /*無效LPC3600*/

        rGPGUP=rGPGUP&(~(1<<4))|(1<<4); /*GPG4上拉電阻無效*/
        rGPGCON=rGPGCON&(~(3<<8))|(3<<8); /*設置GPG4為LCD_PWREN*/
        rGPGDAT = rGPGDAT | (1<<4) ; /*GPG4置1 電源開關*/

        rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3); /*有效PWREN信號*/
        rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5); /*PWREN信號極性不翻*/
        rLCDCON1|=1; /*LCD開啟*/

        while(1)

        {

        paint(gImage_xiaogou);
        delay(5000000);
        paint(gImage_ningbo);
        delay(5000000);
        paint(gImage_tushu);
        delay(5000000);
        paint(gImage_bailu);
        delay(5000000);
        paint(gImage_yejing);
        delay(5000000);
        }

        }

        實現效果圖:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 恩平市| 南阳市| 眉山市| 财经| 易门县| 安庆市| 济源市| 神池县| 甘谷县| 西平县| 伊吾县| 新丰县| 东莞市| 汽车| 平凉市| 玉龙| 论坛| 石屏县| 富顺县| 眉山市| 涟源市| 乌拉特前旗| 永泰县| 汾阳市| 仲巴县| 茶陵县| 抚松县| 万山特区| 万年县| 平远县| 抚顺县| 紫金县| 尚志市| 电白县| 沙河市| 万载县| 苍梧县| 大港区| 故城县| 山东省| 弥渡县|