I/O初始化,即设定I/O口的工作模式,需设定配置寄存器PxM1、PxM0对应位的值。假定是P0口,需下如下配置:
下面演示初始化程序编写过程。
1. 新建文件 打开前面教程中创建的C51 Template 文件夹中Proj文件夹下的C51 Template.uvproj。创建两个新文件,分别以文件名stcio.h,stcio.c存入C51 Template文件夹下Library文件夹中。
2. 完成头文件
2.1 在头文件中包含前面教程中完成的mtype.h及stc15w4k.h,如下:
#ifndef __STCIO_H_ #define __STCIO_H_ #include "mtype.h" #include "stc15w4k.h" #endif
由于在前面教程中创建的C51 Template.uvproj中设定了“REMOVEUNUSED”,如下:
我们可以去除mtype.h中包含库函数头文件前的注释符。不会导致编译出现warning,也不会导致编译后的输出文件变大。 去除注释符后,如下:
2.2 定义枚举变量STCIOPORT,STCIOPTNO,STCIOBIT, STCIOMODE,用以限制I/O设置时输入数据范围,以免出现不可预料后果。完成后如下:
/ void STCIO_InitP0Bit(STCIOBIT bitx, STCIOMODE mode); void STCIO_InitP0Bits(ui8 bits, STCIOMODE mode); void STCIO_InitP1Bit(STCIOBIT bitx, STCIOMODE mode); void STCIO_InitP1Bits(ui8 bits, STCIOMODE mode); void STCIO_InitP2Bit(STCIOBIT bitx, STCIOMODE mode); void STCIO_InitP2Bits(ui8 bits, STCIOMODE mode); void STCIO_InitP3Bit(STCIOBIT bitx, STCIOMODE mode); void STCIO_InitP3Bits(ui8 bits, STCIOMODE mode); void STCIO_InitP4Bit(STCIOBIT bitx, STCIOMODE mode); void STCIO_InitP4Bits(ui8 bits, STCIOMODE mode); void STCIO_InitP5Bit(STCIOBIT bitx, STCIOMODE mode); void STCIO_InitP5Bits(ui8 bits, STCIOMODE mode); void STCIO_InitP6Bit(STCIOBIT bitx, STCIOMODE mode); void STCIO_InitP6Bits(ui8 bits, STCIOMODE mode); void STCIO_InitP7Bit(STCIOBIT bitx, STCIOMODE mode); void STC_InitP7Bits(ui8 bits, STCIOMODE mode); void STCIO_InitPortBit(STCIOPTNO port_n, STCIOBIT bitx, STCIOMODE mode); void STCIO_InitPortBits(STCIOPTNO port_n, ui8 bits, STCIOMODE mode); void STCIO_InitPortsBits(ui8 ports, ui8 bits, STCIOMODE mode);
3. 函数实现 在stcio.c中完成如下代码:
/
void STCIO_InitP0Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P0M0 &= ~bitx;
P0M1 &= ~bitx;
break;
case PP_OUT:
P0M0 |= bitx;
P0M1 &= ~bitx;
break;
case HI_IN:
P0M0 &= ~bitx;
P0M1 |= bitx;
break;
case ODR_OUT:
P0M0 |= bitx;
P0M1 |= bitx;
break;
}
}
//End of STCIO_InitP0Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STCIO_InitP0Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP0Bit(1<< i, mode);
}
}
//End of STCIO_InitP0Bits(ui8 bits, STCIOMODE mode)
/
void STCIO_InitP1Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P1M0 &= ~bitx;
P1M1 &= ~bitx;
break;
case PP_OUT:
P1M0 |= bitx;
P1M1 &= ~bitx;
break;
case HI_IN:
P1M0 &= ~bitx;
P1M1 |= bitx;
break;
case ODR_OUT:
P1M0 |= bitx;
P1M1 |= bitx;
break;
}
}
//End of STCIO_InitP1Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STCIO_InitP1Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP1Bit(1<< i, mode);
}
}
//End of STCIO_InitP1Bits(ui8 bits, STCIOMODE mode)
/
void STCIO_InitP2Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P2M0 &= ~bitx;
P2M1 &= ~bitx;
break;
case PP_OUT:
P2M0 |= bitx;
P2M1 &= ~bitx;
break;
case HI_IN:
P2M0 &= ~bitx;
P2M1 |= bitx;
break;
case ODR_OUT:
P2M0 |= bitx;
P2M1 |= bitx;
break;
}
}
//End of STCIO_InitP2Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STCIO_InitP2Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP2Bit(1<< i, mode);
}
}
//End of STCIO_InitP2Bits(ui8 bits, STCIOMODE mode)
/
void STCIO_InitP3Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P3M0 &= ~bitx;
P3M1 &= ~bitx;
break;
case PP_OUT:
P3M0 |= bitx;
P3M1 &= ~bitx;
break;
case HI_IN:
P3M0 &= ~bitx;
P3M1 |= bitx;
break;
case ODR_OUT:
P3M0 |= bitx;
P3M1 |= bitx;
break;
}
}
//End of STCIO_InitP3Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STCIO_InitP3Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP3Bit(1<< i, mode);
}
}
//End of STCIO_InitP3Bits(ui8 bits, STCIOMODE mode)
/
void STCIO_InitP4Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P4M0 &= ~bitx;
P4M1 &= ~bitx;
break;
case PP_OUT:
P4M0 |= bitx;
P4M1 &= ~bitx;
break;
case HI_IN:
P4M0 &= ~bitx;
P4M1 |= bitx;
break;
case ODR_OUT:
P4M0 |= bitx;
P4M1 |= bitx;
break;
}
}
//End of STCIO_InitP4Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STCIO_InitP4Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP4Bit(1<< i, mode);
}
}
//End of STCIO_InitP4Bits(ui8 bits, STCIOMODE mode)
/
void STCIO_InitP5Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P5M0 &= ~bitx;
P5M1 &= ~bitx;
break;
case PP_OUT:
P5M0 |= bitx;
P5M1 &= ~bitx;
break;
case HI_IN:
P5M0 &= ~bitx;
P5M1 |= bitx;
break;
case ODR_OUT:
P5M0 |= bitx;
P5M1 |= bitx;
break;
}
}
//End of STCIO_InitP5Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STCIO_InitP5Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP5Bit(1<< i, mode);
}
}
//End of STCIO_InitP5Bits(ui8 bits, STCIOMODE mode)
/
void STCIO_InitP6Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P6M0 &= ~bitx;
P6M1 &= ~bitx;
break;
case PP_OUT:
P6M0 |= bitx;
P6M1 &= ~bitx;
break;
case HI_IN:
P6M0 &= ~bitx;
P6M1 |= bitx;
break;
case ODR_OUT:
P6M0 |= bitx;
P6M1 |= bitx;
break;
}
}
//End of STCIO_InitP6Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STCIO_InitP6Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP6Bit(1<< i, mode);
}
}
//End of STCIO_InitP6Bits(ui8 bits, STCIOMODE mode)
/
void STCIO_InitP7Bit(STCIOBIT bitx, STCIOMODE mode)
{
switch(mode)
{
case BI_IO:
P7M0 &= ~bitx;
P7M1 &= ~bitx;
break;
case PP_OUT:
P7M0 |= bitx;
P7M1 &= ~bitx;
break;
case HI_IN:
P7M0 &= ~bitx;
P7M1 |= bitx;
break;
case ODR_OUT:
P7M0 |= bitx;
P7M1 |= bitx;
break;
}
}
//End of STCIO_InitP7Bit(STCIOBIT bitx, STCIOMODE mode)
/
void STC_InitP7Bits(ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(bits &( 1<< i))
STCIO_InitP7Bit(1<< i, mode);
}
}
//End of STC_InitP7Bits(ui8 bits, STCIOMODE mode)
****************************************/
void STCIO_InitPortBit(STCIOPTNO port_n, STCIOBIT bitx, STCIOMODE mode)
{
switch(port_n)
{
case 0:
STCIO_InitP0Bit(bitx, mode);
break;
case 1:
STCIO_InitP1Bit(bitx, mode);
break;
case 2:
STCIO_InitP2Bit(bitx, mode);
break;
case 3:
STCIO_InitP3Bit(bitx, mode);
break;
case 4:
STCIO_InitP4Bit(bitx, mode);
break;
case 5:
STCIO_InitP5Bit(bitx, mode);
break;
case 6:
STCIO_InitP6Bit(bitx, mode);
break;
case 7:
STCIO_InitP7Bit(bitx, mode);
break;
}
}
//End of STCIO_InitPortBit(STCIOPTNO port_n, STCIOBIT bitx, STCIOMODE mode)
****************************************/
void STCIO_InitPortBits(STCIOPTNO port_n, ui8 bits, STCIOMODE mode)
{
switch(port_n)
{
case 0:
STCIO_InitP0Bits(bits, mode);
break;
case 1:
STCIO_InitP1Bits(bits, mode);
break;
case 2:
STCIO_InitP2Bits(bits, mode);
break;
case 3:
STCIO_InitP3Bits(bits, mode);
break;
case 4:
STCIO_InitP4Bits(bits, mode);
break;
case 5:
STCIO_InitP5Bits(bits, mode);
break;
case 6:
STCIO_InitP6Bits(bits, mode);
break;
case 7:
STCIO_InitP7Bits(bits, mode);
break;
}
}
/
void STCIO_InitPortsBits(ui8 ports, ui8 bits, STCIOMODE mode)
{
ui8 i;
for(i = 0; i < 8; i++)
{
if(ports & (1 << i))
STCIO_InitPortBits(i, mode);
}
}
//End of STCIO_InitPortsBits(ui8 ports, ui8 bits, STCIOMODE mode)
编写库函数,为以后开发案做准备,可以提高效率,节省大量时间,同时可是软件更易升级维护,好处很多。使用库函数,可能不如直接操作寄存器高效,拖慢单片机运行速度。由于单片机速度越来越快,这个已经不是太大问题。在特别要求速度的场合,我们可以选更快的单片机,或者在一些代码段使用C语言与汇编语言混合编程来应对。
演示代码会上传到CSDN,如需查看,可以去下载。



