发新帖我要提问
12
返回列表
打印
[学习资料]

PIC16F877A应用笔记(转)

[复制链接]
楼主: zljiu
手机看帖
扫描二维码
随时随地手机跟帖
21
zljiu|  楼主 | 2019-6-21 14:05 | 只看该作者 回帖奖励 |倒序浏览
八、  外部中断



#include<pic.h>           //调用PIC16F87XA单片机的头文件



//根据选项,配置字:

__CONFIG(HS&WDTDIS&LVPDIS);



//7  6 5  4  3 2  1  0

//v7 v6 v5v4 v3 v2 v1 v0

constunsigned char liushui[64]=

{

0B00000001,  //0

0B00000010,

0B00000100,

0B00001000,

0B00010000,

0B00100000,

0B01000000,

0B10000000,

0B11000000,

0B11100000,

0B11110000,   //10

0B11111000,

0B11111100,

0B11111110,

0B11111111,

0B11111110,

0B11111100,

0B11111000,

0B11110000,

0B11100000,

0B11000000,   //20

0B10000000,

0B10000000,

0B01000000,

0B00100000,

0B00010000,

0B00001000,

0B00000100,

0B00000010,

0B00000001,

0B00000010,  //30

0B00000100,

0B00001000,

0B00010000,

0B00100000,

0B01000000,

0B10000000,

0B01000000,

0B00100000,

0B00010000,

0B00001000,  //40

0B00000100,

0B00000010,

0B00000001,

0B00000011,

0B00000110,

0B00001100,

0B00011000,

0B00110000,

0B01100000,

0B11000000,  //50

0B00000000,

0B00000001,

0B00000101,

0B00010101,

0B01010101,

0B01010111,

0B01011111,

0B01111111,

0B11111111,

0B00000000,  //60

0B10101010,

0B01010101,

0B00000000,  //63

};



unsignedint a=0;

unsignedchar b=0;


使用特权

评论回复
22
zljiu|  楼主 | 2019-6-21 14:06 | 只看该作者
//---------------------------------------

//名称:中断服务程序

//---------------------------------------

voidinterrupt ISR(void)   //PIC单片机的所有中断都是这一个入口

{

    if(INTF==1)//需要进一步判断是否是INT中断

    {

        INTF=0;//清中断标志位,以备下次中断

    //***此处用户自行添加INT外部中断处理程序***

          b=0;//中断后清零,使流水从头开始

   //******************************************

    }

}


使用特权

评论回复
23
zljiu|  楼主 | 2019-6-21 14:06 | 只看该作者
//---------------------------------------

//名称: 主函数

//---------------------------------------

voidmain(void)            //主函数,单片机开机后就是从这个函数开始运行

{

    TRISB=0B11111111;//初始化RB7-RB0的输入输出方向

    PORTB=0B00000000;//初始化RB7-RB0的数值

    TRISD=0B00000000;//初始化RD7-RD0的输入输出方向

    PORTD=0B00000000;//初始化RD7-RD0的数值



    //***外部中断RB0/INT初始化***

    INTEDG=1;             //设置RB0/INT为上升沿触发

    INTF=0;                //清除RB0/INT的中断标志

    INTE=1;                //设置RB0/INT中断允许

    //***************************



    //***开全局中断设置****

    //外部中断RB0/INT设置了中断允许,此处要开全局中断

    GIE=1;                 //开全局中断

    //外部中断RB0/INT设置了中断允许,此处要允许所有未被屏蔽的外设中断

    PEIE=1;                //允许外设中断

    //*********************



    while(1)

    {

    if(++a>10000)    //延时10000个软件周期,非精确定时

              {

            a=0;   //清零以备下次重新计数

            b++;    //步骤参数加1,以进一步

            b&=0x3f;//因为我们定义的表格长度为64,所以这里需要限制步骤参数在0-63间

            PORTD=liushui[b];//根据步骤参数查表格,将查出的参数放入临时缓冲寄存器中

              }

    }

}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则