逢 甲 自動控制工程學系專題製作 專 題 論 文 · (20h-2fh)也要避開,剩下80...

43
自動控制工程學系專題製作 使用SDCC編譯8051組合語言 Compile Assembler by SDCC 指導教授: 黃建立 生: 陳佑論 錢保宏 鄭家倫 中華民國九十五年元月

Upload: others

Post on 13-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

  • 逢 甲 大 學 自動控制工程學系專題製作

    專 題 論 文

    使用SDCC編譯8051組合語言

    Compile Assembler by SDCC

    指導教授: 黃建立

    學 生: 陳佑論 錢保宏 鄭家倫

    中華民國九十五年元月

  • 感 謝

    本文承蒙指導教授 黃建立老師的悉心指導,始臻於此。在此謹致上由衷的

    敬意和謝忱。自大學起即接受老師的教誨,老師淵博的學識、嚴謹的治學精神及

    親切誠懇的處世態度,都是我一生的典範。此外,感謝陳孝武教授於口試時,給

    予諸多的建議與指正。

    專題研究期間,承蒙同學的砥礪與幫助,同窗情誼永難忘懷。特別感謝摯友

    在精神及生活上所給予之關懷與鼓勵,將永銘在心。

    ii

  • 中文摘要

    用 C 來學 8051 已經是不可避免的潮流了,入門較易,但是要歷經較久的時

    間才能對 8051 通盤理解。對 8051 有足夠的認識以後,使用 C 的寫法,系統的

    開發時間會明顯減少,而且還能寫出非常結構化的程式模組。

    現在比較常見的 805l C Compiler 應該是 IAR C 與 Keil C 兩款,這些都是要

    用錢買的商業套裝軟體,價格在數萬元左右。在這裡我們要介紹的是擁有許多支

    持者的 freeware SDCC C Compiler。

    關鍵字:IAR C,Keil C,SDCC

    iii

  • Abstract

    Using C to learn 8051 is usual already. Starting to learn it easier, but we have to

    spend more time to totally figure out. By using C, we can spend less time and get very

    constructive program model after knowing about 8051 deeply.

    About 805l C Compiler, IAR C and Keil C are known by programmer. Both of

    them are expensive. Now we are going to introduce another popular freeware, SDCC

    Compiler.

    Key words: IAR C, Keil C, SDCC

    iv

  • 目錄 感謝 ……………………………………………………………………………… ii

    中文摘要 ………………………………………………………………………… iii

    Abstract ………………………………………………………………………… iv

    目錄 ………………………………………………………………………………… v

    圖目錄 …………………………………………………………………………… vii

    表目錄 ……………………………………………………………………………viii

    第一章 緒論………………………………………………………………………1

    1.1 前言……………………………………………………………………………1

    1.2 研究動機………………………………………………………………………1

    1.3 SDCC 簡介………………………………………………………………………1

    第二章 基礎理論……………………………………………………………………3

    2.1 微電腦基本結構………………………………………………………………3

    2.2 微處理機的內部架構…………………………………………………………3

    2.3 單晶片微電腦…………………………………………………………………5

    2.4 單晶片的基本特性…………………………………………………………5

    2.5 MCS-51 單晶片微電腦…………………………………………………………7

    2.5.1 8051 單晶片…………………………………………………………………7

    2.5.2 8052 單晶片…………………………………………………………………7

    2.5.3 MCS-51 單晶片比較………………………………………………………8

    2.6 PIC 晶片…………………………………………………………………………9

    2.7 高速晶片 AVR…………………………………………………………………10

    第三章 實際範例 …………………………………………………………………13

    3.1 矩陣型 LED 顯示動態字元……………………………………………………13

    3.1.1 左移…………………………………………………………………………14

    3.1.2 右移…………………………………………………………………………14

    3.1.3 上移…………………………………………………………………………15

    3.1.4 下移…………………………………………………………………………15

    3.2 16x16矩陣型LED顯示器中文字型顯示原理………………………………...16

    v

  • 3.3 16x16矩陣型LED顯示器動態中文字型顯示………………………………...18

    3.4 SDCC 版本檢查確認…………………………………………………………...20

    3.5 程式編譯………………………………………………………………………21

    第四章 結論…………………………………………………………………………22

    4.1 心得……………………………………………………………………………22

    4.2 結論……………………………………………………………………………22

    參考文獻……………………………………………………………………………24

    附錄一………………………………………………………………..........................25

    附錄二………………………………………………………………………………..33

    附錄三………………………………………………………………………………34

    vi

  • 圖目錄

    圖 2.1 微電腦基本結構 ……………………………………………………………3

    圖 2.2 微處理機內部結構方塊圖 …………………………………………………4

    圖 2.2 AVR 晶片內部架構圖 ………………………………………………………11

    圖 3.1 字型資料對映圖 …………………………………………………………13

    圖 3.2 字型左移變化 ……………………………………………………………14

    圖 3.3 字型右移變化 ……………………………………………………………15

    圖 3.4 字型上移變化 ……………………………………………………………15

    圖 3.5 字型下移變化 ……………………………………………………………16

    圖 3.6 中文字“光"的字型顯示 ………………………………………………17

    圖 3.7 4 個 8x8 LED 連接成 1個 16x16 LED ………………………………………17

    圖 3.8 16x16 矩陣型 LED 顯示器電路圖 …………………………………………19

    圖 3.9 16x16 矩陣型 LED 顯示器流程圖 …………………………………………20

    圖 3.10 SDCC 版本確認 ……………………………………………………………20

    圖 3.11 程式編譯 …………………………………………………………………21

    vii

  • 表目錄

    表 2.1 MCS-51 單晶片比較 …………………………………………………………8

    表 3.1 字型資料對映表 ……………………………………………………………13

    表 3.2 中文字“光"的字型資料 …………………………………………………18

    表 3.3 中文字“光"的字型填入資料……………………………………..………18

    viii

  • 第一章 緒論

    1.1 前言

    805l CPU 在 20 年前就問世了,可算是單晶片 CPU 的常青樹,以 8051 為主

    體的應用範例太多了。C語言比 8051更早被發展出來,我們相信當初 Intel把 8051

    定位在單晶片控制器上,希望開發者儘量用組合語言來設計程式,以便爭取最快

    的執行速度。

    1.2 研究動機

    當 805l 與 C 語言搭上關係時,首先被人質疑的是:可能嗎?合適嗎?首先

    當然是考慮到程式空間的問題,8051內含的程式空間只有 4K bytes,Data Memory

    也只有 128 Bytes,雖然到了 8052 時,程式空間與資料空間都加倍,但對某些特

    定的應用場合來講,還是覺得 Memory 容量不太夠用。在 C 語言裡,有許多函

    式是相當耗費程式空間的,例如浮點運算以及 print f 函式,8051 僅 4K 的程式空

    間可能一下子就用完了,又如何拿來寫應用程式呢?另一方面,C 對堆疊 stack

    的使用機會很高,傳遞引數時,都會透過 stack 來做。對 8051 而言,可用的堆疊

    實在有限,Data Memory 裡有 R0-R7 暫存區(00H-lFH)要避開,可位元定址區

    (20H-2FH)也要避開,剩下 80 Bytes 的空間又要分配給函式內的變數使用,導致

    真正給堆疊使用的空間可能不到 50 Bytes。50 Bytes 只能做 25 次 call 而已。當

    8051 真正在動作時,主程式也在做 call,各個中斷服務程式依照其先後優先順序

    也在 call,25 個 call 可能進到中斷後一下子就分配完了。

    1.3 SDCC簡介

    SDCC 是由 Sandeep Dutta 所寫的,當開始在網路上流傳時,歷經了許多 bug

    的修正與缺失改進,這可是經過全世界數百個 C 語言的高手提供的意見後的結

    果。西元 1999 年年底,整個 SDCC 軟體程式移轉到 Sourceforge 機構上,以便讓

    所有的使用者都可以接觸到整個完整的原始程式(source tree),對 SDCC 做更大

    1

  • 的奉獻與改進。SDCC 最初只有 Linux 版本的,因為 Linux 才有軟體共享的觀念,

    可是面對眾多的 Windows 作業系統愛用者,SDCC 也另外提供 Windows 版的

    SDCC,當然這些版本都可以在 SDCC 網站上(http://sdcc.sourceforge.net)無償取

    得。

    SDCC 主要支援的 CPU 為 Intel 的 8051 與 Zilog 的 Z80 CPU,另外也支援

    Atmel AVR,DS390 與 Microchip PIC 等系列。

    2

  • 第二章 基礎理論

    2.1 微電腦基本結構

    微電腦係指由中央處理單元 (CPU),記憶體單元 (Memory)及輸入/輸出單

    元(I/O)三大部份所組成,如圖 2.1 所示。其中 CPU 可分成兩部份,即算術邏輯

    單元(ALU)及控制單元 (CU)。CPU 透過匯流排(BUS)執行程式碼的提取

    (Fetch)、解碼 (Decode)、算術邏輯運算及讀寫時序信號的控制。記憶體單元提

    供存放程式與資料之空間,包含唯讀記憶體 (Read Only Memory ; ROM)與隨機

    存取記憶體(Random Access Memory ; RAM)。而輸入/輸出單元 (I/O)提供 CPU

    與外界週邊設備或元件溝通的管道,(如鍵盤、滑鼠、顯示器等)。

    圖 2.1 微電腦基本結構

    2.2 微處理機的內部架構

    微處理機內部結構包括 「算術邏輯運算單元(ALU)」,「暫存器(Register)」,

    「控制單元(CU)」,與「內部匯流排(Internal BUS)」。微處理機的基本運作包括

    「提取指令(Fetch)」,經解碼並選擇線路予與執行(Execute),即 Fetch – and -

    execute cycle。通常微處理機無法單獨執行工作,它必須配備記憶體(Memory),

    3

  • 輸出入埠,電源,與相關的週邊界面...等,才能具有完整的工作能力。圖 2.2

    是典型的微處理機內部結構方塊圖,說明如下:

    算術邏輯運算單元(ALU):在圖 2.2 的馬蹄型結構是算術邏輯運算,待運算

    資料經由資料匯流排送入輸入埠,計算結果由輸出埠由資料匯流排送回累加器

    (Accumulation)。

    暫存器(Register):存放微處理機運作過程的暫時資料,例如執行算術邏輯

    運算與存放運算結果都必須用到的「累加器」;存放下一個將被提取執行指令的

    記憶體位址稱為「程式計數器(PC)」;記錄程式執行過程中的狀態是「狀態暫存

    器或旗標」,此外存取資料所需的「一般資料暫存器」,「記憶體位址暫存器

    (Memory address register)」等,都通稱為微處理機的暫存器。

    控制單元:指揮微處理機運作的邏輯電路。控制單元透過控制匯流排執行指

    令的提取,解碼,並發出執行指令的訊號。

    內部匯流排:可區分為三種匯流排,「資料匯流排」負責傳送的資料包括執

    行運算的指令,與或執行指令的運算元資料;「位址匯流排」負責傳送定址記憶

    體的位置與輸出入埠的位址;「控制匯流排」負責傳送控制訊號,協調微處理機

    各部門之間的動作與資料傳遞過程。

    圖 2.2 微處理機內部結構方塊圖

    4

  • 2.3 單晶片微電腦

    所謂單晶片微電腦 (Single Chip)係指將中央處理單元(CPU)、記憶體單元

    (Memory)、及輸入/輸出單元(I/O)製作在同一晶片上,而形成一能夠獨立運作

    的控制系統。其主要優點說明如下:

    單晶片微電腦係將 CPU、記憶體、I/O 埠等製作於同一晶片上,體積比一般

    微電腦明顯縮小。

    單晶片內部的硬體架構,與微電腦之複雜系統相比,其架構簡單,在使用與

    學習上更容易。

    單晶片已將主要功能溶縮於單一晶片上,使用時,只需接少許元件即可作廣

    泛的控制,除了提高硬體接線的可靠度之外,在裝配和維護上也相當容易。

    由於 HMOS 與 CHMOS 技術的發展,使單晶片不論在功能上、包裝密度上

    都增強許多,同時單晶片仍提供讀(Read)、寫(Write)等控制信號,在作外部記

    憶體或 I/O 埠的擴充時,相當簡便。

    2.4 單晶片的基本特性

    由於單晶片微電腦是由微電腦系統衍生出來,因此主要架構涵蓋一般微電腦

    與微處理機的內涵。例如算術/邏輯單元,控制單元的 CPU 核心,及各類暫存器,

    匯流排,記憶單元,輸出入埠等,可完成指令解碼,運算,儲存,控制,資料傳

    輸與輸出人等功能。

    在面對種類繁多的各式微處理機或單晶片微控制器時,首先必須了解晶片共

    通的基本功能特性,並能比較不同晶片的特定用途,才能充份掌握各種晶片特

    性,並做為選擇晶片的依據。發揮該晶片的功能效益。以下摘要說明單晶片與微

    處理機的基本特性。

    字語長度:微處理機處理資料的基本長度,重要的指標包括微處理機內的暫

    存器(Register)與資料匯流排(data bus)的寬度。例如 8 位元、16 位元、32 位

    元...。早期通用型 8088 為 16 位元微處理機,8051 為 8 位元單晶片。目前最新

    5

  • ARM 系列為 32 位元單晶片。

    可定址空間:微處理機的位址匯流排(Address Bus)決定可存取外部記憶體與

    I/O埠的數量。例如 16 條位址線可定址 216=64KBytes的記憶體空間。位址線越

    多,可存取的資料量就越大,但晶片上的接腳數也會越多,晶片體積也必須相對

    變大。

    執行速度:微處理機執行程式的動作,基本上可視為「提取指令-執行指令」

    的時間週期,控制這個週期的是外部振盪電路提供的時脈(Clock)。若採用的時

    脈頻率越高,執行速度越快。例如 8051 若採 l2MHz,單一指令執行時間約 1μs。

    暫存器:微處理機暫時存放等待處理資料的地方。暫存器的資料寬度、數量、

    型式,會直接影響到微處理機的工作效率。例如暫存器的數量多,可減少資料存

    取的時間,多種型式的暫存器,可提供更多不同的定址方式。

    指令集:指令是執行微處理機動作的機械控制碼,一部微處理機提供的所有

    指令,稱為指令集。功能越強的微處理機,提供的指令越多,內部的電路結構也

    更複雜,例如複雜指令結構(CSIC)。目前單晶片逐漸朝向精簡指令結構(RSIC)

    發展,以較少的指令,簡化電路,提昇效能。

    定址方式:即為程式中存取記憶體資料的方式。配合微處理機提供的暫存

    器、匯流排結構、與指令集,可決定微處理機的定址方式。基本的定址方式「直

    接定址」、「間接定址」,功能較完整的系統晶片,會提供更多定址方式,如「索

    引定址」可以存取大型的陣列資料。

    輸出入功能:輸出入埠微處理機與外界週邊界面溝通並交換資料的埠口。輸

    出入埠必須提供 I/O 埠的定址能力,位址解碼工作,以及暫時存放輸出入資料的

    緩衝區暫存器等功能。一般 I/O 的型式有:

    程式 I/O (PIO)、中斷 I/O(IIO)、直接記憶體存取(DMA)。單晶片一般都

    提供可直接輸出入的 I/O 埠與中斷輸入接腳,同時亦提供資料匯流排與位址匯流

    排接腳,做為擴充記憶體與 I/O 埠使用。

    系統與週邊界面的支援功能:如計時/計數功能,中斷控制、串列通訊 UART

    6

  • 功能,數位類比訊號輸出入(ADC、DAC),看門狗(WDT)安全,省電低耗功能。

    目前單晶片的發展趨勢是,針對某些特定功能需求,提供不同的週邊界面支援功

    能。因此衍生出各式各樣特定功能的嵌入式系統晶片。例如 8051 計時/計數功

    能,中斷控制、串列通訊 UART 等功能。PIC 系列晶片提供多樣化的週邊界面支

    援功能。

    2.5 MCS-51 單晶片微電腦

    MCS-51 族系單晶片是 INTEL 公司的產品,其中 8051 是 INTEL 公司於

    1981 年生產製造的原始晶片。主要的功能及特性說明如下:

    2.5.1 8051 單晶片

    8 位元微電腦控制晶片。

    4KB 內部程式記憶體,最大可外接擴充至 64KB。

    128Bytes 內部資料記憶體,最大可外接擴充至 64KB。

    具有布林代數運算能力(位元邏輯)。

    4 組可位元定址 I/O 埠 P0、Pl、P2、P3。

    2 組 16 位元計時/計數器 T0、Tl。

    5 個中斷源 INT0、INTl、T0、Tl、RXD 或 TXD。

    1 組全雙工串列埠 UART。

    2.5.2 8052 單晶片

    8 位元微電腦控制晶片。

    8KB 內部程式記憶體,最大可外接擴充至 64KB。

    256Bytes 內部資料記憶體,最大可外接擴充至 64KB。

    具有布林代數運算能力(位元邏輯)。

    4 組可位元定址 I/O 埠 P0、Pl、P2、P3。

    3 組 16 位元計時/計數器 T0、Tl、T2。

    6 個中斷源 INT0、INTl、T0、Tl、T2、RXD 或 TXD。

    7

  • 1 組全雙工串列埠 UART。

    2.5.3 MCS-51 單晶片比較

    表 2.1 MCS-51 單晶片比較

    編號 8031 8051 8751 89C51 8032 8052 8752 89C52

    型式 無

    ROM

    ROM EPROM EEPROM 無

    ROM

    ROM EPROM EEPROM

    程式

    記憶

    4 KB

    (外接最大 64KB)

    8 KB

    (外接最大 64KB)

    資料

    記憶

    128 Bytes

    (外接最大 64KB)

    256 Bytes

    (外接最大 64KB)

    I/O 32(可位元定址) 32(可位元定址)

    計時

    2 3

    中斷

    5 6

    無 ROM 型單晶片

    如 8031、8032,內部僅含有資料記憶體(RAM),必須外接程式記憶體

    (ROM),可使用 IC 編號 27xx(EPROM 型)或 28xx(EEPROM 型),將程式

    燒錄於此 IC 中。

    ROM 型單晶片

    如 8051、8052,內部含有資料記憶體(RAM)及程式記憶體(ROM),且程式

    記憶體僅可燒錄 1 次,無法清除,但其價格低廉,適合工廠大量生產。

    8

  • EPROM 型單晶片

    如 8751、8752,內部含有資料記憶體(RAM)及程式記憶體(ROM),程式記

    憶體可重複多次使用。使用紫外線清除,照射單晶片窗口約 20~30 分鐘,即

    可清除程式記憶體內資料。

    EEPROM 型單晶片

    如 89C51、89C52,內部含有資料記憶體(RAM)及程式記憶體(ROM),程

    式記憶體可重複多次使用(約 1000 次左右)。使用電氣信號(5V 或 2V)清除,清

    除時間約 5~10 秒。

    2.6 PIC 晶片

    PIC(Peripheral Interface Controller)系列的單晶片是美國 Microchip 公司於

    1989 年出品的 8 位元微處理器。PIC 由於採用 RISC 架構,快速的運算、簡單易

    用、價格便宜、低耗電,高速,高輸出驅動電流、豐富多樣化的週邊界面提供選

    擇...等優點,因此在問市後很短時間就急速竄紅,目前廣為業界採用,尤其是

    大量應用在消耗性電子裝置、家電、玩具等產品上。以下列出 PIC 晶片的優異特

    點:

    晶片體積小,耗電少,價位低,例如可燒入一次 OTP 型,價格不到百元。

    採用 RISC(Reduced Instruction Set Computing)架構,以哈佛(Harvard)雙匯

    流排結構,將位址匯流排與資料匯流排分開,因此位址與資料可以同時傳送,避

    免處理上的瓶頸。

    PIC 單晶片的指令簡單易學,共計 35 個指令 (PIC17CXX 例外,有 58 指令)。

    指令的執行採管線架構(Pipeline),可大幅提高指令執行速度。

    PIC 絕大部份指令執行時間都是一個單一指令週期(Instruction cycle),約

    400nS,因此在撰寫程式時,很容易掌握程式執行時間。

    PIC 單晶片提供的種類繁多,根據不同需求提供多樣化的週邊界面,例如串

    列通訊、數位類比轉換、計時/計數、擷取/比較/PWM 模組(簡稱 CCP)等。

    9

  • 提供工業控制所需看門狗(WDT)監控功能。

    在零件包裝上也有多種選擇如提供 DIP 包裝、PLCC、TQFC、MQFP 等。

    PIC 系列單晶片的種類繁多,能讓工程師在電路與軟體的規畫設計上,有更

    大的彈性空間。主要成員依功能區分為四個家族,分別為 PIC12CXXX、

    PlC16C5X、PICl6CXX 以及 PICl7CXXX。這四個家族的除了在程式記憶體的位

    元寬度不同,指令字組長度亦有所不同(12-Bit、14-Bit、16-Blt)其它配備的週邊,

    晶片接腳數,執行速度是都不同差異。這四個晶片家族的特點如下:

    PlCl2CXX 家族:簡單型 8 支接腳的 RISC 架構單晶片,麻雀雖小,五臟俱

    全。除內建 ROM 與 RAM 外,PlCl2C6XX 內建類比數位轉換(AD)的週邊,並

    可提供更高時脈的運作。這類晶片有 PICl2C508、PICl2C509、PIC12C671、

    PICl2C672...等。

    PICl6C5X 家族:在 PIC 系列中,入門型晶片。只有基本週邊配備,I/O 埠

    配置 12~20,晶片接腳數有 18、28 兩種。沒有 AD 轉換,沒有串列通訊,也沒

    CCP 模組。最高速可到 20MHz。這一家族的晶片有 PICl6C52、PICl6C54、

    PICl6C57、PICl6C58...等。

    PICl6CXXX 家族:除基本配備外,加入更多的週邊供選擇 AD 轉換。晶片

    接腳數由 18~64 都有。週邊界面依家族成員不同,提供 AD 轉換、串列通訊、

    CCP 模組、LCD 控制模組...等多樣化選擇。常見晶片如 PICl6C84、PlCl6C74...

    等。

    PICl7CXXX 家族:高功能的 PIC 晶片家族,時脈提高到 33MHz,使用的指

    令增加到 58 個,指令字組寬度為 16 位元,相對可定址範圍也增加。內建的 ROM

    大小由 2MByte 到 l6MByte,RAM 則從 232Byte 到 902Byte。提供乘法器,運算

    結果有 16 位元的乘積值。內建有獨立的兩個擷取輸人和兩個 PWM 輸人,也提供

    串列通訊。家族成員晶片如 PICl7C42、PICl7C43、PICl7C52、PICl7C56...等。

    2.7 高速晶片 AVR

    10

  • AVR是美國ATMEL公司於 1997年推出增強型RISC架構的單晶片。ATMEL

    公司以製作 FLASH 記憶體設計製造技術為最著名。自從該公司將 MCS-51 單晶

    片核心結合 FLASH 記憶體,推出 AT89C5l 與 ATCl051 等一系列單晶片,取代傳

    統 80C51 單晶片,成為 MCS-51 核心晶片的主流晶片。但在面對 Microchip 推出

    以 RISC 指令架構的 PIC 系列單晶片的強大壓力下,針對 PIC 與 MCS-51 晶片族

    的優缺點加以改良,於 1997 年研發推出 AVR 增強型精簡微控制器(AVR

    Enhanced RISC Microcontroller),AVR 晶片的內部架構如圖 2.2 所示。晶片功能

    特性說明如下:

    圖 2.2 AVR 晶片內部架構圖

    將程式記憶體 OTP(可燒錄一次),改用 Flash 架構,可重複燒洗 1000 次以

    上,提高程式修改的次數。價格在 50~200 元間。

    低耗電(lUA~2.5mA)、高速度(50nS),具 SLEEP 功能與 CMOS。

    11

  • AVR 具有一個指令一個時脈的高速執行能力。在 20MHz 的工作頻率下,大

    部分指令只需 50nS。

    超功能的 RISC 精簡指令架構,32 個工作暫存器,及 128-512 個內部靜態

    SRAM,可靈活運用的 118 個指令,並提供完整 C 高階語言,易學易用。

    工業級的產品,具 WDT 安全保護功能,具大電流輸出 10~20mA 或 40mA

    的單一輸出,可直接驅動 SSR 或繼電器。

    串列埠有 UART 不佔用計數器及 SCI 傳輸功能,故可高速工作這 576K 的

    傳輸率。

    AVR 單晶片包括 Attiny、AT90 與 ATmega 三個系列,分別對應到低、中、

    高三種層次的產品。依據使用者不同,現已推出 30 多種型號的晶片,接腳由 8~64

    支。內部的配置也有所不同,但基本的結構與功能,指令系統彼此也相容。AVR

    晶片種類簡述如下:

    ATiny11/12:簡易型的 AVR。1KB 的 Flash ROM、晶片包裝只有 8 接腳,

    有五個 I/O 接點,具備一類比比較器,如 ATiny11/12...等晶片。

    AT90:即一般最常見的 AVR 機型,如 AT90LS23XX、AT90LS4433、

    AT90LS85XX 等。Flash ROM 由 2KB~8KB、RAM 由 128B~512B。晶片接腳數

    由 8~44。

    ATmega:為高階型 AVR 機型。Flash ROM 由 8KB~128KB、RAM 由

    1KB~4KB。晶片接腳數由 28~64。提供 PWM、UART、SPI 等功能。

    12

  • 第三章 實際範例

    3.1 矩陣型 LED 顯示動態字元

    對 8x8 矩陣型 LED 而言,字元的移動變化,如上移、下移、左移、右移等,

    如果每次移動一行(左移、右移)或一列(上移、下移),當移動 8 次後即重覆相同

    的畫面。若使用 8 位元組的記憶體作為字型變化的緩衝區,其字型緩衝區資料對

    映如圖 3.1 與表 3.1。

    圖 3.1 字型資料對映圖

    表 3.1 字型資料對映表

    行 字型資料 字型資料指標

    1 0xff ptr[0]

    2 0xc0 ptr[1]

    3 0xb7 ptr[2]

    4 0x77 ptr[3]

    5 0x77 ptr[4]

    6 0xb7 ptr[5]

    7 0xc0 ptr[6]

    13

  • 8 0xff ptr[7]

    3.1.1 左移

    字型左移如圖 3.2 所示,先將 ptr[0]存入 temp 中。

    再依次將 ptr[l]存入 ptr[0],ptr[2]存入 ptr[l],ptr[3]存入 ptr[2]等。

    最後再將 temp 存入 ptr[7]中。

    圖 3.2 字型左移變化

    3.1.2 右移

    字型右移如圖 3.3 所示,先將 ptr[7]存入 temp 中。

    再依次將 ptr[6]存入 ptr[7],ptr[5]存入 ptr[6],ptr[4]存入 ptr[5]等。

    最後再將 temp 存入 ptr[0]中。

    14

  • 圖 3.3 字型右移變化

    3.1.3 上移

    字型上移如圖 3.4 所示,將 ptr[0]~ptr[7]內容左移 1 位元。

    圖 3.4 字型上移變化

    3.1.4 下移

    字型下移如圖 3.5 所示,將 ptr[0]~ptr[7]內容右移 1 位元。

    15

  • 圖 3.5 字型下移變化

    3.2 16x16 矩陣型 LED 顯示器中文字型顯示原理

    中文字型有兩種,一為 16x15 字型,一為 24x24 字型,如果是 16x15 字型,

    則每一個字型佔用 30 個位元組(16x15/8=30)的記憶體空間,且必須使用 4 個 8x8

    矩陣型 LED;如果是 24x24 字元;則每一個字型佔用 72 個位元組(24x24/8=72)的

    記憶體空間,且必須使用 9 個 8x8 矩陣型 LED。本實驗使用 4 個 8x8 矩陣型 LED

    顯示單一個 16x15 中文字生為了節省 MCS-51 的埠腳使用,我們使用 74LS373

    的閂鎖型 IC,將兩個位元組的字型資料分別閂鎖在 IC 內,並且使用 4 對 16 的

    解碼器產生行掃描信號。

    本實驗顯示中文字型"光","光"字的字型顯示如圖 3.6,其字型資料如表

    3.2,每一行兩個位元組資料,共 32 個位元組,因為是使用 4 個 8x8 矩陣型 LED

    顯示器,所以必須將其連接起來如圖 3.7 所示,才能正常使用。

    16

  • 圖 3.6 中文字“光"的字型顯示

    圖 3.7 4 個 8x8 LED 連接成 1 個 16x16 LED

    17

  • 表 3.2 中文字“光"的字型資料

    位元組 1 2 3 4 5 6 7 8

    1 0xdf 0xdf 0xdf 0xdd 0xd3 0x1f 0xdf 0xc0

    2 0xff 0xdf 0xef 0xf7 0xf9 0xfe 0xff 0xff

    位元組 9 10 11 12 13 14 15 16

    1 0xdf 0x1f 0xd7 0xdb 0xdd 0xcd 0xdf 0xff

    2 0xff 0xe0 0xdf 0xdf 0xdf 0xdf 0xc3 0xff

    表 3.3 中文字“光"的字型填入資料

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

    1 0

    2 0 0 0 0

    3 0 0 0

    4 0 0 0

    5 0 0

    6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    7 0 0

    8 0 0

    9 0 0

    10 0 0

    11 0 0 0

    12 0 0 0

    13 0 0 0

    14 0 0 0 0 0 0

    15

    16

    3.3 16x16 矩陣型 LED 顯示器動態中文字型顯示

    中文字型的移動變化,與先前所提之英文字型移動變化原理相同,是藉由改

    變行資料內容使字型左、右移,或改變列資料內容使字型上、下移。由於 16x16

    18

  • 中文字型每行需要 2 個位元組,所以字型在移動一行或一列時,必須同時改變 2

    個位元組的內容,才能使字型移動一行或一列。

    本實驗藉由四個按鍵開關來控制一個中文字"光"的上、下、左、右移變化,

    當按 RESET 鍵時,系統重置,畫面顯示"光"字且保持不動,當按 SW0 鍵時,字

    型左移,按 SW1 鍵時,字型上移,按 SW2 鍵時,字型右移,按 SW3 鍵時,字

    型下移。

    圖 3.8 16x16 矩陣型 LED 顯示器電路圖

    19

  • 圖 3.9 16x16 矩陣型 LED 顯示器流程圖

    3.4 SDCC 版本檢查確認

    在 C:\sdcc\bin\鍵入 sdcc –version 如圖 3.10 所示

    圖 3.10 SDCC 版本確認

    20

  • 3.5 程式編譯

    在 C:\sdcc\bin\鍵入 sdcc sdcctest.c 如圖 3.11 所示

    圖 3.11 程式編譯

    編譯後產生的檔案

    sdcctest.asm: 程式的彙編檔

    sdcctest.lst: 程式的列表檔

    sdcctest.rst: 被鏈結器更新的列表檔

    sdcctest.map:變數擺的位置以及每個程式所佔的空間

    sdcctest.ihx: 十六進位格式的 hex 檔

    21

  • 第四章 結論

    4.1 心得

    所有牽涉到精確計時的副程式中,用組合語言會有更快的反應速度。

    所有的 805l C 語言編譯程式都會建議使用者小心使用組合語言,以免造成

    當機。

    C語言編譯時可以指定對執行速度SPEED或是程式碼CODE SIZE進行最佳

    化,我們必須加以瞭解及使用。

    對於 RESET 之後的 C 啟動程式 STARTUP,請務必進行所有動作的確認。

    如果發覺某些副程式的執行速度不夠快時,先試著用 C 進行改寫,再不行

    就要用組合語言。

    大部份 C 語言的最佳化僅僅是針對該語言而已,並末對 8051 的程式碼進行

    最佳化,如果還要更快時,只有改用組合語言。若改用組合語言後仍不夠快時,

    我們建議您這部份直接用硬體來處理,這才是治標兼治本之道。

    C 語言處理中斷的處理速度並不遜於組合語言,但是使用前須瞭解其進入及

    返回原程式的步驟,以免造成無心的當機。

    隨時觀察系統的輸出 MAP 檔,以確認各個變數的擺放位置,是否真的擺進

    SRAM 區內部。

    C 語言所寫的控制系統比組合語言而言,有更多不確定性存在,這些不確定

    性包含了我們程式寫法的執行錯誤(RUNTIME ERROR),以及編譯程式的隱藏

    性 bug,所以我們要有一套更嚴謹的程式驗證步驟,對程式碼進行全盤檢查。

    組合語言及 C 語言真的無法斷定孰優孰劣,只要選對使用時機。

    4.2 結論

    如果真的想要用 C 語言來駕馭 8051,請注意以下兩點:第一,儘量加大程式

    空間(Program Memory),以便容納 C 語言轉換出來的 machine code。第二,擴充

    外部的資料空間(Data Memory)到 2K Bytes 甚至 32K Bytes,讓 C 有絕對足夠的

    22

  • 空間來保存變數及外部的堆疊。對 C 而言,8051 的堆疊是絕對不足的,所以 C

    會自己建立一個 external stack 的機制,以便更有效地運用外部的 SRAM 區。說

    更明白一點,將 8051 的系統擴充到 ROM 64K,SRAM 也接近 64K,這時用 C

    語言就沒有任何疑慮了。

    23

  • 參考文獻

    [1] 林伸茂,“8051 單晶片徹底研究 經驗篇”,旗標出版社,

    pp.1-1~1-20、 5-1~5-43,2002

    [2] 陳明熒,“單晶片 8051 KEIL C 實作入門”,文魁資訊,pp.1-1~1-20、

    4-2~4-14、 5-2~5-18, 2005

    [3] 林振漢,“8051 單晶片實作 : 使用 C 語言”,博碩文化,pp.1-1~1-8、

    8-2~8-23, 2004

    [4] 溫植燁,“8051 單晶片實務與應用”,文魁資訊,pp.3-2~3-15,2002

    [5] 楊明豐,“8051 單晶片 C 語言設計實務”,碁峰資訊,pp.1-2~1-10、

    3-2~3-20, 2003

    [6] SDCC - Small Device C Compiler

    [7] 蔡朝洋,“單晶片微電腦 8051/8951 原理與應用”,全華科技,

    pp.4-2~4-18、 9-2~9-24, 2003

    24

    http://sdcc.sourceforge.net/

  • 附錄一

    程式

    #include "reg51.h" /*含 8051 所有暫存器宣告*/

    #define COLS 16 /*16 行*/

    #define ROWS 2 /*每行有 2個位元組資料*/

    int KeyScan(void); /*函數原型宣告*/

    void DelayX10ms(int); /*函數原型宣告*/

    char count=4; /*動態掃描速度控制*/

    char ScanLine=0; /*行掃描信號*/

    char offset=0;

    int keytemp=0xff; /*鍵值*/

    int key=0xff; /*鍵值*/

    char i=0; /*行資料指標*/

    char j; /*列資料指標*/

    sbit P1_4=0x94; /*8051 接腳定義*/

    sbit P1_5=0x95; /*8051 接腳定義*/

    unsigned char *ptr[COLS];

    unsigned char pattern[COLS][ROWS]= /*中文字型"光"字資料*/

    {{0xdf,0xff},{0xdf,0xdf},

    {0xdf,0xef},{0xdd,0xf7},

    {0xd3,0xf9},{0x1f,0xfe},

    {0xdf,0xff},{0xc0,0xff},

    {0xdf,0xff},{0x1f,0xe0},

    {0xd7,0xdf},{0xdb,0xdf},

    {0xdd,0xdf},{0xcd,0xdf},

    25

  • {0xdf,0xc3},{0xff,0xff}};

    main() /*主程式*/

    {

    void ShiftLeft(void); /*左移函數原型宣告*/

    void ShiftRight(void); /*右移函數原型宣告*/

    void ShiftUp(void); /*上移函數原型宣告*/

    void ShiftDown(void); /*下移函數原型宣告*/

    char i;

    IE=0x82; /*致能計時器 0中斷*/

    TMOD=0x02; /*設定計時器 0工作於模式 2*/

    TH0=(256-250); /*計時器 0中斷時間為 250us*/

    TL0=(256-250);

    P1_4=0; /*除能第一個 74373*/

    P1_5=0; /*除能第二個 74373*/

    TR0=1; /*啟動計時器 0*/

    for(i=0;i

  • else if(key==3) ShiftDown(); /*若鍵值 key=3 則下移*/

    DelayX10ms(50);

    }

    }

    void ShiftLeft(void) /*左移函數*/

    {

    char i;

    unsigned char *temp;

    TR0=0;

    temp=*ptr;

    for(i=0;i0;i--)

    *(ptr+i)=*(ptr+i-1);

    *ptr=temp;

    27

  • TR0=1;

    } /* ShiftRight */

    void ShiftUp(void) /*上移函數*/

    {

    char i,j;

    unsigned char temp[ROWS];

    TR0=0;

    for(i=0;i=1;

    }

    for(j=0;j

  • } /* ShiftUp */

    void ShiftDown(void) /*下移函數*/

    {

    char i,j;

    unsigned char temp[ROWS];

    TR0=0;

    for(i=0;i

  • void T0_int(void) interrupt 1 /*矩陣型 LED 動態掃描函數*/

    {

    if(--count==0) /*已經過 1ms*/

    {

    count=4;/*重設 count=4*/

    j=0;/*設列資料指標 j=0*/

    P2=*(*(ptr+i)+j); /*輸出第一位元組字型資料*/

    P1_4=1; /*閂鎖*/

    P1_4=0;

    j++;

    P2=*(*(ptr+i)+j);

    P1_5=1;

    P1_5=0;

    P1=ScanLine; /*輸出行掃描信號*/

    ScanLine++; /*掃描下一行*/

    i++; /*指向下一行字型資料*/

    if(ScanLine==16) /*已掃描完 16 行*/

    {

    ScanLine=0; /*重設掃描信號*/

    i=0; /*重設行資料指標*/

    }

    }

    }

    int KeyScan(void) /*鍵盤掃描函數*/

    {

    30

  • int KeyValue=0; /*清除鍵值*/

    char KeyStatus; /*按鍵狀態*/

    char KeyScanLine=0x01; /*鍵盤掃描信號*/

    char col; /*行數*/

    char row; /*列數*/

    for(col=0;col>=2; /*保留按鍵狀態*/

    for(row=0;row>=1; /*偵測下一個按鍵*/

    }

    }

    KeyScanLine

  • KeyValue=0xff; /*沒有按鍵輸入*/

    return(KeyValue); /*傳回鍵值*/

    } /* KeyScan */

    void DelayX10ms(int times) /*延遲函數*/

    {

    int i,j;

    for(i=0;i

  • 附錄二

    8 X 8 點矩陣腳位

    A B C D E F G H

    DH 3H 4H GH 6H FH BH AH

    DC 3C 4C GC 6C FC BC AC

    D8 38 48 G8 68 F8 B8 A8

    DE 3E 4E GE 6E FE BE AE

    D1 31 41 G1 61 F1 B1 A1

    D7 37 47 G7 67 F7 B7 A7

    D2 32 42 G2 62 F2 B2 A2

    D5 35 45 G5 65 F5 B5 A5

    1 2 3 4 5 6 7 8

    33

  • 附錄三

    實體電路

    34

    封面.pdfCompile Assembler by SDCC

    name.pdf摘要.pdf內文.pdf