51单片机实战教程(三 I/O初始化程序编写)

48 篇文章 20 订阅

      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。如需查看,可以去下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值