008 ;0:CLK_SOURCE/2 ; 1:CLK_SOURCE/4 009 ;2:CLK_SOURCE/8 ; 3:CLK_SOURCE/16 010 ;4:CLK_SOURCE/32 ; 5:CLK_SOURCE/64 011 ;6:CLK_SOURCE/128; 7:CLK_SOURCE/256 012 ANALOG_CHANNEL == 0X0E ;設定ADC轉換的CHANNEL 013 014 ORG 0X0000 ;程式起始位址 015 JMP INITIAL 016 017 ORG 0X0100 018 ;主程式起始化 019 INITIAL: 020 CALL DELAY 021 MOV A,#0X00 022 MOV IOCA,A ;將 PORT A 設為 OUTPUT 023 MOV PORTA,A ;設定PORT A 的初值為00 024 CLR R41 ;設定R41的初值為00 025 CLR R42 ;設定R42的初值為00 026 CLR PRIE ;清除此暫存器以除能其週邊功能 027 BS PRIE,ADE ;設定週邊功能中的ADC致能 028 CLR ADDATAH ;設定ADDATAH 的初值為00 029 CLR ADDATAL ;設定ADDATAL 的初值為00 030 CLR ADCAIS ;設定ADCAIS 的初值為00 031 MOV A,#CKR ;設定ADC轉換的速率 032 OR A,#0B00111000 ;設定ADC類比輸入 033 MOV ADCAIS,A ;設定ADC類比輸入及ADC轉換速率 034 MOV A,#ANALOG_CHANNEL ;設定ADC轉換的CHANNEL 035 ADD A,#0B11000000 036 MOV ADCCR,A 037 ENI 038 ;ADC轉換開始 039 AD_START: 040 BS ADCCR,ADRUN ;ADC轉換開始 041 ;等待AD轉換完成 042 WAIT_AD_TRANS: 043 ;當AD_STATE中 TRANS_OK BIT 為1 044 ;表示AD轉換完成 045 ;程式跳至AD_TRANS_OK執行 046 JBS INTF,ADIF,AD_TRANS_OK 047 NOP ~ 11 ~
048 JMP WAIT_AD_TRANS ;若無則程式跳回繼續等待 049 ;AD轉換完成 050 AD_TRANS_OK: 051 ;AD轉換完成 052 BC INTF,ADIF ;清除AD_STATE的TRANS_OK BIT 053 MOV A,ADDATAH ;將資料傳給PORT A 054 MOV PORTA,A 055 JMP AD_START ;程式跳至AD_START繼續執行 056 ;DELAY副程式 057 DELAY: 058 MOV A,#0X10 059 MOV TEMP5,A 060 ;延遲副程式下的LABEL 061 DELAYDD: 062 DJZ TEMP5,DELAYA 063 MOV A,#0X11 064 MOV TEMP3,A 065 ;延遲副程式下的LABEL 066 DELAYCC: 067 DJZ TEMP3,DELAYDD 068 MOV A,#0X22 069 MOV TEMP4,A 070 ;延遲副程式下的LABEL 071 DELAYAA: 072 DJZ TEMP4,DELAYCC 073 JMP DELAYAA 074 ;延遲副程式下的LABEL 075 DELAYA: 076 RET 077 078 079 ORG 0X3FFF 080 DW 0X4000
~ 12 ~
2. 實習2 - 類比數位轉換應用實習
? 動作說明
程式使用ADC的功能,由VR類比輸入訊號經由MCU轉換成數位訊號,並把十六進制轉成十進制秀在LCD上。 ? 硬體連接
此範例使用ET44M210的實驗電路板。 ? 程式說明
此範例使用ADC的功能,程式一開始先起始ET44M210的動作:除能所有的中斷功能,設定PORT A為輸出端,清除ADDATAH、ADDATAL 的值,設定ADC類比輸入及ADC轉換速率,設定ADC轉換的Channel。當起始ET44M210的動作完成後,呼叫Initial_LCD副程式,起始LCD 。之後ADC便開始轉換,並等待ADC轉換完成,當ADC轉換完成後,將ADC轉換完成後的資料傳給PORT A,再將ADC轉換完成後的資料轉換成十進位秀在LCD上,程式跳至AD_START繼續執行。 ? 流程圖
STARTADC中斷向量起始ET44M210將ADC轉換的值傳給PORT A起始LCD顯示器將ADC轉換的值轉換成十進制寫入LCDADC轉換開始ADC轉換開始等待AD轉換完成RETI
~ 13 ~
? 程式碼 ADC02.dt中副程式及程式區段說明 ADC02.dt 程式共包含了18個副程式及程式區段,依照程式的撰寫順序有: ADCONVERT: 、 START: 、 AD_START: 、 INITIAL: 、 INITIAL_LCD: 、 CLEAR_LCD: 、 WRITE_COMMAND: 、 WRITE_LCD: 、 HUND: 、 ADD_H: 、 TEN: 、 ADDTEN: 、 DELAY: 、 D2: 、 DELAY1: 、 D1: 、 DELAY3: 、 D3: 為了方便讀者閱讀瞭解,針對程式中所定義的LABEL,以字母排序,整理如下表: 程式中所定義的副程式或LABEL說明 編號 LABEL名稱 0 ADCONVERT: 1 ADDTEN: 2 ADD_H: 3 AD_START: 4 CLEAR_LCD: 5 D1: 6 D2: 7 D3: 8 DELAY1: 9 DELAY3: 10 DELAY: 11 HUND: 12 INITIAL: 13 INITIAL_LCD: 14 START: 15 TEN: 17 WRITE_LCD: 行號 40 ADC中斷副程式 225 二進制轉十進制副程式下的LABEL 214 二進制轉十進制副程式下的LABEL 88 ADC轉換開始 166 清除顯示器副程式 255 延遲副程式1下的LABEL 239 延遲副程式下的LABEL 272 延遲副程式3下的LABEL 249 延遲副程式1 265 延遲副程式2 233 延遲副程式 207 二進制轉十進制 103 起始副程式;起始ET44M210的動作 138 INITIAL_LCD副程式 84 程式開始 218 二進制轉十進制副程式下的LABEL 191 寫入資料副程式 說明 16 WRITE_COMMAND: 174 寫入命令副程式 本表格是針對程式中所定義的LABEL所整理出來的,針對表格每一欄的屬性說明如下: 編號:為該表格中所要說明的LABEL順序編號。 LABEL名稱:為程式中實際的LABEL名稱。 行號:為該LABEL實際於程式中第幾行。 說明:該說明用以描述解釋該LABEL下面的副程式或程式區段所要執行的動作。
~ 14 ~
ADC02.dt完整的原始程式碼 000 /*********************************************** 001 程式說明 002 由VR類比輸入訊號經由MCU轉換成數位訊號, 003 並把十六進制轉成十進制秀在LCD上 004 ************************************************/ 005 INCLUDE \ 006 PORTC == 0X16 007 LCMRS == 0X04 ;LCD RS(暫存器選擇) 008 PORTF == 0X19 009 SRCS == 0X00 ;FLASH RAM CHIP SELECT 010 LCMEN == 0X03 ;LCD ENABLE(致能) 011 R41 == 0X41 012 R42 == 0X42 013 R43 == 0X43 014 AD_STATE == 0X47 015 TRANS_OK == 0X00 016 COMBUFFER == 0X50 ;自設的暫存器(命令緩衝區) 017 DATABUFFER == 0X51 ;自設的暫存器(資料緩衝區) 018 TIMER1 == 0X52 ;自設的暫存器(延時計數用) 019 TIMER2 == 0X53 ;自設的暫存器(延時計數用) 020 TIMER3 == 0X54 ;自設的暫存器(延時計數用) 021 H_COUNTER == 0X55 022 T_COUNTER == 0X56 023 PIECE == 0X57 024 Y_BUFFER == 0X58 025 CKR == 7 ;設定ADC轉換的速率 026 ;0:CLK_SOURCE/2 ; 1:CLK_SOURCE/4 027 ;2:CLK_SOURCE/8 ; 3:CLK_SOURCE/16 028 ;4:CLK_SOURCE/32 ; 5:CLK_SOURCE/64 029 ;6:CLK_SOURCE/128; 7:CLK_SOURCE/256 030 ANALOG_CHANNEL == 0X0E ;設定ADC轉換的CHANNEL 031 032 ORG 0X0000 033 JMP START 034 035 ORG 0X0038 ;ADC中斷位址 ~ 15 ~