刚学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;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>