Dspic30F4011 и CD4094 с прерыванием по SPI

Я использую шпион dspic30f4011 для подсчета от 00 до 99 на 7seg. Дисп через сдвиговый регистр CD4094. Когда я использую флаг прерывания SPI1IF, чтобы знать, что передача завершена, этот метод( /*while(!SPI1IF_bit); SPI1IF_bit=0;*/) не работал вместо этого, когда я положил delay_us(7); потом работает. Я хочу использовать прерывание, как я могу решить эту проблему, спасибо за любую помощь

     #define STB PORTB.B0

 ayarla(){
  ADPCFG=0XFFFF;

  DISSDO_bit=0;
  MODE16_bit=0;
  SMP_bit=0;
  CKP_bit=1;
  CKE_bit=1;
  MSTEN_bit=1;
  SPI1CON.B0=0;
  SPI1CON.B1=1;
  SPI1CON.B2=0;
  SPI1CON.B3=1;
  SPI1CON.B4=1;


enter code here

  SPI1IE_bit=1;
  IPC2.B0=1;
  IPC2.B1=1;
  IPC2.B2=1;

  SPI1IF_bit=0;

  SPIROV_bit=0;
  SPIEN_bit=1;
  TRISF.B3=0;
  TRISF.B6=0;
  TRISB.B0=0;
  PORTB.B0=0;
  delay_ms(100);
   }
unsigned short disp[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
unsigned short i,j,temp;
 void main() {

  ayarla();
  temp=SPI1BUF;
  while(1){

  for(j=0;j<=9;j++){
   for(i=0;i<=9;i++){
    SPI1BUF=disp[i];
    //delay_us(7);
      while(!SPI1IF_bit);
      SPI1IF_bit=0;


    SPI1BUF=disp[j];
    //delay_us(7);
    while(!SPI1IF_bit);
    SPI1IF_bit=0;

    STB=1;
    delay_us(10);
    STB=0;

    delay_ms(500);


  }
  }
  }
  }

0 ответов

Другие вопросы по тегам