PIC16F877的外围功能模块例程

2019-11-08来源: 51hei关键字:PIC16F877  外围功能模块  PORTD口

第5章 PIC16F877的外围功能模块


5.1.2 简单应用实例
该例用于令与PORTD口相连的8个发光二极管前4个点亮,后4个熄灭。在调试程序前,应使与PORTD口相连的8位拔码开关拔向相应的位置。
例5.1 PORTD输出

#include        

main()

{

        TRISD=0X00;                        /*TRISD寄存器被赋值,PORTD每一位都为输出*/

while(1);                                /*循环执行点亮发光二极管的语句*/

        {

                PORTD=0XF0;                /*向PORTD送数据,点亮LED(由实验模板*/

/*的设计决定相应位置低时LED点亮)。*/

}

}


5.2.1  MSSP模块SPI方式功能简介

        下面是一段简单的SPI初始化例程,用于利用SPI工作方式输出数据的场合。

例5.2  SPI初始化程序

/*spi初始化子程序*/

void         SPIINIT()

{

        PIR1=0;                                        /*清除SPI中断标志*/                

        SSPCON=0x30;                        /* SSPEN=1;CKP=0 , FOSC/4 */

        SSPSTAT=0xC0;

        TRISC=0x00;                        /*SDO引脚为输出,SCK引脚为输出*/

}

5.2.3  程序清单

下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。

#include                

/*该程序用于在8个LED上依次显示1~8等8个字符*/

static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};

volatile         unsigned         char         data; 

#define         PORTAIT(adr,bit)  ((unsigned)(&adr)*8+(bit))        /*绝对寻址位操作指令*/

static        bit PORTA_5 @ PORTAIT(PORTA,5); 

/*spi初始化子程序*/

void                SPIINIT()

{

        PIR1=0;                

        SSPCON=0x30;                        /* SSPEN=1;CKP=0 , FOSC/4 */

        SSPSTAT=0xC0;

        TRISC=0x00;                        /*SDO引脚为输出,SCK引脚为输出*/

}

/*系统各输入输出口初始化子程序*/

void                initial()

{

TRISA=0x00;                        /*A口设置为输出*/

        INTCON=0x00;                        /*关闭所有中断*/

        PORTA_5=0;                                /*LACK送低电平,为锁存做准备*/

}

/*SPI发送子程序*/

void                 SPILED(int data)

{

        SSPBUF=data;                        /*启动发送*/

        do

        {

        }while(SSPIF==0);                /*等待发送完毕*/

SSPIF=0;                                /*清除SSPIF标志*/

}

/*主程序*/

main()

{

        unsigned        I;

        initial();                                        /*系统初始化*/

        SPIINIT()        ;                                /*SPI初始化*/        

         for(i=8;i>0;i--)                        /*连续发送8个数据*/

          {

                data=table[i];                        /*通过数组的转换获得待显示的段码*/        

                SPILED(data);                /*发送显示段码显示*/                

          }

        PORTA_5=1;                                /*最后给锁存信号,代表显示任务完成*/

}

5.3.3  程序清单

        下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。有关显示部分的SPI初始化,请读者参考5.2节。

#include                

/*该程序用于按下相应的键时,在第一个8段LED上显示相应的1~4的字符*/

#define         PORTAIT(adr,bit)  ((unsigned)(&adr)*8+(bit))        /*绝对寻址位操作指令*/

static         bit  PORTA_5  @  PORTAIT(PORTA,5);        

#define        PORTBIT(adr, bit)        ((unsigned)(&adr)*8+(bit))         /*绝对寻址位操作指令*/

static         bit  PORTB_5  @  PORTBIT(PORTB,5);

static         bit  PORTB_4  @  PORTBIT(PORTB,4);

static         bit  PORTB_1  @  PORTBIT(PORTB,1)        ;

static         bit  PORTB_2  @  PORTBIT(PORTB,2)        ;

unsigned         int        I;

unsigned         char        j;

int  data;

/*spi初始化子程序*/

void                 SPIINIT()

{

        PIR1=0;

        SSPCON=0x30;        

        SSPSTAT=0xC0;

        TRISC=0xD7;                        /*SDO引脚为输出,SCK引脚为输出*/

}

/*系统各输入输出口初始化子程序*/

void                 initial()

{

        TRISA=0xDF;

        TRISB=0XF0;                        /*设置与键盘有关的各口的数据方向*/

        INTCON=0x00;                        /*关闭所有中断*/

        data=0X00;                                /*待显示的寄存器赋初值*/

        PORTB=0X00;                        /*RB1 RB2 先送低电平*/

        j=0;

}

/*软件延时子程序*/

void                DELAY()

{

        for(i = 6553; --i ;)

        continue;

}

/*键扫描子程序*/

int                KEYSCAN()

{        

while(1)

{

        if ((PORTB_5==0)||(PORTB_4==0))

        break;

}                                                        /*等待有键按下*/

        DELAY();                                /*软件延时*/

        if ((PORTB_5==0)||(PORTB_4==0))

                KEYSERVE();                /*如果仍有键按下,则调用键服务子程序*/

        else        j=0x00;                                /*如果为干扰,则令返回值为0*/

        return(j);

}        

/*键服务子程序*/

int                KEYSERVE()

{

        PORTB=0XFD        ;

        if(PORTB_5==0)        j=0X01;

if(PORTB_4==0) j=0X03

[1] [2] [3] [4]
关键字:PIC16F877  外围功能模块  PORTD口 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479376.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PIC单片机车载仪表带CAN总线通讯源代码
下一篇:学习pic单片机经验

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

电池容量测试仪电路与源码(PIC16F1938单片机+AD623实现)
分享一个由PIC16F1938单片机芯片和AD623构成的电池容量测试仪.电路原理图如下:电池容量测试仪的pic单片机源码:#include    "main.h" //------------------------32MHZ---------------------------------------------- __CONFIG(FOSC_INTOSC & CLKOUTEN_OFF & BOREN_ON & PWRTE_ON & CPD_OFF          &CP_ON
发表于 2019-11-11
电池容量测试仪电路与源码(PIC16F1938单片机+AD623实现)
用PIC18F4520与发电机上的电表实现MUDBUS通信
则无1个停止位(有校验时),2个Bit(无校验时)错误检测域· LRC(纵向冗长检测)RTU模式当控制器设为在Modbus网络上以RTU模式通信,在消息中的每个8Bit字节按照原值传送,不做处理,如63H,RTU将直接发送01100011。这种方式的主要优点是:数据帧传送之间没有间隔,相同波特率下传输数据的密度要比ASCII高,传输速度更快。代码系统8位二进制,十六进制数0...9,A...F消息中的每个8位域都是一或两个十六进制字符组成每个字节的位1个起始位8个数据位,最小的有效位先发送1个奇偶校验位,无校验则无1个停止位(有校验时),2个Bit(无校验时)(4)数据校验方式CRC校验CRC域是两个字节,包含一16位的二进制值
发表于 2019-11-11
用PIC18F4520与发电机上的电表实现MUDBUS通信
PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序
软件:MPLAB X IDE v4.15编译    proteus 8.6仿真.1、仿真电路图;2、发送和接收源程序加注释。请看注释。原理:1)ADC读取并用led显示ADC读数,并通过usart进行输出。2)通过PPM原理进行通讯传输到另外一个单片机,LED显示接收的值。具体请看附件希望大家顶一下。仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 1、发送模块:读取ADC数值,LED显示10位ADC值。并通过PPM发送。2、接收模块:PPM接收到的数据。LED显示接收的ADC值(10bits)基于PIC单片机的PPM调制激光通信收发器PPM (pulse position
发表于 2019-11-09
PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序
PIC 16f877a PORTB State Change Interrupt仿真与源码
PORT Change Interrupt PIC 16f877A单片机源程序如下:#define      LED_1     PORTd.b0#define      LED_2     PORTd.b1void interrupt(){if(INTCON.RBIF)  {  INTCON.RBIF = 0;  if(!PORTB.B4)   {    LED_1 = 0;    LED_2 = 1;   } 
发表于 2019-11-09
PIC 16f877a PORTB State Change Interrupt仿真与源码
基于pic16f877a的电压输出并显示
;   {                INTF = 0;                  //清除标志        votCounter++;        if(votCounter > 0x0F)  //只有16X2种可能        {         
发表于 2019-11-09
基于pic16f877a的电压输出并显示
用PIC10F202单片机制作两路开关源程序
;*****************************************//************************************  以下为代码区,请勿改动!  *****************************************//=============================================硬件连接示意===============================================////    ___短 _      长   _______ //       |_| |_________|    PIC10F200/202
发表于 2019-11-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved