1、单片机的端口配置端口输入/输出C8051F410单片机共有24个I/O端口可以使用,即P0、0 P2、7。这些I/O端口可以用作通用I/O,或者模拟输入/输出。P0、0 P2、7可以被分配给内部数字资源。设计者完全控制数字功能得引脚分配,只受物理I/O引脚数得限制。端口输入/输出端口输入/输出从图18、1可以瞧出,C8051F410单片机之所以可以实现内部数字资源得灵活分配,就是通过优先级交叉开关译码器实现,即图中得Priority Crossbar Decoder。与普通单片机I/O得不同那么C8051F410单片机得I/O配置与普通得单片机差别在哪里呢?我们用一个例子说明。比如要对一个单片
2、机外得脉冲进行计数,普通得单片机会有一个端口作为脉冲得输入端口,假设就是P1、0,这个引脚就是固定得,但由于某种原因(比如PCB布线),我们希望这个外部脉冲可以接到P2、3引脚,这时普通单片机就做不到了,而C8051F410单片机就可以做到。与普通单片机I/O得不同此外,C8051F410单片机得I/O端口在使用前都要进行输入/输出得设置。设置输入方式:模拟输入还就是数字输入。设置输出方式:漏极开路(open-drain)输出还就是推挽输出(push-pull)。优先权交叉开关译码器优先权交叉开关译码器为每个I/O功能分配优先权,从优先权最高得UART0开始。当一个数字资源被选择时,尚未分配得
3、端口引脚中得最低位被分配给该资源(UART0除外,它总就是被分配到引脚P0、4与P0、5)。优先权交叉开关译码器如果一个端口引脚已经被分配,则交叉开关在为下一个被选择得资源分配引脚时将跳过该引脚。此外,交叉开关还将跳过在PnSKIP寄存器中被置1得那些位所对应得引脚。PnSKIP寄存器允许软件跳过那些被用作模拟输入、特殊功能或GPIO得引脚。优先权交叉开关译码器注意:如果一个端口引脚被一个外设使用而不经过交叉开关,则该引脚在PnSKIP寄存器中得对应位应被置1。大家学习辛苦了,还是要坚持继续保持安静继续保持安静优先权交叉开关译码器这种情况适用于P1、0与/或P1、1(如果外部振荡器电路被使能)
4、、P1、2(如果使用VREF)、P0、6(如果使用外部转换启动信号NVSTR)、P0、0(如果使用IDA0)、P0、1(如果使用IDA1)、以及任何被选择为ADC或比较器输入得引脚。交叉开关跳过那些被选择得引脚(如同将它们已分配),移向下一个未被分配得引脚。优先权交叉开关译码器优先权交叉开关译码器优先权交叉开关译码器说了这么多,到底什么意思呢?我们一条一条得讲。假设您要将P0、1与P0、2用作接外部晶振,或者P1、2用于Vref,或者P0、6用作外部cnvstr信号,或者P0、0用作IDA0,或者P0、1用作IDA1,或者某个端口(比如P1、3)用作ADC或者比较器得输入,则应在PnSKIP中
5、将相应得位置1,即让交叉开关跳过这些端口。优先权交叉开关译码器此外,假如您希望某个端口用作普通得I/O端口(至于干什么,由您自己决定),而不就是特殊得功能,比如PCA,SPI等,您也可以将PnSKIP中相应得位置1,这样交叉开关译码器在为内部数字资源(比如SPI,ECI,PCA登)分配端口时,就会跳过这些端口,傻呼呼得认为这些端口已经有某种用途了。端口初始化得步骤1、选择输入模式,模拟还就是数字,在PnMDIN寄存器中设置。2、选择输出模式,漏极开路(open-drain)还就是推挽输出(push-pull),在PnMDOUT寄存器中设置。3、选择被交叉开关译码器跳过得端口,在PnSKIP寄存
6、器中设置。端口初始化得步骤4、用XBRn寄存器将引脚分配给要使用得外设。5、使能交叉开关(XBARE=1)。端口初始化步骤得注意事项对于端口初始化得第三步,被交叉开关译码器跳过得端口包括2种情况:1)将P0、1与P0、2用作接外部晶振,或者P1、2用于Vref,或者P0、6用作外部cnvstr信号,或者P0、0用作IDA0,或者P0、1用作IDA1,或者某个端口(比如P1、3)用作ADC或者比较器得输入。端口初始化步骤得注意事项2)某个端口使用者有特殊得用处(而不就是希望用做PCA,UART,ECI等用途),比如您想将P1、3用来驱动一个LED,此时您就要让交叉开关译码器跳过P1、3,这样Cr
7、ossBar在为内部数字资源(比如PCA,UART,ECI等)分配端口时,就会跳过P1、3。端口初始化步骤得注意事项对于端口初始化中得第4步,其实就就是把您需要得功能模块激活。比如,您希望PCA得CEX0输出到P0、0,而且交叉开关译码器已经把CEX0分配到P0、0,这时候千万记得将XBR1中得相应位设置好,即激活这个功能。EXAMPLE 1说了这么多,还就是通过例子来说明吧!这里我们假设所有得端口都没有被跳过(skip),此时我们可以参考图18、3(ppt第11页)。第一个例子,我们驱动一个LED。EXAMPLE 1EXAMPLE 1P2MDIN|=0 x02;/设置P2、1为数字输入P2M
8、DOUT|=0 x02;/设置P2、1为推挽输出P2SKIP|=0 x02;/CrossBar跳过P2、1EXAMPLE 1其实这里P2SKIP|=0 x02可以不要,因为我们这里只用了一个端口,但最好加上。EXAMPLE 2P2、1接一外部得模拟信号,对其进行AD转换。EXAMPLE 2P2MDIN&=0 x02;/设置P2、1为模拟输入/这时P2MDOUT不用设置,因为用作模拟输入得端口,其对应位在PnMDOUT中得设置会被忽略P2SKIP|=0 x02;/CrossBar跳过P2、1EXAMPLE 3设置P2、1为PCA得CEX0得输出EXAMPLE 3P2MDIN|=0 x02;/P2、1为数字输入P2MDOUT|=0 x02;/P2、1为推挽输出P0SKIP=0 xFF;/跳过P0得所以端口P1SKIP=0 xFF;/跳过P1得所以端口P2SKIP|=0 x01;/跳过P2、0端口XBR1&=0 x07;XBR1|=0 x01;/CEX0输出到P2、1XBR0|=0 x40;/使能CrossBarEXAMPLE 4P0、0用作模拟信号输入,进而进行AD转换。P0、1用来驱动一个led。P0、4与P0、5用作UART。PCA得CEX0输出到P0、7。