4065|0

1379

帖子

0

TA的资源

裸片初长成(中级)

楼主
 

PIC16F877的外围功能模块简单应用实例(1) [复制链接]

 

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


PORTD输出

       #include  <pic.h>

main()

{

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

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

       {

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

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

}

}

=====================================================================

 

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

SPI初始化程序

/*spi初始化子程序*/

void       SPIINIT()

{

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

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

       SSPSTAT=0xC0

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

}

=====================================================================

程序清单1.
在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。

#include         <pic1687x.h>

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

static volatile int table[20]={0xc00xf90xa40xb00x990x920x820XD80x800x900x880x830xc60xa10x860x8e0x7f0xbf0x890xff}

volatile    unsigned        char       data

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

static       bit PORTA_5 @ PORTAIT(PORTA5)

/*spi初始化子程序*/

void        SPIINIT()

{

       PIR1=0             

       SSPCON=0x30                /* SSPEN=1CKP=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=8i>0i--)                /*连续发送8个数据*/

      {

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

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

      }

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

}

 

程序清单2.

#include         <pic.h>

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

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

static       bit  PORTA_5  @  PORTAIT(PORTA5)

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

static       bit  PORTB_5  @  PORTBIT(PORTB5)

 

static      bit  PORTB_4  @  PORTBIT(PORTB4)

static       bit  PORTB_1  @  PORTBIT(PORTB1)   

static       bit  PORTB_2  @  PORTBIT(PORTB2)   

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

       PORTB=0XFB

       if(PORTB_5==0)    j=0X02

       if(PORTB_4==0)    j=0X04/*以上根据按下的键确定相应的键值*/

       PORTB=0X00                  /*恢复PORTB的值*/

while(1)

{

              if((PORTB_5==1)&&(PORTB_4==1)) break/*等待键盘松开*/

       }

       return(j)

}

/*SPI发送子程序*/

void               SPILED(int data)

{

       SSPBUF=data                   /*启动发送*/

       do

       {

         

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

       SSPIF=0

}

/*主程序*/

main()

{

static  int table[20]={0xc00xf90xa40xb00x990x920x820XD80x800x900x880x830xc60xa10x860x8e0x7f0xbf0x890xff}

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

       SPIINIT()      /*SPI初始化*/         

while(1)

{

       KEYSCAN()

       if(j!=0)                                /*如果j=0,证明先前的按键为干扰,则不予显示*/

{

              data=table[j]

              PORTA_5=0                     /*LACK信号清0,为锁存做准备*/

              SPILED(data)

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

}

  }

}

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表