新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于單片機的VRAM型彩色液晶顯示模塊設計

        基于單片機的VRAM型彩色液晶顯示模塊設計

        作者: 時間:2011-10-14 來源:網絡 收藏
        4  軟件系統及實現

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

          4. 1  操作YD2502 的程序

          YD2502 的指令碼格式如下:

          其中: CA1 ,CA0 組合功能為內部寄存器通道的選擇,功能如下:

          DISP :顯示控制位。

          當DISP 設置為“1”時,為開顯示狀態。

          當DISP 設置為“0”時,為關顯示狀態。

          X:表示未用位,可設為“0”。

          ATmega128 訪問外部存儲器的軟件步驟是:先用extern 聲明一個外部變量,再用map2ping_init 函數(外部存儲地址分配函數) 分配給此變量一個外部存儲地址(因A Tmega128 內部有4 kB 的SRAM 所以外部存儲地址范圍為1000H~0FFFFH) ,那么對該變量的操作就實現了CPU 對相應地址的外部存儲空間的訪問。

        根據此步驟,對YD2502 寫指令和寫數據的具體函數如下:

          extern unsigned char LCD_DA TA ;

          void  mapping_init (void) {

          asm(“。 area memory (abs) n”

          “。 org 0x4000n ”  / / 分配給LCD_DA TA 的地址為4000H

          “ _LCD_DA TA : : . blkb 1 n”/ / 存儲空間為1

          “。 text/ n”) ;}

          寫指令函數如下:

          void  LCD_writeinstr (unsigned char data) {

          PORTD = 0xFC ;    / / 置/ CS 為低電平,并且置RS 為低電平,處于寫指令狀態

          LCD_DA TA = data ; / / 送數據

          PORTD | = 0x03 ;} / / 置/ CS 和RS為高電平

          寫數據函數如下:

          void  LCD_writedata (unsigned char data) {

          PORTD = 0xFE ;   / / 置/ CS 為低,并且置RS 為高電平,處于寫數據狀態

          LCD_DA TA = data ; / / 送數據

          PORTD | = 0x01 ;} / / 置/ CS 為高電平除了上面兩個基本的函數外,對YD2502 最基本的操作是往 里寫數據,根據上面給出的指令碼,具體函數如下:

          # define  HREG   0x09  / / 顯示地址高8 位寄存器指令

          # define  L REG 0x08 / / 顯示地址低8 位寄存器指令

          # define  DA TARW 0x0A / / 顯示數據讀寫通道指令

          void  LCD_filldata ( unsigned int address ,

          unsigned char data) {

          unsigned char addrh ,addrl ;

          addrh = (char) (address > > 8) ;  / / 取內存地址的高8 位數據

          addrl = (char) (address 0xFF) ;  / / 取內存地址的低8 位數據

          LCD_writeinst r ( HREG) ;  / / 送顯示地址高8 位寄存器指令

          LCD_writedata (addrh) ;  / / 送內存地址的高8 位數據

          LCD_writeinst r (L REG) ;  / / 送顯示地址低8 位寄存器指令

          LCD_writedata (addrl) ;  / / 送內存地址的低8 位數據

          LCD_writeinst r (DA TARW) ;  / / 送顯示數據讀寫通道指令

          LCD_writedata (data) ;}  / / 送數據

          4. 2  畫點函數的實現

          要在液晶上實現顯示字符和畫圖等功能,在屏幕上顯示一個點是實現這些功能的基礎。畫點函數實現的步驟是:首先確定該點對應的中的內存位置,找到該點具體對應的數據位,填充顯示顏色的數據,該點就按對應的顏色顯示出來了。

          4. 2. 1  顯示內存與屏幕點陣的對應關系

          YD2502 屏幕點陣為320 ×240 ,每一個點對應3 個像素(RGB) ,屏幕上8 個點對應內存3 個字節,一行對應320/ 8 ×3 = 120 個字節,其對應關系如下:

          其中R ,G,B 表示紅、綠、藍三原色,D7~D0 表示對應的數據位。

        對于屏幕上坐標為( X , Y) 的點,其對應內存地址的計算方法為:

          當Y = 0 時  SRAM = 0EFH ×100H +[ IN T( X/ 8) ] ×3

          當Y > 0 時  SRAM = ( Y - 1) ×100H +[ IN T( X/ 8) ] ×3

          通過( X/ 8) 的余數得出具體的內存位置:

          當余數為0  則 RAM = SRAM  [ 1110 ,0000 ]

          當余數為1  則 RAM = SRAM  [ 0001 ,1100 ]

          當余數為2  則 RAM1 = SRAM  [ 0000 ,0011 ]

          RAM2 = SRAM + 1[1000 ,0000 ]

          當余數為3  則 RAM = SRAM + 1[0111 ,0000 ]

          當余數為4  則 RAM = SRAM + 1[0000 ,1110 ]

          當余數為5  則 RAM1 = SRAM + 1[0000 ,0001 ]

          RAM2 = SRAM + 2[1100 ,0000 ]

          當余數為6  則 RAM = SRAM + 2[0011 ,1000 ]

          當余數為7  則 RAM = SRAM + 2[0000 ,0111 ]

          其中[ ]內為“1”的位表示應該填充顏色的位置, SRAM 表示該點對應的基礎地址, RAM、RAM1 和RAM2 表示該點對應的實際內存地址。

          當數據位為“1”時,對應色點為亮;為“0”時,對應色點為暗。通過RGB 三原色組合而得到的8 種顏色代碼如下:

          例1 :若X 、Y 坐標為(7 ,0)

          SRAM = 0EFH ×100H + 0 = 0EF00H

          余數為7 ,則 RAM = 0EF00H + 2 = 0EF02H

          若此點為紅色,則送入0EF02H 內存單元里的數據為[ 0EF02H] 11111000B + 00000100B

          例2 :若X 、Y 坐標為(15 ,5)

          SRAM = (5 - 1) ×100H + 1 ×3 = 403H

          余數為5 ,則 RAM1 = 403H + 1 = 404H

          RAM2 = 403H + 2 = 405H

          若此點為白色,則送入這兩個單元的數據為

          [ 404H] 11111110B + 00000001B

          [ 405H] 00111111B + 11000000B

          4. 2. 2  畫點函數的具體實現

          從例1 和例2 可以看出,要只顯示一個色點,就必須知道該點對應的內存中的數據,而前面提到過內存中的數據是不能讀出的,所以要將寫入內存中的數據先保存起來,即在向YD2502 的顯示緩沖區里寫數據之前, 應先將此數據寫入61LV5128 。若在坐標( X , Y) 處畫顏色為color 的點,其具體函數如下:

          void  LCD_ disppixel ( unsigned int X , unsigned int Y ,unsigned char color) {

          unsigned int address ;

          unsigned char data ;

          address = LCD_pixeladdr ( X , Y) ;

          / / 計算該點對應的內存地址

          switch ( X %8) {

          case 0 : data = read _ exram ( ad2

          dress) ; / / 讀取相應SRAM 中的數據

          data = 0x1F; / / [1110 ,

          0000]保存其他點的數據

          data | = (color 5) ;

          / / 填充相應的顏色

          write _ exram ( data , ad2

          dress) ; / / 把修改好的數據寫回到SRAM

          LCD_filldata (address ,da2

          ta) ; / / 把數據寫到緩沖區

          break ;

          ……

          case 7 : …; break ;}}

          以上只給出了余數是0 的情況,其他的情況可依此類推。計算內存地址的LCD_pixeladdr 函數可根據給出的內存地址計算方法編寫,讀寫61LV5128 的read_exram 函數和write_exram 函數可根據具體的硬件設計編寫,這里不再給出。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乌拉特中旗| 同心县| 托里县| 河源市| 海丰县| 遵化市| 竹溪县| 林芝县| 昂仁县| 秦皇岛市| 锦州市| 修武县| 启东市| 井研县| 西林县| 灵璧县| 兴和县| 板桥市| 玉林市| 抚顺市| 迭部县| 和平县| 牙克石市| 日喀则市| 秭归县| 合阳县| 三明市| 延川县| 兴城市| 惠东县| 堆龙德庆县| 闽侯县| 龙里县| 克拉玛依市| 唐河县| 兴安县| 宜宾市| 凤翔县| 隆子县| 外汇| 时尚|