无法解析标识符 RBIE 和 RBIF,有什么猜测吗?

问题描述 投票:0回答:1

尝试编译代码但一直给出构建失败并且检查红旗仅显示无法解析 RBIE 和 RBIF 中的标识符。 下面是我的代码,我将它与带有液晶显示器和 4x4 键盘的 pic18f45k50 一起使用尝试互联网,但只显示 RBIE 功能,仅此而已,我的老师没有太大帮助所以我自己。

#include <xc.h>
#include <stdio.h>
#include <String.h>

#pragma config FOSC = INTOSC_HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#define _XTAL_FREQ 8000000

#define time 10
#define CD 0x01
#define RH 0x02
#define EMS 0x06
#define DC 0x0F
#define DSr 0x1C
#define DSl 0x18
#define FS 0x38
#define RAW1 0x80
#define RAW2 0xC0
#define E LATEbits.LATE0
#define RS LATEbits.LATE1
void settings(void);
void __interrupt() KB(void);
int keyboard(void);
void entrada(void);
void calculo(void);
void dataLCD(void);
void settingsLCD(unsigned char word);
void LCD(unsigned char data);
void writeLCD(unsigned char word);
int i, j, key, keys[4][4] = {
 {7, 8, 9, 15},
 {4, 5, 6, 14},
 {1, 2, 3, 13},
 {10, 0, 11, 12}
};
float numa, numb, operacion, igual, k=0, resultado;
char text[12], text2[12] = {"R= "};
void main(void){
 settings();
 while(1){
 }
}
void settings(void){
 OSCCON = 0X72;
 ADCON1 = 0x0F;
 TRISD = 0;
 LATD = 0;
 TRISE = 0;
 LATE = 0;
 TRISB = 0xF0;
 LATB = 0x0F;
 GIE = 1;
 RBIE = 1;
 RBIF = 0;
 settingsLCD(CD);
 settingsLCD(EMS);
 settingsLCD(DC);
 settingsLCD(FS);
 dataLCD();
}
void settingsLCD(unsigned char word){
 RS = 0;
 LCD(word);
}
void LCD(unsigned char data){
 E = 1; __delay_ms(time);
 LATD = data;
 __delay_ms(time);
 E = 0;
}
void __interrupt() KB(void){
 if (RBIF){
 if ((PORTB & 0xF0) != 0){
 k++;
 calculo();
 if (key == 11 || key == 10) {
 settingsLCD(RAW1 + 11);
 sprintf(text,"%.2f", resultado);
 for (i = 0; i <= strlen(text); i++){
 writeLCD(text[i]); // CAMBIO
 __delay_ms(time);
 }
 }
 LATB = 0xF;
 }
 RBIF = 0;
 }
}
int keyboard(void){
 LATB = 0x01;
 for(i = 0; i <= 3; i++){ //CAMBIO
 if (PORTBbits.RB4){
 j = 0;
 break;
 } else if (PORTBbits.RB5){
 j = 1;
 break;
 } else if (PORTBbits.RB6){
 j = 2;
 break;
 }else if (PORTBbits.RB7){
 j = 3; break;
 }
 LATB = LATB << 1;
 }
 return keys[i][j]; //CAMBIO
}
void entrada(void){
 key = keyboard();
 if (k == 1){
 numa = key;
 } else if (k == 2){
 operacion = key;
 }else if (k == 3){
 numb = key;
 } else if (k == 4){
 igual = k;
 k= 0;
 }
}
void calculo(void){
 entrada();
 if(operacion == 15){
 resultado = numa / numb;
 } else if (operacion == 14){
 resultado = numa * numb;
 } else if (operacion == 13){
 resultado = numa - numb;
 } else if (operacion == 12){
 resultado = numa + numb;
 }
}
void dataLCD(void){
 settingsLCD(RAW1);
 for (i = 0; i<= strlen(text2); i++){
 writeLCD(text2[i]);
 __delay_ms(time);
 }}
void writeLCD(unsigned char word){
 RS = 1;
 LCD(word);
}
#pragma config DEBUG = ON
#pragma config F0SC = INT0SCI0
#pragma config WDTEN = OFF
#pragma config LVP = ON
#pragma config ICPRT = OFF
c pic mplab mplab-c18
1个回答
1
投票

这些位未在 PIC18F45k50 中实现,并且未在标头中定义。您必须更改程序中的名称:

RBIF
->
IOCIC

RBIE
->
IOCIE

查看数据表第 10.11 节:

PORTB<7:4>
PORTC<2:0>
集上的输入更改 标志位,
IOCIF
寄存器的
INTCON
。中断 可以通过设置/清除使能位来启用/禁用,
IOCIE
寄存器的
INTCON
。引脚也必须 使用
IOCB
/
IOCC
寄存器单独启用。

© www.soinside.com 2019 - 2024. All rights reserved.