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,如下:
/*mstcio.h
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 11/07/2021
*/
#ifndef __STCIO_H_
#define __STCIO_H_
#include "mtype.h"
#include "stc15w4k.h"
#endif
由于在前面教程中创建的C51 Template.uvproj中设定了“REMOVEUNUSED”,如下:
我们可以去除mtype.h中包含库函数头文件前的注释符。不会导致编译出现warning,也不会导致编译后的输出文件变大。 去除注释符后,如下:
/*mytype.h
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 11/13/2021
*/
#ifndef __MYTYPE_H_
#define __MYTYPE_H_
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <intrins.h>
2.2 定义枚举变量STCIOPORT,STCIOPTNO,STCIOBIT, STCIOMODE,用以限制I/O设置时输入数据范围,以免出现不可预料后果。完成后如下:
//***************************************
typedef enum
{
SCT_P0 = 0x01, //P0 port
SCT_P1 = 0x02, //P1 port
SCT_P2 = 0x04, //P2 port
SCT_P3 = 0x08, //P3 port
SCT_P4 = 0x10, //P4 port
SCT_P5 = 0x20, //P5 port
SCT_P6 = 0x40, //P6 port
SCT_P7 = 0x80 //P7 port
}STCIOPORT;
//***************************************
typedef enum
{
SCT_GP0 = 0,
SCT_GP1,
SCT_GP2,
SCT_GP3,
SCT_GP4,
SCT_GP5,
SCT_GP6,
SCT_GP7
}STCIOPTNO; //stc I/O port number
//***************************************
typedef enum
{
SCT_BIT0 = 0x01, //bit0
SCT_BIT1 = 0x02, //bit1
SCT_BIT2 = 0x04, //bit2
SCT_BIT3 = 0x08, //bit3
SCT_BIT4 = 0x10, //bit4
SCT_BIT5 = 0x20, //bit5
SCT_BIT6 = 0x40, //bit6
SCT_BIT7 = 0x80 //bit7
}STCIOBIT;
//***************************************
typedef enum
{
BI_IO = 0, //bidirectional I/O
PP_OUT, //push_pull out
HI_IN, //high impendence in
ODR_OUT //open drain out
}STCIOMODE;
2.3 定义初始化函数 ,如下:
/***************************************
Function: STCIO_InitP0Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P0
Example:
STCIO_InitP0Bit(1,0);
STCIO_InitP0Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP0Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP0Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P0
Example:
STCIO_InitP0Bits(3,0);
STCIO_InitP0Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitP0Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitP1Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P1
Example:
STCIO_InitP1Bit(1,0);
STCIO_InitP1Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP1Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP1Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P1
Example:
STCIO_InitP1Bits(3,0);
STCIO_InitP1Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitP1Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitP2Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P2
Example:
STCIO_InitP2Bit(1,0);
STCIO_InitP2Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP2Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP2Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P2
Example:
STCIO_InitP2Bits(3,0);
STCIO_InitP2Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitP2Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitP3Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P3
Example:
STCIO_InitP3Bit(1,0);
STCIO_InitP3Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP3Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP3Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P3
Example:
STCIO_InitP3Bits(3,0);
STCIO_InitP3Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitP3Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitP4Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P4
Example:
STCIO_InitP4Bit(1,0);
STCIO_InitP4Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP4Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP4Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P4
Example:
STCIO_InitP4Bits(3,0);
STCIO_InitP4Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitP4Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitP5Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P5
Example:
STCIO_InitP5Bit(1,0);
STCIO_InitP5Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP5Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP5Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P5
Example:
STCIO_InitP5Bits(3,0);
STCIO_InitP5Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitP5Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STC_InitP6Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P6
Example:
STCIO_InitP6Bit(1,0);
SSTCIO_InitP6Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP6Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP6Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P6
Example:
STCIO_InitP6Bits(3,0);
STCIO_InitP6Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitP6Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitP7Bit(STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init single bit of P7
Example:
STCIO_InitP7Bit(1,0);
STCIO_InitP7Bit(SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitP7Bit(STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitP7Bits(ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of P7
Example:
STCIO_InitP7Bits(3,0);
STCIO_InitP7Bits(SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STC_InitP7Bits(ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitPortBit(STCIOPTNO port_n, STCIOBIT bitx, STCIOMODE mode);
Return value: void
discription: init bit of stc I/O port
Example:
SSTCIO_InitPortBits(1,1,0);
STCIO_InitPortsBits(SCT_GP1,SCT_BIT1, PP_OUT);
****************************************/
void STCIO_InitPortBit(STCIOPTNO port_n, STCIOBIT bitx, STCIOMODE mode);
/***************************************
Function: STCIO_InitPortBits(STCIOPTNO port_n, ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of stc I/O port
Example:
SSTCIO_InitPortBits(1,3,0);
STCIO_InitPortsBits(SCT_GP1,SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitPortBits(STCIOPTNO port_n, ui8 bits, STCIOMODE mode);
/***************************************
Function: STCIO_InitPortsBits(ui8 ports, ui8 bits, STCIOMODE mode);
Return value: void
discription: init bits of stc I/O ports
Example:
SSTCIO_InitPortsBits(SCT_P0|SCT_P2,3,0);
STCIO_InitPortsBits(0x01|0x02|0x03,SCT_BIT1|SCT_BIT6, PP_OUT);
****************************************/
void STCIO_InitPortsBits(ui8 ports, ui8 bits, STCIOMODE mode);
3. 函数实现 在stcio.c中完成如下代码:
/*stcio.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 11/13/2021
*/
#include "stcio.h"
//****************************************/
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:
STC_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, bits,mode);
}
}
//End of STCIO_InitPortsBits(ui8 ports, ui8 bits, STCIOMODE mode)
编写库函数,为以后开发案做准备,可以提高效率,节省大量时间,同时可是软件更易升级维护,好处很多。使用库函数,可能不如直接操作寄存器高效,拖慢单片机运行速度。由于单片机速度越来越快,这个已经不是太大问题。在特别要求速度的场合,我们可以选更快的单片机,或者在一些代码段使用C语言与汇编语言混合编程来应对。
演示代码已上传到CSDN,文件名为STC15_IOInit_Code(20211113).rar。如需查看,可以去下载。