栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443867.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号