2 bsjsoso bsjsoso 于 2015.06.05 10:09 提问

在IAR中出现expected a 错误

#include "emot.h"
unsigned int counter=0;
uchar TEMPFLAG;

void DELAY(uint n);

void INITIAL()
{
LED_INIT();
SET_TIMER2_INT(1);
SET_TIMER2_COUNTER(0X00FF); //这里出现错误
}

void main(void)
{
INITIAL();
led1=0;
led2=1;

TIMER2_ACTION(0);

while(1)
{
if(TEMPFLAG)
{
led1!=led1;
led2!=led2;
TEMPFLAG=0;
}

}
}
#pragma vector=T2_VECTOR
__interrupt void T2_ISR(void)
{
CLEAR_TIMER2_INT_FLAG();
if(counter<200) counter++;
else {counter=0; TEMPFLAG=1;}
}

下面是emoth.h的编写。
#ifndef EMOT_H
#define EMOT_H
#include
#define uint unsigned int
#define uchar unsigned char
/**********************************************
//the common macro
***********************************************/

#define BYTE unsigned char
#define WORD unsigned int

#define UPPER_BYTE(a) ((BYTE)(((WORD)(a))>>8))
#define HIBYTE(a) UPPER_BYTE(a)
#define LOWER_BYTE(a) ((BYTE)((WORD)(a)))
#define LIBYTE(a) LOWER_BYTE(a)

#define SET_WORD(regH,regL,word) do{(regH)=UPPER_BYTE(word);(regL)=LOWER_BYTE(word)}while(0)
/****************************************************
/初始化T2的配置
*****************************************************/

#define TIMER2_CMP_BYTE(val)\
do{ \
if(val==0)\
{\
T2CNF&=~0X08;\
}\
else\
{T2CNF|=0X08;\
}\
while(0)

#define TIMER2_ACTION(val)\
do{\
if(val==0) T2CNF|=0X01;\
else T2CNF&=~0XFE;\
}while(0)

#define SET_TIMER2_COUNTER(val) SET_WORD(T2TLD,T2THD,val)

//清除中断标志
#define CLEAR_TIMER2_INT_FLAG()\
do{ \
T2CNF&=~0XC0; \
T2IF=0; \
}while(0)

//设置T2比较值
#define SET_T2_CMP_COUNTER(val)\
do{ \
T2CMP=0X00; \
T2CMP|=(char)val; \
}while(0)

//开启中断,0为比较中断。1为溢出中断
#define SET_TIMER2_INT(val)\
do{ \
if(val==0) T2PEROF2|=0X80; \
else T2PEROF2|=0X40; \
}while(0)

//设定溢出值
#define SET_TIMER2_CAP_COUNTER(val) SET_WORD(T2CAPLPL,T2CAPHPL,val) //有时错误会出现没有定义T2CAPLPL。但T2CAPLPL不是已经在ioCC2430里面有定义吗。

//LED初始化
#define LED_INIT()\
do{ \
P1SEL&=~0X03; \
P1|=0X03; \
P1DIR|=0X03; \
}while(0)

#define led1 P1_0
#define led2 P1_1

#endif

2个回答

zc1107473010
zc1107473010   2015.06.05 10:37
已采纳

#define SET_WORD(regH,regL,word) do{(regH)=UPPER_BYTE(word);(regL)=LOWER_BYTE(word)}while(0)
这个地方后面上个冒号,应该改成
#define SET_WORD(regH,regL,word) do{(regH)=UPPER_BYTE(word);(regL)=LOWER_BYTE(word);}while(0)
还有,这种写法真是作死,明明很简单的干嘛绕这么大的圈子,宏定义的目的是为了多次引用时便于修改,这种强行增加难度不建议

bsjsoso
bsjsoso 是这个问题。刚开始学习。按照书上的思路写的。
2 年多之前 回复
zc1107473010
zc1107473010   2015.06.05 11:28

对于用宏定义的语句,出错就不要去语句那儿找,去找宏就可以,最好直接替换,发现错误也很快的

bsjsoso
bsjsoso 恩。好。谢谢指导。我看你写的日志也很有用。以后还请多指教。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!