• 沒有找到結果。

液晶顯示器控制

在文檔中 中 華 大 學 (頁 44-53)

第四章 系統設計

4.3 系統應用電路元件介紹

4.3.5 液晶顯示器控制

液晶顯示器或稱 LCD(Liquid Crystal Display),在系統與使用者最主要的溝通 介面是字型顯示,此系統使用的 LCD 模組內建控制 IC 為 SAMSUNG 公司的 S6B1713[6],

模組可顯示最大點數為 128x64,參照規格書可以很容易的去控制顯示功能,包括如何 控制 LCD 顯示的開與關,以及透過輸出電壓控制可以調整玻璃顯示的亮度。LCD 模組 介面如圖 4-13,以下簡單說明 LCD 控制的基本流程,詳細的使用方法可參考 LCD 驅動 IC 規格書。

圖 4-13 LCD 模組介面

1. 此模組內建與 MCU 連結控制的介面,包括並列與串列兩種選擇,由於系統實作時 MCU 的 I/O 腳位有限,因此選擇串列介面作為 LCD 與 MCU 溝通的橋樑。圖 4-14 為 串列介面控制的時序圖,CS1B 與 CS2 可致能 LCD 驅動晶片,其中 CS2 接腳已經內 建在 LCD 模組內,在此系統實作中只要控制 CS1B 即可,腳位 SID 是資料傳輸線,

透過 SCLK 的脈波信號可將 SID 的資料傳送至 LCD 驅動晶片內,如此就可以跟 LCD 驅動晶片溝通。

與 1 去代表顯示的狀態,當寫入的位元為 0 時,表選擇的像素不顯示,相反的若是 寫入的位元為 1,則表示將該像素點亮。所以根據 LCD 控制 IC 的規格書就可以將 欲顯示的資料顯示至 LCD 面板上。

圖 4-15 LCD 資料顯示記憶體映射方式

3. 圖 4-16 是 LCD 實際所能顯示的記憶體對應方式,圖中 Page0 至 Page7 是系統實做 時會使用到的記憶體區塊,每一個區塊是由 8 個 COM 的掃描點組成,總共有 COM1 至 COM64 的縱向掃描,橫向的掃描則使用 SEG1 至 SEG128 的掃描點,因此,根據顯 示記憶體的對應方式,就可任意的在 LCD 面板上的任何位置顯示自己定義的資料。

圖 4-16 LCD 資料顯示記憶體對應圖

4. 利用圖 4-15 的控制與顯示方式,倘若要顯示中文字型(圖 4-17),只要將每一個對 應的位元寫入 LCD 顯示資料記憶體,就可以達到顯示中文的目的,而其他字型或是 圖形也是以相同的方式去實現。以下將實際控制的方式做一說明。

圖 4-17 字型顯示範例

圖 4-17 中文字型是採用 16x16 的字體,根據圖 4-15 的方式,若要將"中 "的字 型顯示在 LCD 最左上角的位置,縱向掃描需要使用 Page0 與 Page1 的顯示記憶體位址,

橫向掃描則使用 SEG1 至 SEG16 的位址,如此即可構成一個 16x16 的記憶體區塊,再將 欲顯示的位元寫入,就可顯示"中"的圖形。程式設定方式如下說明:

LCD_RegCommand(0xB0); //設定縱向顯示位址 Page0 LCD_RegCommand(0x10); //設定橫向顯示位址高位元組

LCD_RegCommand(0x00); //設定橫向顯示位址低位元組(SEG1 開始) LCD_DataWrite(0x00); //SEG1 寫入 0x00

LCD_DataWrite(0x00); //SEG2 寫入 0x00 LCD_DataWrite(0xF0); //SEG3 寫入 0xF0 LCD_DataWrite(0x20); //SEG4 寫入 0x20 LCD_DataWrite(0x20); //SEG5 寫入 0x20 LCD_DataWrite(0x20); //SEG6 寫入 0x20 LCD_DataWrite(0x20); //SEG7 寫入 0x20 LCD_DataWrite(0x20); //SEG8 寫入 0x20 LCD_DataWrite(0xFE); //SEG9 寫入 0xFE LCD_DataWrite(0x22); //SEG10 寫入 0x22

LCD_DataWrite(0x20); //SEG11 寫入 0x20 LCD_DataWrite(0x20); //SEG12 寫入 0x20 LCD_DataWrite(0x20); //SEG13 寫入 0x20 LCD_DataWrite(0x20); //SEG14 寫入 0x20 LCD_DataWrite(0xE0); //SEG15 寫入 0xE0 LCD_DataWrite(0x00); //SEG16 寫入 0x00

LCD_RegCommand(0xB1); //設定縱向顯示位址 Page1 LCD_RegCommand(0x10); //設定橫向顯示位址高位元組

LCD_RegCommand(0x00); //設定橫向顯示位址低位元組(SEG1 開始) LCD_DataWrite(0x00); //SEG1 寫入 0x00

LCD_DataWrite(0x00); //SEG2 寫入 0x00 LCD_DataWrite(0x0F); //SEG3 寫入 0x0F LCD_DataWrite(0x04); //SEG4 寫入 0x04 LCD_DataWrite(0x04); //SEG5 寫入 0x04 LCD_DataWrite(0x04); //SEG6 寫入 0x04 LCD_DataWrite(0x04); //SEG7 寫入 0x04 LCD_DataWrite(0x04); //SEG8 寫入 0x04 LCD_DataWrite(0xFF); //SEG9 寫入 0xFF LCD_DataWrite(0x04); //SEG10 寫入 0x04 LCD_DataWrite(0x04); //SEG11 寫入 0x04 LCD_DataWrite(0x04); //SEG12 寫入 0x04 LCD_DataWrite(0x04); //SEG13 寫入 0x04 LCD_DataWrite(0x04); //SEG14 寫入 0x04 LCD_DataWrite(0x07); //SEG15 寫入 0x07 LCD_DataWrite(0x08); //SEG16 寫入 0x00

4.4 中文字庫轉換

只要能夠取得想要顯示字型的字庫,根據圖 4-17 於嵌入式系統中要在 LCD 顯示中 文字型的方式並不難,再透過韌體程式去控制讀取及配合 LCD 的顯示特性即可正確的 顯示字型。但是其中最重要的還是字庫的取得途徑,ㄧ種是直接跟專業的字型設計公 司購買現成的字庫或是委託他們設計專用的字庫,這種類型的字庫一般常見的有華康

B]自動的將這些字型碼擷取並轉換成 LCD 可顯示的對應碼。以目前中文的編碼格式在 中國大陸是使用簡體字,一般比較常用的是 GB2312[22]編碼,而台灣是使用繁體字,

即 BIG-5 編碼方式[22][24],但是這裡要介紹的主要是如何取得 Unicode 與繁體中文 對應的顯示碼,因為 Unicode 的編碼範為包含了簡體與繁體所有常用的字型,所以簡 體與繁體編碼方式不是本論文研究的重點。以下介紹系統設計時中文字庫產生的技巧 與實作方式。

取得字型顯示碼的方式是應用 Unicode 轉 BIG-5 的方式,選用 Unicode 當轉換來 源是因為讀取 SIM 卡的電話簿資料為 Unicode 格式。

1. 利用圖 4-18 使用 Windows API 函數"WideCharToMultiByte “將 Unicode 字串轉 換成指定編碼字串位元組陣列,例如"中"的 Unicode 編碼為 0x4E2D,則轉換完 成的 BIG-5 編碼為 0xA4A4,及為繁體字型"中"的編碼。

2. 依圖 4-19 再將 0xA4A4 轉換成 BIG-5 的"中"字型碼描繪至畫布元件,並將畫布上 的每一對應點陣圖碼的每ㄧ位元記錄存檔而完成圖 4-17 字型顯示碼。

void __fastcall TForm3::Button1Click(TObject *Sender) {

Graphics::TBitmap *pBitmap; // 建立圖像緩衝區

wchar_t w_unicode[1]; // 建立 unicode 陣列緩衝區 char Big5_buf[2]; // 建立 Big-5 陣列緩衝區 int big5[2];

w_unicode[0] = 0x4E2D; // "中"的 Unicode 編碼

WideCharToMultiByte(CP_ACP,0,w_unicode,-1,Big5_buf,254,0,0);

// 進行 Unicode 轉換 Big5

big5[0] = (byte)Big5_buf[0]; // 取 Big-5 陣列緩衝區的高位元組 big5[1] = (byte)Big5_buf[1]; // 取 Big-5 陣列緩衝區的低位元組 int big5value = (byte) big5[0] << 8 | big-5[1];

// 取 Big-5 真正的值 = 0xA4A4 }

圖 4-18 Unicode 轉換至 BIG-5

void __fastcall TForm1::CreateRomCodeButtonClick(TObject *Sender) {

Graphics::TBitmap *pBitmap; // 建立圖像緩衝區 char x1temp = 0;

char x2temp = 0;

char cEdit[2];

FontImage->Width=16; // 設定字型最大高度 FontImage->Height =16; // 設定字型最大寬度

pBitmap = new Graphics::TBitmap(); // 建立圖像元件 pBitmap->Width = 16; // 設定圖像最大高度 pBitmap->Height = 16; // 設定圖像最大寬度 pBitmap->Canvas->Font->Name = "細明體"; // 選擇中文字體 pBitmap->Canvas->Font->Height = 16; // 設定畫布高度 pBitmap->Canvas->Pen->Color = clWhite; // 設定畫布顏色

pBitmap->Canvas->Rectangle(0,0,pBitmap->Width,pBitmap->Height);

// 建立新畫布

FontImage->Canvas->Font->Size = 32; // 設定字型為 16x16 的點陣圖 int Big5 = 0xa4a4; // "中"Big-5 編碼

cEdit[0] = Big5 >> 8;

cEdit[1] = Big5 & 0xFF;

//--- 將"中"寫入圖像緩衝區 pBitmap->Canvas->TextOutA(0,0,(AnsiString)cEdit);

for(int k=0;k<16;k++) {

for(int i=0 ; i<16 ; i++) {

if(i <=7 ){

x1temp = x1temp << 1;

if(pBitmap->Canvas->Pixels[k][i]!= clWhite){

x1temp++;

//--- 將圖像緩衝區描繪在畫布 FontImage->Canvas->Pixels[k][i] = clRed;}

} else{

x2temp = x2temp << 1;

if(pBitmap->Canvas->Pixels[k][i]!= clWhite){

x2temp++;

//--- 將圖像緩衝區描繪在畫布 FontImage->Canvas->Pixels[k][i] = clRed;}

if((x1temp & 0x80) == 0x80) font1 |= 0x80;

if(x != 7)

font1 = font1 >>1;

x1temp = x1temp <<1;

}

x1temp = font1;

for(int x= 0 ; x<=7 ; x++) {

if((x2temp & 0x80) == 0x80) font2 |= 0x80;

if(x != 7)

font2 = font2 >> 1;

x2temp = x2temp << 1;

}

x2temp = font2;

//--- 記錄畫布上的點陣圖顯示對應碼 --- Memo1->Text = Memo1->Text+"," +

IntToHex((x1temp & 0xff),2) +","+

IntToHex((x2temp & 0xff),2);

}

//--- 點陣圖顯示對應碼 --- // 0x00,0x00,0x00,0x00,0xF0,0x0F,0x20,0x04,

// 0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04, // 0xFE,0xFF,0x22,0x04,0x20,0x04,0x20,0x04, // 0x20,0x04,0x20,0x04,0xF0,0x0F,0x20,0x00

圖 4-19 字型顯示碼轉換方式

本章主要說明系統功能包含的周邊硬體電路與各裝置的使用規範,應用嵌入式系

統是一種完全嵌入受控器件內部為特定應用設計的專用電腦系統,再透過整體系統規 劃,將每種特定功能的周邊硬體電路加以彙整,最後再經由撰寫系統韌體程式負責規 劃控制特定功能的流程,以期達到系統主要執行的目的。最後說明系統中文電話簿內 的中文顯示字庫製作的方式,透過字型的自動擷取程式產生的字庫再燒錄至系統儲存 中文字型用的記憶體,即可隨時被 MCU 讀取而在 LCD 上顯示記憶體內儲存的字型。

第五章 系統實作與驗證

透過前一章對整個系統的硬體電路做規劃,最後將這些電路整合為一,並加以實 做硬體電路去驗證家用有線電話機內含中文電話簿的可行性。主要的系統開發工具包 括軟體程式與韌體程式整合開發環境與硬體電路板佈線繪圖工具,使用的軟體版本名 稱簡介如表 5-1:

表 5-1 系統軟體開發工具

1 Borland C++ Builder 5.0 視窗程式 C 語言開發環境 2 Keil C51 Demo Version MCU 軔體程式組譯軟體[18]

3 Protel 99SE Demo Version 電路圖設計與 PCB layout 軟體 4 Silicon LABS - EC2 MCU 硬體 debug 工具[3]

利用這些開發工具再配合先前的系統規劃,最後完成的系統功能於使用電話機介 面的操作時有兩種選擇即自動撥號通話或是手被動撥號通話,因此操作介面是以電話 機基本鍵盤輸入為主,根據功能鍵去執行不同的應用,以下針對嵌入式電話機系統的 實作結果與操作介面做一介紹。

5.1 晶片選擇介紹

以嵌入式系統架構去實現特定應用的功能是一個趨勢,主要是現代的半導體技術

已經非常成熟,各種微型化且功能強的 IC(Integrated Circuit)不斷的被開發,而透 過整合各種特殊功能的 IC 可以很快速達到系統設計的目的以及提高系統的穩定度。以 下說明本嵌入式系統幾個主要晶片的選擇依據:

1. 系統主控制晶片 MCU-C8051F045,晶片核心軔體程式設計是以最廣為應用與熟悉 的微處理器核心 8051,目前市面上商品化的消費性產品中大部分都有嵌入 8051 微處理器,包括現在最熱門的 MP3 播放器、Skype 網路電話機,智慧卡讀卡機、

CD ROM、DVD 播放器以及許多與 USB 通訊傳輸的相關裝置。而實作部份在晶片的 選擇與考量有兩個方向,即是晶片本身提供的硬體除錯能力與韌體移轉至其他晶 片的相容性;至於硬體除錯能力是為了開發過程能減少因為人為疏失造成的錯 誤,而韌體編譯使用 C 語言編譯器,針對移轉相容性是因為考量系統將來若是有

3. 電話簿記憶體 MX25L8005,記憶體主要的功能是存放固定的中文字型顯示對應碼 以及可更新的電話簿資料,此 IC 與 MCU 溝通的介面也是串列傳輸,透過與 MCU 之間預定的傳輸協議以及個人開發的中文字型產生器程式[附錄 B],可以將部分 視窗(Windows)的字體擷取包括細明體、標楷體等等並將這些字型轉換為點陣圖式 的 字 型 碼 , 再 將 這 些 字 型 顯 示 碼 燒 錄 至 記 憶 體 而 獨 立 成 一 個 中 文 字 庫 的 ROM(Read-Only Memory),由於記憶體內部存放者中文字型顯示碼,因此若是需要 將此記憶體移除而應用至其他需要顯示中文字型的產品,也是很一個很好運用的 資源。

在文檔中 中 華 大 學 (頁 44-53)

相關文件