全书所有PIC单片机应用案例都涉及对I/O端口的访问。以MPLAB XC8编译器为例,所有C程序无一例外地引入了头文件xc.h。对于本书案例大量使用的PIC16F877A单片机,xc.h将引入pic.h,pic.h将引入pic_chip_select.h,pic_chip_select.h最后引入pic16f877a.h。头文件pic16f877a.h定义了PIC16F877A单片机的所有引脚、特殊寄存器等,以下列出了其中的部分定义:
显然,该定义与PIC16F877A单片机的“数据内存结构图”给出的地址是对应的,正是因为头文件给出了相关定义,在C程序中才能直接引用各个特殊寄存器名称(包括端口名称,如PORTB)。头文件中还给出了相关寄存器的位定义,例如所列出的RB0、RB1、nRBPU等,正是因为这些定义才使得程序设计人员可以直接使用它们。头文件中专门给出的“配置位”定义内容已在1.5节“PIC单片机配置位”有过详细介绍,此略。
下面是几个端口编程示例。
示例一
示例二
除了上述对端口的整体操作以外,实际编程过程中还会大量遇到对单个引脚的输入或输出操作,例如RD3引脚外接按键,按键另一端接地,为判断按键是否按下,常见的代码如下:
有了上述配置后,为判断RD3外接按键是否按下,可编写代码:
又如,要在RD7引脚输出010101……序列,可先设置RD7为输出:
然后反复调用:
如果要通过某引脚(如RB2)串行输出1字节数据dat,且要求先发送高位,后发送低位,常见的代码如下:
上述for循环还可以改写成: