PIC16F877a进入中断不能延时请高手看看

[复制链接]
1985|15
 楼主| LFD0776 发表于 2017-4-10 09:35 | 显示全部楼层 |阅读模式
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
__CONFIG(0x3B31);

#define S17 RC7         //定义按键IO
#define S18 RC6         
#define S19 RC5         
#define S20 RC4         
#define S21 RC3      
void init();
uint intnum;
void main()
{
        init();
        while(1)
        {
       if(S17==0)
                {
                if(intnum>20)
                        {
                        if(S17==0)
                        //intnum=0;
                        RB2=!RB2;
                        }
                }       
        }
}

void init()
{
        TRISD=0;
        PORTD=0XFF;

        TRISC=0x00;       //RC设置为输出
        PORTC=0xff;       //初始化为高

        TRISB=0x00;       //RB设置为输出
        PORTB=0xff;       //初始化为高       

        INTCON=0xc0;
        PIE1=0x01;
        TMR1L=(65536-50000)%256;
        TMR1H=(65536-50000)/256;
        T1CON=0x21;

}

void interrupt time0()
{
        TMR1IF=0;
        TMR1L=(65536-50000)%256;
        TMR1H=(65536-50000)/256;
        intnum++;
//RD0=!RD0;//
}
NE5532 发表于 2017-4-10 10:41 | 显示全部楼层
高手表示,不知道你想问哪行的问题。
 楼主| LFD0776 发表于 2017-4-10 11:16 | 显示全部楼层
   if(S17==0)
                {
                if(intnum>20)
                        {
                        if(S17==0)
                        //intnum=0;
                        RB2=0;
                        }
                }        

这里的
想要S17长按几秒后RB2输出一个低电平谢谢
试过了就是这里的定时计数不管用!!?
 楼主| LFD0776 发表于 2017-4-10 11:55 | 显示全部楼层
NE5532 发表于 2017-4-10 10:41
高手表示,不知道你想问哪行的问题。

while(1)
        {
               if(S17==0)       
                        {
                        delay(1000);
                        delay(1000);
                        delay(1000);
                        delay(1000);
                        delay(1000);
                delay(1000);
                delay(1000);
                delay(1000);
                delay(1000);
                delay(1000);
                        //intnum++;
                        //if(intnum>1000)
                        //intnum=0;
                        RB2=0;
                        }                       
        }
高手!!!
为什么这样子又可以呢,请求帮助!谢谢!!!
NE5532 发表于 2017-4-10 13:07 | 显示全部楼层
确认定时器有没有跑起来,定时器中断进去了没有,还有就是intnum没有初始化,也没有清0.
 楼主| LFD0776 发表于 2017-4-10 14:50 | 显示全部楼层
NE5532 发表于 2017-4-10 13:07
确认定时器有没有跑起来,定时器中断进去了没有,还有就是intnum没有初始化,也没有清0. ...

谢谢大侠的回答:
把前面的判断语句if(S17==0)不要就是可自动跑的!!!
NE5532 发表于 2017-4-10 14:58 | 显示全部楼层
程序架构不好,请自己画下流程图,再写。
 楼主| LFD0776 发表于 2017-4-10 14:59 | 显示全部楼层
好的谢谢!!!我再试试!!
huarana 发表于 2017-4-10 16:56 | 显示全部楼层
判断完 intnum 以后要清零
zyj9490 发表于 2017-4-10 20:56 | 显示全部楼层
CHLDZKJ 发表于 2017-4-10 21:53 | 显示全部楼层
yzqok 发表于 2017-4-11 10:29 | 显示全部楼层
 楼主| LFD0776 发表于 2017-4-12 10:55 | 显示全部楼层
huarana 发表于 2017-4-10 16:56
判断完 intnum 以后要清零

大侠有没有好一点的按键处理程序呢——,按键按下大于10S,,-----------I/O口输出一下高电平或者低电平谢谢!!!!!
huarana 发表于 2017-4-12 12:52 | 显示全部楼层
LFD0776 发表于 2017-4-12 10:55
大侠有没有好一点的按键处理程序呢——,按键按下大于10S,,-----------I/O口输出一下高电平或者低电平谢 ...

http://www.cnblogs.com/craftor/p/3811748.html
yangzj1974 发表于 2018-2-13 15:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部