SM59R16A2 參考程式 使用手冊 SM59R16A2 參考程式使用手冊 適用微控制器型號:SM59R16A2、SM59R08A2 內 容 1. 概要 .................................................................................................................................................................2 1-1 簡介 ........................................................................................................................................................2 1-2 開發平台 ................................................................................................................................................2 1-2 檔案配置 ................................................................................................................................................2 1-3 使用方法 ................................................................................................................................................3 2. 周邊功能函式 .................................................................................................................................................4 2-1 I/O_7Segment........................................................................................................................................4 2-2 Interrupt................................................................................................................................................6 2-3 Timer .....................................................................................................................................................8 2-4 類比數位轉換(ADC)..........................................................................................................................15 2-5 16x2 字元型 LCD 顯示器...................................................................................................................19 2-6 內部 EEPROM 功能 (Internal EEPROM) ...................................................................................26 2-7 I2C 模組 ...............................................................................................................................................29 2-8 Microwire 模組 ...................................................................................................................................35 2-9 Pulse Width Modulation (PWM) ......................................................................................................41 2-10 其他應用函式 ...................................................................................................................................44 2-10-1 4x4 鍵盤.................................................................................................................................44 2-10-2 蜂鳴器....................................................................................................................................44 2-10-3 延時函式................................................................................................................................45 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 1 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 1. 概要 1-1 簡介 SM59R16A2 系列 MCU 係一功能多,性能優異之微控制器。本公司為此提供使用者參考程式及 應用電路供使用者參閱。以期能協助使用者快速熟悉,順利導入到所開發之專案中。 1-2 開發平台 ® 本參考程式全部以 C 語言撰寫,編譯器(Compiler)為 Keil C51 v7.5;連結器(Linker)為 BL51 v5.12; 整合環境為μVision 2。所有程式以新茂公司 SM59R16A2 64-pin demo board 為運行的 Target Board(note 1) 。微控制器(Micro- controller)為 SM59R16A2C25WP。並使用新茂 On-Chip Debugger 為開發工具。 1-2 檔案配置 每個 .C 檔案都有一個相對應的 .h 檔案,提供函式宣告和定義。並按功能分類存放於各資料夾之 中。 \Demo \Demo\Output 存放 64-pin demo board,demo 程式原始碼。 存放 64-pin demo board,demo 程式之 Hex code 及 debug file。 \h \I/O_7Segment \Interrupt \Timer \ADC \LCD \InternalEE \IIC \Microwire \PWM \MISC 存放 SM59R16A2 所有暫存器定義,及一般常用之定義。 存放 I/O port 驅動七段顯示器之函式。 存放中斷之相關函式。 存放計時/計數器相關函式。 存放類比數位轉換器 ADC 相關函式。 存放 16x2 字元型 LCD 相關函式。 存放內建 EEPROM 相關函式。 存放 I2C 模組相關函式。 存放 Microwire 相關函式。 存放 PWM 相關函式。 存放其他應用例如:4x4 鍵盤、蜂鳴器、延時等相關函式。 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 2 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 1-3 使用方法 1. 本公司提供完整原始程式碼,使用者可以複製其中的函式到您的專案上並加以修改,以符合您目標 板上之線路配置,並達到最佳化。(note 1) 2. 如果使用者要直接引入(Include),可將您的 project 放在各函式目錄的同一階層,如下圖所示,並 將使用到之函式加入到您的 Keil® project 視窗中,重新編譯(compile)即可。 FolderName Your_project ---- main.c h Interrupt Timer ADC : MISC Note 1: 使用者需依所使用的 Target Board 修改程式碼,(例如:修改 I/O pin 定義與所連接之周邊設備)以確保在使用者的系統上正確地 運作。因此本公司不保證本程式碼可以直接運行於使用者的 Target Board。 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 3 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2. 周邊功能函式 2-1 I/O_7Segment 64-pin demo board 上配置兩個七段顯示器,並連接於 Port 2 上。七段顯示器的輸入為 BCD 碼, 所以在輸入之前需先經過數值轉換。在 Segment7.h 中,定義 Seg7_Port 為 Port 2,使用者可依所使用 的 Target Board pin 腳配置進行調整。 函式宣告 :void Wr7SegmentDec(unsigned char Value) 功能 :將一個 byte 資料顯示在七段顯示器上(BCD) 含括檔 :Segment7.h 傳入值 返回值 :Value 參數:欲寫入七段顯示器之數值,以 Byte 表示。 :無 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\MISC\Delay.h" #include "..\IO_7Segment\Segment7.h" void main() { unsigned char Counter; Seg7_Port Counter = 0x00; = 0; while(1) { if(Counter<100) { Wr7SegmentDec(Counter); Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 4 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 Delay10mSec(100); Counter ++; } else Counter = 0; } } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 5 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-2 Interrupt SM59R16A2 的周邊很多可以觸發產生 CPU 中斷,在此以兩個外部中斷(int0、int1)為例,說明中 斷的初始化。其他另有 Timer、ADC 的中斷,請參閱相關章節。 函式宣告 :void Int0Init(unsigned char IntConfig, unsigned char IntType) 功能 :初始化外部中斷 0 (INT 0),並打開暫存器 IEN0 之 EA bit。 含括檔 :Interrupt.h 傳入值 :欲設定外部中斷 0 的組態及觸發的型態。 IntConfig 參數:設定暫存器 IEN0。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。 IntConfig ∈{ EXINT0_EN } IntType 參數:設定觸發型態。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。 返回值 IntType ∈{ INT0_FALLEDGE,INT0_LOWLEVEL } :無 本函式初始化 INT 0 之後,亦同時致能 INT 0。 函式宣告 :void Int1Init(unsigned char IntConfig, unsigned char IntType) 功能 :初始化外部中斷 1 (INT 1),並打開暫存器 IEN0 之 EA bit。 含括檔 :Interrupt.h 傳入值 :欲設定外部中斷 1 的組態及觸發的型態。 IntConfig 參數:設定暫存器 IEN0。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。 IntConfig ∈{ EXINT1_EN } IntType 參數:設定觸發型態。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。 返回值 IntType ∈{ INT1_FALLEDGE、INT1_LOWLEVEL } :無 本函式初始化 INT 1 之後,亦同時致能 INT 1。 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 6 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\MISC\Delay.h" #include "..\Interrupt\Interrupt.h" void Int0ISR(void); unsigned char SW1Pressed = 0; void main() { Int0Init( EXINT0_EN, INT0_LOWLEVEL ); while(1) { if( SW1Pressed ) { SW1Pressed = 0; Delay10mSec(1); } } } void Int0ISR(void) interrupt 0 using 1 { //Clear TCON_IE0 Flag. This flag can be cleared by software //and is automatically cleared when interrupt is processed, too. //INT0IF = 0; SW1Pressed = 1; } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 7 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-3 Timer 函式宣告 :void Timer0_Init(unsigned char T0Mode, unsigned int TimerValue) 功能 :初始化計時器 0。 含括檔 :Timer.h 傳入值 :欲設定計時器 0 的運作模式及初始值。 T0Mode 參數:設定暫存器 TMOD。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。 T0Mode ∈{ T0_GATE_EN,T0_ASCOUNTER,T0_13B_MODE,T0_16B_MODE, T0_8BREL_MODE,T0_IND8BMODE } 返回值 TimerValue 參數:設定計時器初始值。TimerValue ∈{ 0, 1, 2, …, 65535 } :無 函式宣告 :void Timer1_Init(unsigned char T1Mode, unsigned int TimerValue) 功能 :初始化計時器 1。 含括檔 :Timer.h 傳入值 :欲設定計時器 1 的運作模式及初始值。 T1Mode 參數:設定暫存器 TMOD。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。 T1Mode ∈{ T1_GATE_EN,T1_ASCOUNTER,T1_13B_MODE,T1_16B_MODE, T1_8BREL_MODE,T1_STOPMODE } 返回值 TimerValue 參數:設定計時器初始值。TimerValue ∈{ 0, 1, 2, …, 65535 } :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 8 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void Timer2_Init(unsigned char T2Control, unsigned int TimerValue) 功能 :初始化計時器 2。 含括檔 :Timer.h 傳入值 :欲設定計時器 2 的運作模式及初始值。 T2Control 參數:設定暫存器 T2CON。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。 T2Control ∈{ T2_CLK12,T2_CLK24, T2_FALL_EDGE,T2_RISE_EDGE, T2_REL_DIS,T2_REL_MODE0,T2_REL_MODE1, T2_CMP_MODE0,T2_CMP_MODE1, T2_STOP,T2_INF,T2_EXF,T2_GATED } TimerValue 參數:設定計時器初始值。TimerValue ∈{ 0, 1, 2, …, 65535 } 返回值 :無 函式宣告 :void Timer0_IntEN(unsigned char T0Priority) 功能 :設定並啟動計時器 0 之中斷。 含括檔 :Timer.h 傳入值 :欲設定計時器 0 的中斷等級。 返回值 T0Priority 參數:計時器 0 的中斷等級。T0Priority ∈{ 0, 1, 2, 3 } :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 9 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void Timer1_IntEN(unsigned char T1Priority) 功能 :設定並啟動計時器 1 之中斷。 含括檔 :Timer.h 傳入值 :欲設定計時器 1 的中斷等級。 返回值 T1Priority 參數:計時器 1 的中斷等級。T1Priority ∈{ 0, 1, 2, 3 } :無 函式宣告 :void Timer2_IntEN(unsigned char T2Priority) 功能 :設定並啟動計時器 2 之中斷。 含括檔 :Timer.h 傳入值 :欲設定計時器 2 的中斷等級。 返回值 T2Priority 參數:計時器 2 的中斷等級。T2Priority ∈{ 0, 1, 2, 3 } :無 函式宣告 :void Timer0_IntDis(void) 功能 :關閉計時器 0 之中斷。 含括檔 :Timer.h 傳入值 返回值 :無 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 10 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void Timer1_IntDis(void) 功能 :關閉計時器 1 之中斷。 含括檔 :Timer.h 傳入值 返回值 :無 :無 函式宣告 :void Timer2_IntDis(void) 功能 :關閉計時器 2 之中斷。 含括檔 :Timer.h 傳入值 返回值 :無 :無 函式宣告 :void SetTimer0Value(unsigned int TimerValue) 功能 :設定計時器 0 之起始值。 含括檔 :Timer.h 傳入值 返回值 :TimerValue 參數:設定計時器初始值。TimerValue ∈{ 0, 1, 2, …, 65535 } :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 11 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void SetTimer1Value(unsigned int TimerValue) 功能 :設定計時器 1 之起始值。 含括檔 :Timer.h 傳入值 返回值 :TimerValue 參數:設定計時器初始值。TimerValue ∈{ 0, 1, 2, …, 65535 } :無 函式宣告 :void SetTimer2Value(unsigned int TimerValue) 功能 :設定計時器 2 之起始值。 含括檔 :Timer.h 傳入值 返回值 :TimerValue 參數:設定計時器初始值。TimerValue ∈{ 0, 1, 2, …, 65535 } :無 除了上述的函式之外,在 Timer.h 檔案中已定義如下之巨集: 巨集名稱 功能 Timer0_Run( ) Timer 0 run Timer0_Stop( ) Timer 0 stop Timer1_Run( ) Timer 1 run Timer1_Stop( ) Timer 1 stop Timer2_Stop( ) Timer 2 stop Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 12 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\Timer\Timer.h" #include "..\MISC\4x4Keypad.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // The 64-pin demo board use 22.1184MHz as system clock. // // Timer 0 uses system clock by 12 as clock source. // // 22.1184/12 = 1.8432MHz. // // (1/1.8432MHz)*18432 = 10ms. // // // // Therefore, if we want timer0 interrupt every 20ms, // // The timer 0 should count 18432*2 = 36864, then // // interrupt. // // The TH0 and TL0 should be setted to 65535-36864. // // That is 28671. // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// #define T0ReloadValue 28671 void Timer0ISR (void); unsigned char KeypadValue, Timer0OverFlow=0; void main() { unsigned char temp; Timer0_Init( T0_16B_MODE, T0ReloadValue ); Timer0_IntEN(0); // Set Timer 0 as 16 bit // Set Timer 0 interrupt priority as 0 Timer0_Run(); while(1) { if( Timer0OverFlow ) { Timer0OverFlow = 0; temp = ScanKeypad(); if (temp>=0 && temp <=9) P2 = temp; else P2 = NoKeyPressed; // P2 is 7 segment. Force P2 to shows 0~9 only. } } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 13 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 } void Timer0ISR (void) interrupt 1 using 0 { //Clear Timer0 Flag. This flag can be cleared by software //and is automatically cleared when ISR is processed SetTimer0Value( T0ReloadValue ); Timer0OverFlow = 1; } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 14 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-4 類比數位轉換(ADC) 函式宣告 :void ADCInit(unsigned char ADC_Channel, unsigned char ADC_Setting) 功能 :初始化 ADC 功能。 含括檔 :ADC.h 傳入值 :欲致能之 ADC 通道(Channels)及設定值。 ADC_Channel 參數:設定暫存器 ADCC1。常用的參數定義於 SM59R16A2_ExtraDef.h 檔 案中。ADC_Channel ∈{ ADCC0_EN,ADCC1_EN,ADCC2_EN,ADCC3_EN } ADC_Setting 參數:設定暫存器 ADCC2。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案 中。ADC_Setting ∈{ ADC_8BIT,ADC_10BIT, ADC_CH0_IN,ADC_CH1_IN,ADC_CH2_IN,ADC_CH3_IN, ADC_CLK_DIV8,ADC_CLK_DIV16,ADC_CLK_DIV32, ADC_CLK_DIV64 } 返回值 :無 函式宣告 :void ADCInt_EN(void) 功能 :致能(Enable)ADC 中斷功能。 含括檔 :ADC.h 傳入值 返回值 :無 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 15 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void ADC_ChannelSel(unsigned char ADC_Channel) 功能 :選擇 ADC 輸入通道(Channels)。 含括檔 :ADC.h 傳入值 :欲選擇之 ADC 通道。 ADC_Channel 參數:設定暫存器 ADCC2。常用的參數定義於 SM59R16A2_ExtraDef.h 檔 案中。ADC_Channel ∈{ ADC_CH0_IN,ADC_CH1_IN,ADC_CH2_IN,ADC_CH3_IN } 返回值 :無 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\LCD\LCD16x2.h" #include "..\ADC\ADC.h" unsigned char ADCDone; void main() { LCD_Init(); PrintLcdStr("SyncMOS ADC"); SetCursorAddr(2, 0); // Initialize ADC // -------------------------------------------------------------------------// Turn on all ADC 4 channels. 8 bit, System clock divided by 8 // -------------------------------------------------------------------------// ADCInit(ADCC3_EN|ADCC2_EN|ADCC1_EN|ADCC0_EN, ADC_8BIT|ADC_CLK_DIV8); // Enable ADC interrupt ADCInt_EN(); ADCDone = false; do { // -----------------------------------// Catch channel 0 // -----------------------------------ADC_ChannelSel(ADC_CH0_IN); ADCStart(); Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 16 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 while( ADCDone ) { ADCDone = false; PrintLcdStrLX(2, 0, " "); PrintLcdDec(ADCDL); } // -----------------------------------// Catch channel 1 // -----------------------------------ADC_ChannelSel(ADC_CH1_IN); ADCStart(); while( ADCDone ) { ADCDone = false; PrintLcdStrLX(2, 4, " "); PrintLcdDec(ADCDL); } // -----------------------------------// Catch channel 2 // -----------------------------------ADC_ChannelSel(ADC_CH2_IN); ADCStart(); while( ADCDone ) { ADCDone = false; PrintLcdStrLX(2, 8, " "); PrintLcdDec(ADCDL); } // -----------------------------------// Catch channel 3 // -----------------------------------ADC_ChannelSel(ADC_CH3_IN); ADCStart(); while( ADCDone ) { ADCDone = false; PrintLcdStrLX(2, 12, " PrintLcdDec(ADCDL); } "); } while(1); } void ADCISR(void) interrupt 10 using 1 //ADC Interrupt Vector Address 0053h => interrupt 10 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 17 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 { IRCON &= (~ADC_IF); ADCDone = true; //A/D converter interrupt flag, must be cleared by software } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 18 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-5 16x2 字元型 LCD 顯示器 64-pin demo board 上所設置的 LCD 模組為 16x2 字元型 LCD (LMC-SSC2F16-01 serial),如不是使 用與 demo board 相同之 LCD 模組時需修改 Timing 方能正常顯示。LCD 所連接至 SM59R16A2 之 pin 腳如下:並定義在 LCD16x2.h 檔案中。 LCD_RS LCD_E Port3.4 Port3.5 LCD_RW LCD_PORT Port3.6 Port0 函式宣告 :void WriteLcdCmd(unsigned char Cmd) 功能 :寫入 LCD 模組一個 byte 命令。 含括檔 :LCD16x2.h 傳入值 返回值 :欲寫入 LCD 模組之控制命令,以 Byte 表示。 :無 函式宣告 :void WriteLcdData(unsigned char Data) 功能 :寫入 LCD 模組一個 byte 資料。 含括檔 :LCD16x2.h 傳入值 返回值 :欲寫入 LCD 模組之顯示資料,以 Byte 表示。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 19 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void LCD_Init(void) 功能 :初始化 LCD 模組。 含括檔 :LCD16x2.h 傳入值 返回值 :無 :無 本函式之初始化動作包括: 1. Power on delay 50ms,讓 LCD 模組之內部 Reset 電路重置。 2. 設定 LCD 模組為 8-bit interface、Dual line、5x7 ASCII format。 3. 點亮(Turn on)LCD 模組、No cursor、No blinking mode、Increment entry mode。 4. 清空 LCD 畫面。 使用者如需改變初始化之設定,可自行由原始程式碼修改。 函式宣告 :void WriteLcdLX(unsigned char LineNo, unsigned char XPos, unsigned char Value) 功能 :在 LCD 畫面特定位置,寫入一個 byte 資料。 含括檔 :LCD16x2.h 傳入值 :欲顯示之行列位置及顯示資料。 LineNo 參數:設定行號,LineNo ∈{ 1,2 }。 XPos 參數:設定列位置,XPos ∈{ 0, 1, 2, … , 15 }。 Value 參數:顯示的資料,以 Byte 表示。 返回值 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 20 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void SetCursorAddr(unsigned char LineNo, unsigned char XPos) 功能 :在 LCD 畫面上移動游標到特定位置。 含括檔 :LCD16x2.h 傳入值 :欲移動之目的地行列位置。 LineNo 參數:設定行號,LineNo ∈{ 1,2 }。 XPos 參數:設定列位置,XPos ∈{ 0, 1, 2, … , 15 }。 返回值 :無 函式宣告 :void CopyL2_To_L1(void) 功能 :複製第二行之畫面到第一行。 含括檔 :LCD16x2.h 傳入值 返回值 :無 :無 函式宣告 :void PrintLcdStr(unsigned char *Str) 功能 :在 LCD 畫面現在的位置上輸出字串。 含括檔 :LCD16x2.h 傳入值 返回值 :*Str 參數:欲輸出之字串指標。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 21 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void PrintLcdStrLX(unsigned char LineNo, unsigned char XPos, unsigned char *Str) 功能 :在 LCD 畫面特定位置,輸出字串。 含括檔 :LCD16x2.h 傳入值 返回值 :LineNo 參數:設定行號,LineNo ∈{ 1,2 }。 XPos 參數:設定列位置,XPos ∈{ 0, 1, 2, … , 15 }。 *Str 參數:輸出字串指標。 :無 函式宣告 :void ClearLcdLine(unsigned char LineNo) 功能 :清除 LCD 畫面某一行的資料。 含括檔 :LCD16x2.h 傳入值 返回值 :LineNo 參數:欲清除之行號,LineNo ∈{ 1,2 }。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 22 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void PrintLcdSpace(unsigned char Count) 功能 :在 LCD 畫面現在的位置,輸出特定個數之空白。輸出個數超過第一行(16 字元)時,自 動延伸到第二行。 含括檔 :LCD16x2.h 傳入值 返回值 :Count 參數:欲輸出空白之個數。 :無 函式宣告 :void PrintLcdHex(unsigned int Value) 功能 :在 LCD 畫面現在的位置上顯示數值,以 16 進制表示。本函式不會自動在數字前加 ”0x” 或字尾 ’H’。 含括檔 :LCD16x2.h 傳入值 返回值 :Value 參數:欲顯示之數值。 :無 函式宣告 :void PrintLcdDec(unsigned int Value) 功能 :在 LCD 畫面現在的位置上顯示數值,以 10 進制表示。 含括檔 :LCD16x2.h 傳入值 返回值 :Value 參數:欲顯示之數值。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 23 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :unsigned char ReadLcdData(void) 功能 :讀取 LCD 畫面現在位置上所顯示之數值。 含括檔 :LCD16x2.h 傳入值 返回值 :無 :顯示之數值。 函式宣告 :unsigned char ReadLcdLX(unsigned char LineNo, unsigned char XPos) 功能 :讀取 LCD 畫面特定位置上所顯示之數值。 含括檔 :LCD16x2.h 傳入值 返回值 :LineNo 參數:欲讀取之行號,LineNo ∈{ 1,2 }。 XPos 參數:欲讀取之列位置,XPos ∈{ 0, 1, 2, … , 15 }。 :顯示之數值。 除了上述的函式之外,在 LCD16x2.h 檔案中已定義如下之巨集: 巨集名稱 功能 SetCursorHome( ) 設定游標/顯示位置回到第 1 行、第 0 列 TurnLcdOff( ) 關閉 LCD TurnLcdOn( ) 開啟 LCD ClrLcdAll( ) 清除 LCD 整個畫面 CursorBack( ) 游標移回一字元,但不更改顯示資料 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 24 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\LCD\LCD16x2.h" void main(void) { LCD_Init(); SetCursorAddr(1, 0); PrintLcdStr("WelcomeToSyncMOS"); SetCursorAddr(2, 0); PrintLcdStr("SM59R16 LCD demo"); while(1); } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 25 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-6 內部 EEPROM 功能 (Internal EEPROM) 函式宣告 :void PMEE_ByteWrite(unsigned int Address, unsigned char Data) 功能 :在內部 EEPROM 特定位置上,寫入一 Byte 資料。 含括檔 :InternalEE.h 傳入值 返回值 :Address 參數:欲寫入之位置。 Data 參數:欲寫入之 Byte 資料。 :顯示之數值。 函式宣告 :unsigned char PMEE_ByteRead(unsigned int Address) 功能 :在內部 EEPROM 特定位置上,讀取一 Byte 資料。 含括檔 :InternalEE.h 傳入值 返回值 :Address 參數:欲讀取之位置。 :讀取到之 Byte 資料。 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 26 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 應用例(note 1): #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\InternalEE\InternalEE.h" //=============================================== // We define this area(for example, 0xFC00~0xFDFF) 512 Bytes as the internal // EEPROM area. // The definition here is to reserve this area to prevent compiler destruction. //=============================================== #define EEROMArea_Start 0xFC00 unsigned char code EEROMArea[512] _at_ EEROMArea_Start; void main() { unsigned int Value, Counter; unsigned char code RomDataBuffer[]= { 0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00, 0xEC, 0x15, 0xCD, 0x08, 0xC9, 0xC0, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x00, 0xB0, 0x04, 0xC1, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x53, 0x74, 0x61, 0x6E, 0x6C, 0x65, 0x79, 0x20, 0x20, 0x20, 0x20, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x3B, 0x5C, 0x2D, 0x22, 0x24, 0x22, 0x23, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x1E, 0x04, 0x23, 0x00, 0x0B, 0x00, 0x1E, 0x00, 0x00, 0x11, 0x24, 0x22, 0x23, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x3B, 0x5B, 0x52, 0x65, 0x64, 0x5D, 0x5C, 0x2D, 0x22, 0x22, 0x24, 0x23, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x1E, 0x04, 0x35, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x00, 0x5F, 0x2D, 0x22, 0x24, 0x22 }; // 128 Bytes //=============== // Read/Write One byte //=============== PMEE_ByteWrite(0xFC01, 0x12); Value = PMEE_ByteRead(0xFC01); //=============== //Write 128 bytes //=============== for(Counter=0; Counter<128; Counter++) { PMEE_ByteWrite(EEROMArea_Start+Counter, *(RomDataBuffer+Counter)); } //=============== //Read back and check. //=============== Value = 0; for(Counter=0; Counter<128; Counter++) { Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 27 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 if ( PMEE_ByteRead(EEROMArea_Start+Counter) != *(RomDataBuffer+Counter) ) Value ++; // Error accumulating } while(1); } Note 1: 本應用例目前無法使用新茂 OCD 模擬執行,如必須使用 OCD 模擬,請洽詢新茂公司或新茂公司之代理商,以獲得進一步的協 助。 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 28 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-7 I2C 模組 函式宣告 :void IICInit(unsigned char IICSetting) 功能 :初始化 I2C 模組。 含括檔 :IIC.h 傳入值 :IICSetting 參數:設定 I2C 模組暫存器 IICCTL。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。IICSetting ∈{ IIC_EN, IIC_MASTER,IIC_SLAVE, IIC_ADR_CA1,IIC_ADR_CA2, IIC_BR32,IIC_BR64,IIC_BR128,IIC_BR256,IIC_BR512, IIC_BR1024,IIC_BR2048,IIC_BR4096 } 返回值 :無 函式宣告 :void IICDisable(void) 功能 :關閉 I2C 模組。 含括檔 :IIC.h 傳入值 返回值 :無 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 29 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void IIC_SendStart(unsigned char ControlByte) 功能 :令 I2C 模組送出 Start 訊號及其後的控制 Byte。 含括檔 :IIC.h 傳入值 返回值 :ControlByte 參數:在 Start 訊號之後,接著要送出的控制資料(Byte)。 :無 函式宣告 :void IIC_SendRestart(unsigned char ControlByte) 功能 :令 I2C 模組送出 Restart 訊號及其後的控制 Byte。 含括檔 :IIC.h 傳入值 返回值 :ControlByte 參數:在 Restart 訊號之後,接著要送出的控制資料(Byte)。 :無 函式宣告 :void IIC_TransmitByte(unsigned char TxData) 功能 :令 I2C 模組送出一個 Byte 資料。 含括檔 :IIC.h 傳入值 返回值 :TxData 參數:欲送出的資料(Byte)。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 30 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :unsigned char IIC_ReceiveByte(bit ACKStatus) 功能 :令 I2C 模組接收一個 Byte 資料。 含括檔 :IIC.h 傳入值 :ACKStatus 參數:接收一個 Byte 資料之後,要回應 ACK 或是 NACK。其中 ACK 及 NACK 返回值 分別定義於 IIC.h。ACKStatus∈{ ACK,NACK } :無 函式宣告 :unsigned char IICEE_CurrentRead(unsigned char Block) 功能 :讀取 EEPROM 現在位置(Current address)一個 Byte 資料。 含括檔 :IIC.h 傳入值 返回值 :Block 參數:欲讀取 EEPROM 哪一個 block(note 1)。Block∈{ EE_BLOCK0,EE_BLOCK1 } :無 函式宣告 :void IICEE_ByteWrite(unsigned char Block, unsigned char Address, unsigned char WriteData) 功能 :寫入 EEPROM 指定位置一個 Byte。 含括檔 :IIC.h 傳入值 返回值 :Block 參數:欲寫入 EEPROM 哪一個 block(note 1)。Block∈{ EE_BLOCK0,EE_BLOCK1 } Address 參數:欲寫入 EEPROM 之位址(note 2)。Address∈{ 0, 1, 2, …, 255 } WriteData 參數:欲寫入 EEPROM 之資料。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 31 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :unsigned char IICEE_RandomRead(unsigned char Block, unsigned char Address) 功能 :讀取 EEPROM 指定位置一個 Byte。 含括檔 :IIC.h 傳入值 返回值 :Block 參數:欲讀取 EEPROM 哪一個 block(note 1)。Block∈{ EE_BLOCK0,EE_BLOCK1 } Address 參數:欲讀取 EEPROM 之位址(note 2)。Address∈{ 0, 1, 2, …, 255 } :讀取之 EEPROM 資料(byte)。 函式宣告 :void IICEE_PageWrite(unsigned char Block, unsigned char Address, unsigned char N, 功能 含括檔 傳入值 返回值 unsigned char *DataBuffer) :寫入 EEPROM 指定位置 N 個 Bytes。 :IIC.h :Block 參數:欲寫入 EEPROM 哪一個 block(note 1)。Block∈{ EE_BLOCK0,EE_BLOCK1 } Address 參數:欲寫入 EEPROM 之位址(note 2)。Address∈{ 0, 1, 2, …, 255 } N 參數:欲寫入之 byte 數。N∈{ 1, 2, …, 16 }(note 3) *DataBuffer 參數:欲寫入 EEPROM 之資料陣列指標。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 32 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void IICEE_SeqRead(unsigned char Block, unsigned char Address, unsigned int N, 功能 含括檔 unsigned char *DataBuffer) :讀取 EEPROM 指定位置 N 個 Bytes。 :IIC.h 傳入值 :Block 參數:欲讀取 EEPROM 哪一個 block(note 1)。Block∈{ EE_BLOCK0,EE_BLOCK1 } 返回值 Address 參數:欲讀取 EEPROM 之位址(note 2)。Address∈{ 0, 1, 2, …, 255 } N 參數:欲讀取之 byte 數。 *DataBuffer 參數:欲存放 EEPROM 讀取資料之陣列指標。 :無 Note 1: 64-pin demo board 上所設置的 I2C 介面 EEPROM 為 24LC04 / 24LC04B,此 EEPROM 內含兩個 256 bytes 的 block。讀寫時需指 定欲讀寫 EE_BLOCK0 或 EE_BLOCK1,其中 EE_BLOCK0、EE_BLOCK1 定義在 IIC.h 檔案中。 本函式以 24LC04/24LC04B EEPROM 為存取目標,不同容量(Size)的 EEPROM 存取命令及位址資料長度雖有不同,但是大同 小異,使用者仍可參照所選用的 EEPROM 規格書,對參考程式的原始碼稍做修改即可。 Note 2: 24LC04 / 24LC04B EEPROM 之位址資料長度為一個 byte。 Note 3: 24LC04 / 24LC04B EEPROM 之 Page write 長度最大為 16 個 byte。 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 33 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\MISC\Delay.h" #include "..\IIC\IIC.h" void main() { unsigned char RamDataBuffer[50], Value ; unsigned char code RomDataBuffer[]= { 0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00, 0xEC, 0x15, 0xCD, 0x08, 0xC9, 0xC0, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x00, 0xB0, 0x04, 0xC1, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x53, 0x74, 0x61, 0x6E, 0x6C, 0x65, 0x79, 0x20, 0x20, 0x20, 0x20, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x3B, 0x5C, 0x2D, 0x22, 0x24, 0x22, 0x23, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x1E, 0x04, 0x23, 0x00, 0x0B, 0x00, 0x1E, 0x00, 0x00, 0x11, 0x24, 0x22, 0x23, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x3B, 0x5B, 0x52, 0x65, 0x64, 0x5D, 0x5C, 0x2D, 0x22, 0x22, 0x24, 0x23, 0x2C, 0x23, 0x23, 0x30, 0x2E, 0x30, 0x30, 0x1E, 0x04, 0x35, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x00, 0x5F, 0x2D, 0x22, 0x24, 0x22 }; // 128Byte // Initialize IIC IICInit(IIC_EN|IIC_MASTER|IIC_ADR_CA1|IIC_BR64); // RandomRead: Value = IICEE_RandomRead(EE_BLOCK0, 0x00); // CurrentRead: Value = IICEE_CurrentRead(EE_BLOCK0); // Sequential Read: IICEE_SeqRead(EE_BLOCK1, 0x00, 50, RamDataBuffer); // Byte Write: IICEE_ByteWrite(EE_BLOCK0, 0x00, 0x54); Delay10mSec(1); // Delay 10ms to wait EEPROM writing completed. Value = IICEE_RandomRead(EE_BLOCK0, 0x00); // Value should be 0x54 // Page Write: IICEE_PageWrite(EE_BLOCK1, 0x00, 16, RomDataBuffer); Delay10mSec(1); // Delay 10ms to wait EEPROM writing completed. IICEE_SeqRead(EE_BLOCK1, 0x00, 16, RamDataBuffer); while(1); } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 34 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-8 Microwire 模組 64-pin demo board 上所設置的 Microwire EEPROM,其 chip select pin 使用 Port1.0。定義在 Microwire. h 檔案中。 函式宣告 :void SPIInit(unsigned char SPICtrl1, unsigned char SPICtrl2, unsigned char MSB_LSB) 功能 :初始化 SPI/Microwire 模組。 含括檔 :Microwire.h 傳入值 :SPICtrl1 參數:設定 SPI/Microwire 模組暫存器 SPIC1。常用的參數定義於 SM59R16A2_ ExtraDef.h 檔案中。 SPICtrl1∈{ SPI_EN, SPI_MASTER,SPI_SLAVE, SPI_SSP_HIGH,SPI_SSP_LOW, SPI_CKP_HIGH,SPI_CKP_LOW, SPI_CKE_RISE,SPI_CKE_FALL, SPI_BR4,SPI_BR8,SPI_BR16,SPI_BR32,SPI_BR64,SPI_BR128, SPI_BR256,SPI_BR512 } SPICtrl2 參數:設定 SPI/Microwire 模組暫存器 SPIC2。常用的參數如下: SPICtrl2∈{ SPI_FULLDUP_EN,SPI_FULLDUP_DIS, SPI_TX_1B,SPI_TX_2B,SPI_TX_3B,SPI_TX_4B,SPI_TX_5B, SPI_TX_6B,SPI_TX_7B,SPI_TX_8B, SPI_RX_1B,SPI_RX_2B,SPI_RX_3B,SPI_RX_4B,SPI_RX_5B, SPI_RX_6B,SPI_RX_7B,SPI_RX_8B } MSB_LSB 參數:設定 SPI/Microwire 模組 MSB 或 LSB 優先傳送。 MSB_LSB∈{ SPI_MSB_FIRST,SPI_LSB_FIRST } 返回值 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 35 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void MW_TransmitData(unsigned char BitCount, unsigned char TxData) 功能 :令 SPI/Microwire 模組送出指定 bit 數的 data。 含括檔 :Microwire.h 傳入值 返回值 :BitCount 參數:設定欲傳送的 bit 數。BitCount∈{ 1, 2, 3, …, 8 } TxData 參數:欲傳送的 data,以 byte 暫存。 :無 函式宣告 :unsigned char MW_ReceiveData(unsigned char BitCount) 功能 :令 SPI/Microwire 模組接收指定 bit 數的 data。 含括檔 :Microwire.h 傳入值 返回值 :BitCount 參數:設定欲接收的 bit 數。BitCount∈{ 1, 2, 3, …, 8 } :已接收的 data,以 byte 表示。 函式宣告 :void MWEE_WordWrite(unsigned char Address, unsigned int WriteData) 功能 :對 Microwire 介面 EEPROM(93xx 系列) (note 1, 2),在指定位址寫入一個 word。 含括檔 :Microwire.h 傳入值 返回值 :Address 參數:設定欲寫入的位址。Address∈{0, 1, 2, …, 63 } WriteData 參數:欲寫入的資料,以 word 表示。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 36 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :unsigned int MWEE_WordRead(unsigned char Address) 功能 :對 Microwire 介面 EEPROM(93xx 系列) (note 1, 2),在指定位址讀取一個 word。 含括檔 :Microwire.h 傳入值 返回值 :Address 參數:設定欲讀取的位址。Address∈{0, 1, 2, …, 63 } :讀取的資料,以 word 表示。 函式宣告 :void MWEE_Erase(unsigned char Address) 功能 :對 Microwire 介面 EEPROM(93xx 系列) (note 1, 2),使用 EEPROM 抹除指令,在指定位址抹 除一個 word。 含括檔 :Microwire.h 傳入值 返回值 :Address 參數:設定欲抹除的位址。Address∈{0, 1, 2, …, 63 } :無 函式宣告 :void MWEE_EraseAll(void) 功能 :對 Microwire 介面 EEPROM(93xx 系列) (note 2),使用 EEPROM 全部抹除指令(Erase all),將 EEPROM 內容全部抹除。 含括檔 :Microwire.h 傳入值 返回值 :無 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 37 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void MWEE_ChkRdy(void) 功能 :檢查 Microwire 介面 EEPROM(93xx 系列) (note 2),是否就緒。 含括檔 :Microwire.h 傳入值 返回值 :無 :無 函式宣告 :void MWEE_EWDisable(void) 功能 :關閉/禁止 Microwire 介面 EEPROM(93xx 系列) (note 2),抹寫功能。 含括檔 :Microwire.h 傳入值 返回值 :無 :無 函式宣告 :void MWEE_EWEnable(void) 功能 :開啟/致能 Microwire 介面 EEPROM(93xx 系列) (note 2),抹寫功能。 含括檔 :Microwire.h 傳入值 返回值 :無 :無 Note 1: 64-pin demo board 上所設置的 Microwire 介面 EEPROM 為 93C46B/93LC46B/93AA46B。其位址長度為 6-bit,故 Address= 0~63。 此 EEPROM 內部存放資料的格式是 16-bit 格式。 Note 2: 本函式以 93C46B/93LC46B/93AA46B EEPROM 為存取目標,不同容量(Size)的 EEPROM 存取命令及位址資料長度雖有不同, 但是大同小異,使用者仍可參照所選用的 EEPROM 規格書,對參考程式的原始碼稍做修改即可。EEPROM 存取命令定義在 Microwire.h 檔案中。 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 38 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\Microwire\Microwire.h" void main() { unsigned int Value; unsigned char RamDataBuffer[50], Counter; unsigned int code RomDataBuffer[]= { 0x0900, 0x08C9, 0x1008, 0x00CD, 0x0015, 0x06EC, 0x0500, 0x0005, 0xEC06, 0x1506, 0xCD00, 0x0800, 0xC910, 0xC008, 0x0009, 0x008C, 0x0600, 0x0302, 0x0000, 0x00C1, 0xE104, 0x00B0, 0x0200, 0x0002, 0xB000, 0x0400, 0xC1E1, 0x0000, 0x0200, 0x0003, 0x0006, 0x0030, 0xE26E, 0x0074, 0x0053, 0x0000, 0x5C00, 0x0007, 0x7000, 0x0070, 0x0700, 0x0000, 0x005C, 0x5300, 0x7400, 0x6100, 0x6EE2, 0x6C07, 0x655C, 0x7930, 0x2030, 0x202E, 0x2030, 0x2023, 0x2C23, 0x232C, 0x2300, 0x3020, 0x2E20, 0x3020, 0x3020, 0x3B79, 0x5C65, 0x2D93, 0x2200, 0x2404, 0x221E, 0x2330, 0x2C30, 0x232E, 0x2330, 0x3023, 0x2E33, 0x3023, 0x302C, 0x1E23, 0x0422, 0x2324, 0x0022, 0x0B40, 0x0030, 0x1E2E, 0x0030, 0x0023, 0x1123, 0x242C, 0x2223, 0x2322, 0x2C04, 0x2324, 0x2311, 0x3000, 0x2E00, 0x301E, 0x3000, 0x3BE2, 0x5B30, 0x5223, 0x652C, 0x6423, 0x5D24, 0x5C22, 0x2D22, 0x222D, 0x224C, 0x245C, 0x235D, 0x2C64, 0x2365, 0x2352, 0x305B, 0x2E22, 0x3024, 0x302D, 0x1E5F, 0x0400, 0x3500, 0x0030, 0x2A00, 0x002A, 0x3040, 0x0000, 0x0035, 0x5F04, 0x2D1E, 0x2230, 0x2430, 0x2202 }; // 128Word SPIInit(SPI_EN|SPI_MASTER|SPI_CKP_LOW|SPI_CKE_FALL|SPI_BR64, SPI_FULLDUP_DIS, SPI_MSB_FIRST); // Enable erase & write function of Microwire EEPROM MWEE_EWEnable(); MWEE_EraseAll(); MWEE_ChkRdy(); // Write one byte & read back to check MWEE_WordWrite(0x10, 0x1234); MWEE_ChkRdy(); Value = MWEE_WordRead(0x10); // Erase that byte MWEE_Erase(0x10); MWEE_ChkRdy(); //=========================== //Write 64 words & read back to check. //=========================== for(Counter=0; Counter<64; Counter++) Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 39 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 { MWEE_WordWrite(Counter, *(RomDataBuffer+Counter)); MWEE_ChkRdy(); } Value = 0; for(Counter=0; Counter<64; Counter++) { if ( MWEE_WordRead(Counter) != *(RomDataBuffer+Counter) ) { Value ++; } } // Disable erase & write function of Microwire EEPROM MWEE_EWDisable(); while(1); } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 40 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-9 Pulse Width Modulation (PWM) 函式宣告 :void PWM_EN(unsigned char PWM_Resolution, unsigned char PWM_Channel) 功能 :初始化 PWM 模組。 含括檔 :PWM.h 傳入值 :PWM_Resolution 參數:設定 PWM 解析度。常用的參數定義於 SM59R16A2_ExtraDef.h 檔案中。PWM_Resolution ∈{PWM_8BMODE,PWM_10BMODE,PWM_12BMODE } PWM_Channel 參數:設定致能的 PWM 通道。PWM_Channel ∈{ PWM_CH0_EN, PWM_CH1_EN,PWM_CH2_EN,PWM_CH3_EN } 返回值 :無 函式宣告 :void PWM0Duty(unsigned char PWM0_H, unsigned char PWM0_L) 功能 :設定 PWM 0 Duty。 含括檔 :PWM.h 傳入值 返回值 :PWM0_H 參數:設定 Duty 高位元。 PWM0_L 參數:設定 Duty 低位元。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 41 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void PWM1Duty(unsigned char PWM1_H, unsigned char PWM1_L) 功能 :設定 PWM 1 Duty。 含括檔 :PWM.h 傳入值 返回值 :PWM1_H 參數:設定 Duty 高位元。 PWM1_L 參數:設定 Duty 低位元。 :無 函式宣告 :void PWM2Duty(unsigned char PWM2_H, unsigned char PWM2_L) 功能 :設定 PWM 2 Duty。 含括檔 :PWM.h 傳入值 返回值 :PWM2_H 參數:設定 Duty 高位元。 PWM2_L 參數:設定 Duty 低位元。 :無 函式宣告 :void PWM3Duty(unsigned char PWM3_H, unsigned char PWM3_L) 功能 :設定 PWM 3 Duty。 含括檔 :PWM.h 傳入值 返回值 :PWM3_H 參數:設定 Duty 高位元。 PWM3_L 參數:設定 Duty 低位元。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 42 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 函式宣告 :void PWM_OFF(void) 功能 :關閉 PWM 模組。 含括檔 :PWM.h 傳入值 返回值 :無 :無 應用例: #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_ExtraDef.h" #include "..\PWM\PWM.h" void main() { PWM0Duty(0, 0); PWM1Duty(0, 0x20); PWM2Duty(0, 0x80); PWM3Duty(0, 0xFF); PWM_EN(PWM_8BMODE, PWM_CH3_EN|PWM_CH2_EN|PWM_CH1_EN|PWM_CH0_EN); while(1); } Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 43 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-10 其他應用函式 2-10-1 4x4 鍵盤 64-pin demo board 上設置一組 4x4 鍵盤,並連接於 SM59R16A2 MCU 之 Port 5,鍵盤連接及按鍵 碼分別定義在 4x4Keypad.h 及 4x4Keypad.c 檔案中。若使用者不是使用 64-pin demo board,可依所使 用之目標板,對參考程式的原始碼稍做修改即可。 函式宣告 :unsigned char ScanKeypad(void) 功能 :掃描鍵盤一次。 含括檔 :4x4Keypad.h 傳入值 返回值 :無 :使用者所按的按鍵編號 0~15,若沒有任何按鍵輸入則返回 0xFF。 2-10-2 蜂鳴器 64-pin demo board 上設置一蜂鳴器,並連接於 SM59R16A2 MCU 之 Port 3.7,蜂鳴器連接定義在 Speaker.h 檔案中。 函式宣告 :void BeepCount(unsigned int count, unsigned int soundlong, unsigned int tone) 功能 :令蜂鳴器發聲。 含括檔 :Speaker.h 傳入值 :count 參數:設定發聲次數。 soundlong 參數:設定發聲長度。 tone 參數:設定發聲頻率。 返回值 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 44 Ver. A 2008/06 SM59R16A2 參考程式 使用手冊 2-10-3 延時函式 以下各延時函式是以 64-pin demo board 上之外部晶振 22.1184MHz 為系統頻率(Clock base)。 函式宣告 :void Delay100uSec(unsigned int NTime) 功能 :延時 100 usecond N 次。 含括檔 :Delay.h 傳入值 返回值 :NTime 參數:設定延時 100 usecond 次數。 :無 函式宣告 :void Delay1mSec(unsigned int NTime) 功能 :延時 1 msecond N 次。 含括檔 :Delay.h 傳入值 返回值 :NTime 參數:設定延時 1 msecond 次數。 :無 函式宣告 :void Delay10mSec(unsigned int NTime) 功能 :延時 10 msecond N 次。 含括檔 :Delay.h 傳入值 返回值 :NTime 參數:設定延時 10 msecond 次數。 :無 Specifications subject to change without notice, contact your sales representatives for the most recent information. IRFSX-0017 45 Ver. A 2008/06