4034|0

1379

帖子

0

TA的资源

裸片初长成(中级)

楼主
 

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

PORTB“电平变化中断”初始化子程序

/*B口“电平变化中断”初始化子程序*/

void              PORTBINT( )

{

       TRISB=0XF0                   /*设置相应口的输入输出方式*/

       OPTION=0x7F                /*B口弱上拉有效*/

       PORTB=0X00                  /*RB1RB2 先送低电平*/

       RBIE=1                           /*B口变位中断允许 */

       PORTB=PORTB               /*B口的值,以锁存旧值,为变位中断创造条件*/

}

 程序清单

      下面给出一个调试通过的例程,以供读者参考。有关显示的部分请读者参考前面章节。该程序中寄存器的位都用头文件中定义的位,如RB5表示PORTB的第5位,而不像前面几节那样自己定义。

       #include  <pic.h>

/*该程序用于通过PORTB"电平变化中断"进行键盘的识别。*/

/*程序设置一个键值寄存器j,当按下S9键时j=1,按下S11键时 */

/*j=2,按下S10键时,j=3,按下S12键时j=4*/

unsigned        char        data

unsigned        int           I

unsigned        char        j

const char table[20]={0xc00xf90xa40xb00x990x920x820XD80x800x900x880x830xc60xa10x860x8e0x7f0xbf0x890xff}

/*B口“电平变化中断”初始化子程序*/

void              PORTBINT()

{

       TRISB=0XF0                   /*设置相应口的输入输出方式*/

       OPTION=0x7F

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

       RBIE=1                           /*B口变位中断允许 */

       PORTB=PORTB               /*B口的值,为变位中断创造条件*/

}

/*spi初始化子程序*/

void              SPIINIT()

{

       PIR1=0

       SSPCON=0x30 

       SSPSTAT=0xC0

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

}

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

void        initial()

{

       TRISA=0xDF

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

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

}

/*键服务子程序*/ 

void        KEYSERVE()

{

       PORTB=0XFD      

       if(RB5==0)     j=0X01

       if(RB4==0)     j=0X03

       PORTB=0XFB      

       if(RB5==0)     j=0X02

       if(RB4==0)     j=0X04              /*以上通过逐行逐列扫描,以确定是何键按下*/    

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

}

/*软件延时子程序*/

void              DELAY()

{

       for(i = 6553 --i )

       continue

}

/*SPI发送子程序*/

void       SPILED(int data)

{

       SSPBUF=data                   /*启动发送*/

       do

       {

         

       }while(SSPIF==0)

       SSPIF=0

}

void        IDEDIS()

{

       KEYSERVE()                   /*进行键盘的识别*/

       data=table[j]                            /*获得需要送出显示的段码*/

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

       SPILED(data)

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

}

/*中断服务程序*/

void interrupt  keyint(void)

{

       DELAY()                         /*软件延时*/

       if ((RB5==0)||(RB4==0))              /*该语句除了能够确认按键是否为干扰外,*/

                                                 /*还可以屏蔽一次键松开时引起的中断*/

       IDEDIS()                         /*键识别和显示模块*/

       PORTB=PORTB               /*B口的值,改变中断发生的条件,避免键*/

                                                 /*一直按下时,连续进行键识别*/    

       RBIF=0                           /*键扫描时可能会产生"电平变化"而使RBIF*/

                                                 /*1,再清除一次RBIF以避免额外中断*/

}

main()

{

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

       PORTBINT()                   /*B口变位中断初始化*/

       SPIINIT()                               /*利用SPI显示初始化*/

       ei()                                  /*总中断允许*/

while(1)

       {

             

       }                                        /*等待中断*/

}

=====================================================================
 
程序清单
      
下面给出一个调试通过的例程,可作为读者的参考。调试该程序把模板
J7上的短路跳针拔下,以免产生冲突。

#include  <pic1687x.h>

volatile    unsigned        char       data

/*spi初始化子程序*/

 void      SPIINIT()

{

       PIR1=0

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

       SSPSTAT=0xC0

       TRISC=0x10                    /*SDI引脚为输入,SCK引脚为输出*/

}

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

void        initial()

{

       TRISA=0x00

       TRISD=0x00                   /*D口为输出方式*/

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

}

/*SPI接收子程序*/

 int        SPIIN()

{    

       RA4=0                             /*74HC165并行置数使能,将8位开关量置入器件*/

                                                 /* (LOAD为低电平时8位并行数据置入74HC165)*/

       RA4=1                             /*74HC165移位置数使能(LOAD为高电平时芯*/

                                                 /*片才能串行工作)*/

       SSPBUF=0                       /*启动SPI,此操作只用于清除SSPSTAT

                                                 *BF位,因此W中的实际数据无关紧要*/

       do{

          

       }while(SSPIF==0)            /*查询数据接收完毕否?*/

       SSPIF=0

       data=SSPBUF

       return(data)                      /*返回接收到的数据*/

}

/*SPI接收的数据通过D口显示在8个发光二极管上的子程序*/

void        SPIOUT(int data)

{

       PORTD=~data

}

/*主程序*/

main( )

{

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

       SPIINIT()                        /*SPI初始化*/

 while(1)

  {

       SPIIN()                                  /*SPI接收外部数据*/

       SPIOUT(data)                  /*送出数据显示*/

  }

}

点赞 关注
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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