在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            基于ARM9的LCD程序編寫

            作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            人機(jī)交互是嵌入式系統(tǒng)必須具有的功能。比較簡單的人機(jī)交互有按鍵、LED、蜂鳴器,稍微
            復(fù)雜的有7 段數(shù)碼管和點(diǎn)陣。但如今這些都不能滿足人們的需求了,所以又出現(xiàn)了LCD
            觸摸屏技術(shù)。s3c2440 具有LCD 和觸摸屏接口,可以很好的連接LCD 和觸摸屏。這篇文章
            主要介紹TFT 型LCD 的用法。
            要想正確使用LCD,必須注意兩點(diǎn):1、時(shí)序;2、顯示緩存區(qū)。
            1、時(shí)序
            LCD 一般需要三個(gè)時(shí)序信號(hào):VSYNC、HSYNC 和VCLK。VSYNC 是垂直同步信號(hào),在每
            進(jìn)行一個(gè)幀(即一個(gè)屏)的掃描之前,該信號(hào)就有效一次,由該信號(hào)可以確定LCD 的場(chǎng)頻,
            即每秒屏幕刷新的次數(shù)(單位Hz)。HSYNC 是水平同步信號(hào),在每進(jìn)行一行的掃描之前,
            該信號(hào)就有效一次,由該信號(hào)可以確定LCD 的行頻,即每秒屏幕從左到右掃描一行的次數(shù)
            (單位Hz)。VCLK 是像素時(shí)鐘信號(hào)。
            s3c2440 處理LCD 的時(shí)鐘源是HCLK,通過寄存器LCDCON1 中的CLKVAL 可以
            調(diào)整VCLK 頻率大小,它的公式為:
            VCLK=HCLK÷[(CLKVAL+1)×2]
            例如,HCLK 的頻率為100MHz,要想驅(qū)動(dòng)像素時(shí)鐘信號(hào)為6.4MHz 的LCD 屏,則通過上
            式計(jì)算CLKVAL 值,結(jié)果CLKVAL 為6.8,取整后(值為6)放入寄存器LCDCON1 中相
            應(yīng)的位置即可。由于CLKVAL 進(jìn)行了取整,因此我們把取整后的值代入上式,重新計(jì)算
            VCLK,得到VCLK=7.1MHz。
            按理說,對(duì)于一個(gè)已知尺寸(即水平顯示尺寸HOZVAL 和垂直顯示尺寸LINEVAL 已知)
            的LCD 屏,只要確定了VCLK 值,行頻和場(chǎng)頻就應(yīng)該知道了。但這樣還不行的,因?yàn)樵诿?br />一幀時(shí)鐘信號(hào)中,還會(huì)有一些與屏顯示無關(guān)的時(shí)鐘出現(xiàn),這就給確定行頻和場(chǎng)頻帶來了一定
            的復(fù)雜性。如在HSYNC 信號(hào)先后會(huì)有水平同步信號(hào)前肩(HFPD)和水平同步信號(hào)后肩
            (HBPD)出現(xiàn),在VSYNC 信號(hào)先后會(huì)有垂直同步信號(hào)前肩(VFPD)和垂直同步信號(hào)后
            肩(VBPD)出現(xiàn),在這些信號(hào)時(shí)序內(nèi),不會(huì)有有效像素信號(hào)出現(xiàn),另外HSYNC 和VSYNC
            信號(hào)有效時(shí),其電平要保持一定的時(shí)間,它們分別叫做水平同步信號(hào)脈寬HSPW 和垂直同
            步信號(hào)脈寬VSPW,這段時(shí)間也不能有像素信號(hào)。因此計(jì)算行頻和場(chǎng)頻時(shí),一定要包括這些
            信號(hào)。HBPD、HFPD 和HSPW 的單位是一個(gè)VCLK 的時(shí)間,而VSPW、VFPD 和VBPD 的
            單位是掃描一行所用的時(shí)間。在s3c2440 中,所有的這些信號(hào)(VSPW、VFPD、VBPD、
            LINEVAL、HBPD、HFPD、HSPW 和HOZVAL)都是實(shí)際值減1 的結(jié)果。這些值是通過寄
            存器LCDCON2、LCDCON3 和LCDCON4 來配置,只要把這些值配置成與所要驅(qū)動(dòng)的LCD
            中相關(guān)內(nèi)容的數(shù)據(jù)一致即可。例如,我們所要顯示的LCD 屏大小為320×240,因此HOZVAL
            =320-1,LINEVAL=240-1。水平同步信號(hào)的脈寬、前肩和后肩分別為30、20 和38,則
            HSPW=30-1,HFPD=20-1,HBPD=38-1;垂直同步信號(hào)的脈寬、前肩和后肩分別為
            3、12 和15,則VSPW=3-1,VFPD=12-1,VBPD=15-1。
            下面我們就具體計(jì)算一下行頻(HSF)和場(chǎng)頻(VSF):
            HSF=VCLK÷[(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)]
            =7.1÷408=17.5kHz
            VSF=HSF÷[(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)]
            =17.5÷270=64.8Hz
            在有些情況下,s3c2440 的LCD 時(shí)鐘信號(hào)的默認(rèn)極性與所控制的LCD 時(shí)鐘信號(hào)的極性相反,
            這時(shí)可以通過寄存器LCDCON5 的相關(guān)位來改變某些時(shí)鐘信號(hào)的極性。
            2、顯示緩存區(qū)
            只要把所要顯示的數(shù)據(jù)放入顯示緩存區(qū)內(nèi),就可以在屏幕上呈現(xiàn)內(nèi)容。該緩存區(qū)是
            我們自己編程時(shí)開辟的一段內(nèi)存區(qū)。一般我們是通過定義一個(gè)與屏幕尺寸大小相同的二維數(shù)
            組來開辟該空間的,這樣控制屏幕內(nèi)容會(huì)方便一些,如當(dāng)屏幕的尺寸為320×240 時(shí),可以
            定義該緩存區(qū)為LCD_BUFFER[240][320]。由于s3c2440 支持16 位和24 位的非調(diào)色板真彩
            色的TFT 型LCD 模式,而24 位顏色模式是用32 位數(shù)據(jù)來表示的,所以前面定義的那個(gè)二
            維數(shù)據(jù)的數(shù)據(jù)類型應(yīng)該是半字整型或全字整型的。例如,在24 位顏色模式下,我們想要在
            尺寸大小為320×240 屏幕的中心處設(shè)置為白色像素,則:LCD_BUFFER[120][160]=0xffffffff。
            在s3c2440 中,寄存器LCDSADDR1 和LCDSADDR2 用于設(shè)置顯示緩存區(qū),即把
            我們定義的那個(gè)二維數(shù)組告訴s3c2440。其中LCDBANK 的9 位數(shù)據(jù)指定LCD 的BANK,
            即顯示緩存區(qū)的第30 位到第22 位地址;LCDBASEU 的21 位數(shù)據(jù)指定了LCD 的基址,即
            顯示緩存區(qū)開始地址的第21 位到第1 位;LCDBASEL 的21 位數(shù)據(jù)指定了LCD 的尾址,即
            顯示緩存區(qū)結(jié)束地址的第21 位到第1 位。例如,我們想要在尺寸為320×240 的屏幕上顯示
            24 位顏色, 定義的顯示緩存區(qū)數(shù)組為LCD_BUFFER[240][320] , 則LCDBANK 等于
            LCD_BUFFER 的第30 位到第22 位數(shù)據(jù)值(因?yàn)長CD_BUFFER 表示的就是數(shù)組的首地址),
            LCDBASEU 等于LCD_BUFFER 的第21 位到第1 位數(shù)據(jù)值,由于是用32 位數(shù)據(jù)表示24 為
            顏色,因此每個(gè)像素值是4 個(gè)字節(jié),所以LCDBASEL 等于(LCD_BUFFER+(240×320×4))
            結(jié)果的第21 位到第1 位的數(shù)據(jù)值。另外寄存器LCDSADDR3 有兩個(gè)內(nèi)容:OFFSIZE 和
            PAGEWIDTH。OFFSIZE 用于虛擬屏幕的偏移長度,如果我們不使用虛擬屏幕,就把它置為
            0;PAGEWIDTH 定義了視口的寬,單位是半字,如在上面的例子中,PAGEWIDTH 應(yīng)該為
            320×32÷16。
            下面我們給出一段具體的TFT 型LCD 顯示的實(shí)例,其中,屏幕的大小為320×240,所設(shè)置
            的顏色為24 位真彩色模式。
            #define U32 unsigned int
            #define M5D(n) ((n) & 0x1fffff) //用于設(shè)置顯示緩存區(qū)時(shí),取低21 位地址
            #define rGPCCON (*(volatile unsigned *)0x56000020) //Port C control
            #define rGPCDAT (*(volatile unsigned *)0x56000024) //Port C data
            #define rGPCUP (*(volatile unsigned *)0x56000028) //Pull-up control C
            #define rGPDCON (*(volatile unsigned *)0x56000030) //Port D control
            #define rGPDDAT (*(volatile unsigned *)0x56000034) //Port D data
            #define rGPDUP (*(volatile unsigned *)0x56000038) //Pull-up control D
            #define rGPGCON (*(volatile unsigned *)0x56000060) //Port G control
            #define rGPGDAT (*(volatile unsigned *)0x56000064) //Port G data
            #define rGPGUP (*(volatile unsigned *)0x56000068) //Pull-up control G
            #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 //屏幕的高
            //垂直同步信號(hào)的脈寬、后肩和前肩
            #define VSPW (3-1)
            #define VBPD (15-1)
            #define VFPD (12-1)
            //水平同步信號(hào)的脈寬、后肩和前肩
            #define HSPW (30-1)
            #define HBPD (38-1)
            #define HFPD (20-1)
            //顯示尺寸
            #define LINEVAL (LCD_HEIGHT-1)
            #define HOZVAL (LCD_WIDTH-1)
            //for LCDCON1
            #define CLKVAL_TFT 6 //設(shè)置時(shí)鐘信號(hào)
            #define MVAL_USED 0 //
            #define PNRMODE_TFT 3 //TFT 型LCD
            #define BPPMODE_TFT 13 //24 位TFT 型LCD
            //for LCDCON5
            #define BPP24BL 0 //32 位數(shù)據(jù)表示24 位顏色值時(shí),低位數(shù)據(jù)有效,高8 位
            無效
            #define INVVCLK 0 //像素值在VCLK 下降沿有效
            #define INVVLINE 1 //翻轉(zhuǎn)HSYNC 信號(hào)
            #define INVVFRAME 1 //翻轉(zhuǎn)VSYNC 信號(hào)
            #define INVVD 0 //正常VD 信號(hào)極性
            #define INVVDEN 0 //正常VDEN 信號(hào)極性
            #define PWREN 1 //使能PWREN 信號(hào)
            #define BSWP 0 //顏色數(shù)據(jù)字節(jié)不交換
            #define HWSWP 0 //顏色數(shù)據(jù)半字不交換
            //定義顯示緩存區(qū)
            volatile U32 LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];
            //延時(shí)程序
            void delay(int a)
            {
            int k;
            for(k=0;k;
            }
            //繪制屏幕背景顏色,顏色為c
            void Brush_Background( U32 c)
            {
            int x,y ;
            for( y = 0 ; y < LCD_HEIGHT ; y++ )
            {
            for( x = 0 ; x < LCD_WIDTH ; x++ )
            {
            LCD_BUFFER[y][x] = c ;
            }
            }
            }
            //畫實(shí)心圓,顏色為c。圓心在屏幕中心,半徑為80 個(gè)像素
            void Draw_Circular(U32 c)
            {
            int x,y ;
            int tempX,tempY;
            int radius = 80;
            int SquareOfR = radius*radius;
            for( y = 0 ; y < LCD_HEIGHT ; y++ )
            {
            for( x = 0 ; x < LCD_WIDTH ; x++ )
            {
            if(y<=120 && x<=160)
            {
            tempY=120-y;
            tempX=160-x;
            }
            else if(y<=120&& x>=160)
            {
            tempY=120-y;
            tempX=x-160;
            }
            else if(y>=120&& x<=160)
            {
            tempY=y-120;
            tempX=160-x;
            }
            else
            {
            tempY = y-120;
            tempX = x-160;
            }
            if ((tempY*tempY+tempX*tempX)<=SquareOfR)
            LCD_BUFFER[y][x] = c ;
            }
            }
            }
            void Main(void)
            {
            //配置LCD 相關(guān)引腳
            rGPCUP = 0x00000000;
            rGPCCON = 0xaaaa02a9;
            rGPDUP = 0x00000000;
            rGPDCON=0xaaaaaaaa;
            rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE_TFT<<5)|(BPPMODE_TF
            T<<1)|0;
            rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);
            rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);
            rLCDCON4=(HSPW);
            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;
            rLCDINTMSK|=(3); // 屏蔽LCD 中斷
            rTCONSEL = 0; //無效LPC3480
            rGPGUP=rGPGUP&(~(1<<4))|(1<<4); //GPG4 上拉電阻無效
            rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //設(shè)置GPG4 為LCD_PWREN
            rGPGDAT = rGPGDAT | (1<<4) ; //GPG4 置1
            rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3); //有效PWREN 信號(hào)
            rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5); //PWREN 信號(hào)極性不翻轉(zhuǎn)
            rLCDCON1|=1; //LCD 開啟
            while(1)
            {
            //黑色背景,白色實(shí)心圓
            Brush_Background(0x0);
            Draw_Circular(0xffffff);
            delay(5000000);
            //白色背景,黑色實(shí)心圓
            Brush_Background(0xffffff);
            Draw_Circular(0x0);
            delay(5000000);
            //藍(lán)色背景,黃色實(shí)心圓
            Brush_Background(0xff);
            Draw_Circular(0xffff00);
            delay(5000000);
            //綠色背景,品色實(shí)心圓
            Brush_Background(0xff00);
            Draw_Circular(0xff00ff);
            delay(5000000);
            //紅色背景,青色實(shí)心圓
            Brush_Background(0xff0000);
            Draw_Circular(0xffff);
            delay(5000000);
            //青色背景,紅色實(shí)心圓
            Brush_Background(0xffff);
            Draw_Circular(0xff0000);
            delay(5000000);
            //品色背景,綠色實(shí)心圓
            Brush_Background(0xff00ff);
            Draw_Circular(0xff00);
            delay(5000000);
            //黃色背景,藍(lán)色實(shí)心圓
            Brush_Background(0xffff00);
            Draw_Circular(0xff);
            delay(5000000);
            }
            }


            關(guān)鍵詞: ARM9LCD程序編

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉