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-0018 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 存放 64-pin demo board,demo 程序原始码。 \Demo\Output 存放 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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 LCD_RW LCD_PORT Port3.4 Port3.5 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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 传入值 返回值 Note 1: :Block 参数:欲读取 EEPROM 哪一个 block(note 1)。Block∈{ EE_BLOCK0,EE_BLOCK1 } Address 参数:欲读取 EEPROM 之地址(note 2)。Address∈{ 0, 1, 2, …, 255 } N 参数:欲读取之 byte 数。 *DataBuffer 参数:欲存放 EEPROM 读取数据之数组指针。 :无 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 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-0018 45 Ver. A 2008/06