天堂网www中文天堂在线/色操在线/成人精品视频一区二区三区/欧美特黄一片aa大片免费看

  • 點陣式液晶任意圖片顯示的實現———點陣式液晶任意圖片顯示的實現

          液晶顯示器(liquid crystal display,lcd )具有功耗低、體積小、質量輕、超薄和可編程驅動等其他顯示無法比擬的優點,不僅可以顯示數字、字符,還可以顯示漢字及各種圖形、圖片,可實現屏幕上下左右滾動、動畫、反轉顯示、顯示閃爍多種功能,日益成為智能儀器儀表和測試設備的首選顯示器件。目前常用的lcm12864系列的液晶模塊,一般都沒有圖形驅動模塊,而圖形作為一種更為生動的表現方式,是用戶需求的重點和設計的亮點。如何在這種點陣式液晶顯示器中顯示任意靜態圖片以及動畫, 成為困擾設計者大量應用lcd的問題。我們現在可以通過互聯網、圖形處理軟件及掃描儀等很方便地獲得各種各樣的圖像、圖片,這樣可以通過比較簡單的方法把任意圖片移植到液晶顯示器lcd上。文章通過分析bmp圖像的存儲格式和128 64點陣lcd上圖像顯示的原理,設計了一個lcd圖片數據轉換及模擬顯示的軟件,并介紹了實現lcd意圖片的顯示方法。


    bmp圖片格式及lcd顯示原理

       bmp位圖是微軟公司(microsoft)和國際商用機器公司(ibm)共同倡導的一種圖片格式。它按點陣排列順序,將每個像素的色彩值以規定的方式把整個圖片記錄下來。根據色彩位深度不同,windows bmp文件像素描述部分差別較大,如256色每個像素需要8位(即1個字節)來描述,而16色的圖片每個像素描述者只需4 位(即半個字節)。對于絕大部分電子設計者來說,最常用的是黑白二色的點陣式液晶顯示器。因此,這里僅分析對microsoft windows類型1位(bit)描述的黑白二色bmp圖片文件的處理。

       一幅128 64點陣的黑白bmp圖片文件的總長度為1086字節,前62個字節是文件頭,用于表示文件類別、長度、圖像的行數以及列數等信息,地址為 00h~3dh;后1024字節則對應畫面的點陣數據,地址為3eh~43dh。bmp文件的中字節排列與點陣數據對應關系如圖1 所示,bmp點陣數據塊第0個字節對應圖片中左下角第63行的第0到7列,第15個字節對應圖片中第63行的第112到127列,也就是按照從左至右,從下到上的順序,bmp數據塊最后一個字節對應第0行的112到127列。因此,要想實現將bmp圖片文件轉化為供模塊直接顯示的數據,不但涉及到各個數據排列的先后順序,還涉及到字節中各個位的重組。

       對于rt12864hz漢字圖形點陣液晶顯示模塊,它可顯示漢字及圖形,內置8192個中文漢字(16 16點陣)、128個字(8 16點陣)及繪圖顯示ram(gdram)。繪圖顯示ram提供128 8個字節的記憶空間,在更改繪圖ram時,先連續寫入水平與垂直的坐標值,再寫入兩個字節的數據到繪圖ram,而地址計數器(ac)會自動加一;在寫入繪圖ram的期間,繪圖顯示必須關閉,整個寫入繪圖ram的步驟如下:

    (1) 關閉繪圖顯示功能。
    (2) 先將水平的位元組坐標(x)寫入繪圖ram地址;再將垂直的坐標(y)寫入繪圖ram地址;將d15~d8寫入到ram中;將d7~d0寫入到ram中。
    (3) 打開繪圖顯示功能。

       繪圖顯示的緩沖區與圖形點陣對應分布參考圖2所示(水平方向x以字節單位,垂直方向y以位為單位)。

       windows中的畫圖軟件為圖片編輯提供了放大、網格、旋轉、定位、定幅等強大、實用而靈活的功能,同時有輸入各種字體及大小的漢字的功能,是編輯畫面的理想工具。打開菜單[圖像]下的[屬性]項,設置任意圖片寬度為128,高度為64,單位為像素,顏色為黑白。保存的bmp文件經過下面 delphi編寫的函數s_copyfile()便可轉換為lcd模塊顯示的點陣數據,數據以單片機數據表定義的格式放在memo1中,可以直接拷貝至 lcm控制匯編程序中當數據表用,如圖3所示。另外使用了heckbox1控件來使圖片反白。

    函數s_copyfile()的源程序如下[4]:
    function s_copyfile(filesou:string;filedes:string):boolean;
    var
    fromf, tof: file;
    s,t:string;
    i,j,numread, numwritten: integer;
    tem: array[1..62] of char;
    buf: array[1..16] of char;
    begin
    {$i-}
    s_copyfile:=false;
    if not fileexists(filesou) then
    begin
    showmessage(沒有發現源文件+#13+filesou);
    exit;
    end;
    assignfile(fromf,filesou);
    assignfile(tof,filedes);
    reset(fromf,1);{ record size = 1 }
    main.memo1.clear;
    main.memo3.clear;
    blockread(fromf, tem, sizeof(tem), j);
    j:=1;
    repeat
    s:= db ;
    t:=;
    blockread(fromf, buf, sizeof(buf), numread);
    for i:=1 to numread do
    begin
    if main.checkbox1.checked then buf[i]:=chr
    (255-ord(buf[i]));
    appendstr(t,inttohex(ord(buf[i]),2));
    if ord(buf[i])>159 then
    appendstr(s,0+inttohex(ord(buf[i]),2)
    +h,)
    else
    appendstr(s,inttohex(ord(buf[i]),2)
    +h,);
    end;
    delete(s,length(s),1);
    main.memo1.lines.append(s);
    main.memo3.lines.append(t);
    inc(j);
    until (numread = 0);
    main.memo1.lines.delete(main.memo1.lines.
    capacity-1);
    closefile(fromf);
    closefile(tof);
    s_copyfile:=true;
    end;
    lcd模擬顯示


     對于如圖4所示的一張128 64的bmp圖片,其模擬顯示如圖5所示,反白后顯示如圖6所示。

      有的lcm數據是奇偶行交錯的,也可以通過使用隔行來改變。模擬顯示的源程序主要是采用在畫布上畫矩形框的方法,語句如下:


    image1.canvas.fillrect(rect(16*s_col+4*i,
    4*s_row,16*s_col+4*i+3,4*s_row+3));
      其中s_col為行坐標(1~64),s_row為列坐標(0~31),每個字節分高4位與低4位分別來畫矩形框。當高4位或低4位值為1~f時,對應的i分別如表1所示。

    lcd顯示控制程序設計

      lcm內部帶有8k字節的ram緩存區,往ram緩存區寫入數據,則在lcd 顯示屏上產生顯示。通過改變顯示緩存區首地址可實現屏幕滾動、屏幕換頁等功能。

    graphic_disp:

    lcall clear_graphic ;清除圖形顯示ram單元(gdram)
    mov g_row, #80h ;設定圖形顯示起始行單元
    mov g_column, #80h ;設定圖形顯示起始列單元

    gra_disp:

    mov a, #34h ;選擇擴充指令集,關閉圖形顯示
    lcall input
    mov a, g_row ;輸入圖形顯示起始行地址
    lcall input
    mov a, g_column ;輸入圖形顯示起始列地址
    lcall input
    mov a, #30h ;重新選擇基本指令集
    lcall input
    clr a
    movc a, @a+dptr ;輸入顯示數據(橫向高8位數據)
    lcall displ
    inc dptr
    clr a
    movc a, @a+dptr ;輸入顯示數據(橫向低8位數據)
    lcall displ
    inc dptr
    inc g_column ;列地址加一
    mov a, g_column
    cjne a, #90h, gra_disp ;最后一列地址為90h(共計16列)
    mov g_column, #80h
    inc g_row ;行地址加一
    mov a, g_row
    cjne a, #0a0h, gra_disp ;最后行地址為0a0h
    mov g_column, #80h
    mov g_row, #80h
    mov a, #36h ;打開圖形顯示
    lcall input
    ret

       在上面程序中,是與圖2所示的gram映射的點陣坐標一樣,分成0~15列,每列寫2個字節數據,共有32行。clear_graphic為清除圖形顯示cgram的子程序,input為寫指令子程序,displ為寫數據子程序,這里不再詳細列出。另外硬件設計時,注意空腳(nc)應懸空,不能接地。調試時,適當調整液晶顯示偏壓信號v0,使之在一合適電壓,這一電壓若設置不當,lcm 無法正常工作。


    結束語

      按照上面分析的方法,可以方便的在液晶上顯示任意圖片。點陣的lcd模塊還可實現屏幕合成、滾動、動畫、閃爍等功能,正越來越受到廣泛的應用和關注。需要指出的是,由點陣液晶顯示器件與相應的控制器、驅動器裝配成的顯示模塊的種類較多,其功能、指令、接口定義及引腳并無統一標準,具體使用時應加以選擇。