ccp1捕捉一直不正确,帮忙看一下

2020-02-10 08:33发布

刚学pic,用ccp1捕捉模块的时候一直不正确,大家帮忙看看哪错了

谢谢

#include<p18f4520.h>

unsigned        char        CCP1_Count=0;        // CCP1捕捉个数计数(>1清0)
unsigned        int        CCPRE[2];                   // CCP1捕捉的2个脉冲的计数值
const rom unsigned char SZ[17]={0x3f  , 0x06 , 0x5b , 0x4f , 0x66 ,
                         0x6d ,0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
                         0x39 , 0x5e , 0x79 , 0x71 , 0x00};
void ccp1(void);
void ccp1_captuer_init(void)
{
        TRISCbits.TRISC2=1;
        CCP1CON=0x05;/* 设置CCP1模块为捕捉方式,捕捉第1个脉冲上升沿 */
        T3CON=0x00;//TMER1 IS THE CLOCK
        T1CON=0x30;//tmr1一次对16位操作,
        RCONbits.IPEN=1;//开优先级
        PIR1bits.CCP1IF=0;//清除ccp1中断标志
        PIE1bits.TMR1IE=0;//关tmr1中断
        PIE1bits.CCP1IE=1;/* CCP1捕捉中断使能 */
        IPR1bits.CCP1IP=0;//低优先级
        TMR1H=0;
        TMR1L=0;
        CCPR1H=0;
        CCPR1L=0;
        ADCON1=0xff;

        INTCONbits.GIE=1;//开全局中断
        INTCONbits.GIEL=1;
}

void ccp1(void);
#pragma code ccp1_duan=0x18
void ccp1_rukou(void)
{
        _asm
        goto ccp1
        _endasm;
}
#pragma code

#pragma interruptlow ccp1

void ccp1(void)
{
        CCPRE[CCP1_Count]=CCPR1L+(CCPR1H<<8);/* 记下16位捕捉值到存放捕捉数组 */
        CCP1_Count=CCP1_Count+1;        /* 捕捉次数加1 */
               
        if(CCP1_Count>1)
        {
                CCP1_Count=0;                        /* 本程序只存放2次捕捉值 */
                PIE1bits.CCP1IE=0;/* 关CCP1捕捉中断使能 */
                T1CONbits.TMR1ON=0;//关定时器
        }
        PIR1bits.CCP1IF=0;//清除ccp1中断标志
}

void delay(void)
{
        unsigned int i;
        for(i=0;i<100;i++);
}

void main(void)
{
        unsigned int j;
        unsigned char a,b,c,d,e;
        ccp1_captuer_init();
        T1CONbits.TMR1ON=1;//开定时器
        while(1)
        {
                j=CCPRE[1]-CCPRE[0];
                a=j/10000;
                b=(j%10000)/1000;
                c=(j%1000)/100;
                d=(j%100)/10;
                e=j%10;
                TRISD=0;
                TRISA=0;
                PORTA=0xff;       
               
                PORTD=SZ[a];
                PORTAbits.RA0=0;
                delay();
                PORTAbits.RA0=1;
               
                PORTD=SZ;
                PORTAbits.RA1=0;
                delay();
                PORTAbits.RA1=1;
               
                PORTD=SZ[c];
                PORTAbits.RA2=0;
                delay();
                PORTAbits.RA2=1;
               
                PORTD=SZ[d];
                PORTAbits.RA3=0;
                delay();
                PORTAbits.RA3=1;
               
                PORTD=SZ[e];
                PORTAbits.RA4=0;
                delay();
                PORTAbits.RA4=1;
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
liansh
1楼-- · 2020-02-10 14:00
CCPRE[CCP1_Count]=CCPR1L+(CCPR1H<<8);这里直接让CCPR1H左移8位是不是就是直接让CCPRIH清空了!
Yaksa
2楼-- · 2020-02-10 17:31
 精彩回答 2  元偷偷看……

一周热门 更多>