打印
[STC单片机]

求大神帮忙看看编写的这个程序错在哪了,为什么在KEIL上编

[复制链接]
1463|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinhai_lucky 于 2014-12-15 10:42 编辑

#include<intrins.h>
#include<reg51.h>
#include“calc.h”
static data LONG lvalue;
static data LONG rvalue;
static data CHAR currtoken;
static data CHAR lasttoken;
static data GHAR lastpress;
static xdata CHAR outputbuffer[MAX_DISPLAY_CHAR];
VOID main(VOID).
{lvalue   =0;
  rvalue   =0;
currtoken = ‘=’;
lasttoken = ‘0’;
Initialise();
Calc_output(OK);
Calc_evaluate();
}
VOID calc_cvaluate()
{CHAR data key;
INT data i ;
CHAR xdata number[MAX_DISPLAY_CHAR];
CHAR xdata *bufferptr;
                  //清除冲区
For(i=0;i<=MAX_DISPLAY_CHAR; i++)
{ number = ‘’;
}
buffer = number;

for(;;)
{key = calc_getkey();
If(calc_testkey(key))
                                //输入数据正数或负数 并LCD上显示
{if (bufferptr !=&number[MAX_DISPLAY_CHAR-2])
{*bufferptr = key:
calc_display(number);
Bufferptr++;
}
                             }
else
  {
                                //输入第一个数.
If(lasttoken ==        ‘0’)
{lvalue = calc_asciidec (number);}
else
{rvalue = calc_asciidec(number);}
Bufferptr = number;
for (i = 0;i<=MAX_DISPLAY_CHAR; i++)
     {number = ‘’}
                        //处理输入数据r
   currtoken = key;
If (currtoken == ‘C’)
{ calc_opfunctions(currtoken);}
Else
{calc_opfunctions(lasttoken);}
                            //输入第二个数
For (i= 0;i<= MAX_DISPLAY_CHAR;i++)
{ outputbuffer =number;
If (currtoken !=0×3D)lasttoken=currtoken;

}
Lastpress = key;
}
}
VOID calc_opfunctions (CHAR token)
{
CHAR data result;
Switch(token)
                    //加法
{  case ‘+’; if ((currtoken ==‘=’) if ((lastpress>=0×30)&&(lastpress<=0×39)))
{ lvalue +=rvalue;
result = calc_chkerror(lvalue);
}
Else
{ result= SLEEP;}    break;
                                    // 减法.
Case∵        :if ((currtoken ==‘=’)|| ((lastpress>=0×30)&&(lastpress<=0×39)))
{lvalue -=rvalue;
result = calc_chkerror(lvalue);
}
Else
{result = SLEEP;)              break;
                                   //乘法
Case‘*’: if ((currtoken ==        ‘=’) || (lastpress>= 0×30)&&(lastpress<=0×39)))
{lvalue * =rvalue;
Result =calc_chkerror(lvalue):
}
Else
{result = SLEEP;}                  break;
                                //除法.
Case        ‘/’: if ((currtoken ==        ‘=’)|| (lastpress>= 0×30)&&(lastpress<=0×39)))
{ if (rvalue)
     {lvalue /=rvalue:
                Result =calc_chkerror(lvalue):
   }
  Else
   {result = ERROR:}
}
Else
{result =SLEEP:}           break:
                         //删除
Case‘C’: lvalue =0;
          Rvalue = 0;
            Currtoken =‘0’;
           Result= ‘OK’           break;
Defult:  result = SLEEP;
}
/**********************************************************Utility Routines
******************************************************/
INT calc_cheerror(LONG num)
                      // LED显示范围 -999999 —999999
      {
If((num>=-999999)&&(num<=999999))
Return OK;
Else
  return  REEOR;
}
VOID calc_output (INT status)
{
Switch(status)
{ case OK    :calc_display(calc_decascii(lvalue)):  break;
case SLEEP    :                             break;
case ERROR   :calc_display(“Exception”);        break;
  defult       :calc_display(“Exception”);        break;
}
LONG calc_asciidec(CHAR *buffer)        //ASCII 码转换
{
LONG data value;
LONG data digit;
value = 0;
While(*buffer!=        ‘’)
{ digit =*buffer - 48;
value = value *10+digit;
buffer++;
}
return  value;
}
CHAR*calc_decascii(LONG num )
{
LONG data temp =num;
CHAR xdata*arrayptr = &outputbuffer[MAX_DISPLAY_CHAR];
LONG data division = 10;
LONG data result;
CHAR data remainder,asciival;
INT data i;

If(!temp)
{ *arrayptr = 48;
Goto done;
}
If(temp<0)                            //负数处理
{
outputbuffer[0]=        ‘-’;
temp -= 2*temp;
}
For (i=0;i< sizeof(outputbuffer); i++)
{ remainder =temp % divisior;
Result = temp/divisior;
If ((!remainder)&&(!result))
{*arrayptr =        ‘’;}
Else
{ asciival = remainder + 48;
*arrayptr = asciival;
}
temp/=10;
If(arrayptr !=&outputbuffer[]arrayptr--;
}
Done: return outputbuffer;
}
CHAR calc_testkey(CHAR key)
{ if ((key>=0×30)&& (key<=0×39))
{return 1 :}
else
{ return 0 :}
}
/**********************************************************                 I/O routines
*************************************************/
CHAR calc_getkey(VOID)
                    // 键盘扫描
{CHAR data mykey;
do mykey =input();
  while (mykey == 0);
return mykey;
}
VOID calc_display (CHAR but[MAX_DISPLAY_CHAR])
                               //LCD显示
{ INT data i = 0;
Clearscreen();
for(i;i<=MAX_DISPLAY_        CHAR; i++)
{ if (but !=        ‘’)
{ output(but);}
}
}      

相关帖子

沙发
落雪绽菊| | 2014-12-14 23:37 | 只看该作者
建议楼主说明这个程序的功能,简单流程图,和出现的问题。这样别人看起来高效一些。

使用特权

评论回复
板凳
叶伤| | 2014-12-15 00:09 | 只看该作者

static data CHAR lasttoken;
static data GHAR lastpress;

使用特权

评论回复
地板
jinhai_lucky|  楼主 | 2014-12-15 10:29 | 只看该作者
落雪绽菊 发表于 2014-12-14 23:37
建议楼主说明这个程序的功能,简单流程图,和出现的问题。这样别人看起来高效一些。 ...

这是一个计算器的设计,第一次发帖,有很多不足之处,还请海涵

使用特权

评论回复
5
jinhai_lucky|  楼主 | 2014-12-15 10:30 | 只看该作者
叶伤 发表于 2014-12-15 00:09
static data CHAR lasttoken;
static data GHAR lastpress;

您好,请大神说明白点可以吗,这是一个计算器的设计

使用特权

评论回复
6
wangyy608| | 2014-12-15 11:00 | 只看该作者
检查下: ;以及输入法

使用特权

评论回复
7
cleaver.Yeh| | 2014-12-15 11:37 | 只看该作者
calc.h有问题,要把这个文件贴出来看看.

使用特权

评论回复
8
cleaver.Yeh| | 2014-12-15 11:40 | 只看该作者
很简单的方法,我猜是这样:
你先把
static data LONG lvalue;
static data LONG rvalue;
这两行调个位置,
static data LONG rvalue;
static data LONG lvalue;
如果出错会报在rvalue,那么就不是这样出错,是上面的头文件出错.如果仍报lvalue这行出错,那就是这一行程序有问题.

使用特权

评论回复
9
as564335sa| | 2014-12-15 12:06 | 只看该作者
又是大家来找茬的游戏,编译器不是告诉你哪错误了吗

使用特权

评论回复
10
coody| | 2014-12-15 12:08 | 只看该作者
#include“calc.h”
检查你这双引号是不是用中文的那个了

使用特权

评论回复
11
jinhai_lucky|  楼主 | 2014-12-15 13:42 | 只看该作者
as564335sa 发表于 2014-12-15 12:06
又是大家来找茬的游戏,编译器不是告诉你哪错误了吗

告诉了可是不知道怎么改,本人是菜鸟,刚接触不久,见笑了

使用特权

评论回复
12
jinhai_lucky|  楼主 | 2014-12-15 13:47 | 只看该作者
as564335sa 发表于 2014-12-15 12:06
又是大家来找茬的游戏,编译器不是告诉你哪错误了吗

看来是头文件的问题了

使用特权

评论回复
13
jinhai_lucky|  楼主 | 2014-12-15 13:50 | 只看该作者
cleaver.Yeh 发表于 2014-12-15 11:37
calc.h有问题,要把这个文件贴出来看看.

是头文件的问题,这个头文件在KEIL中没有

使用特权

评论回复
14
getmore| | 2014-12-15 14:05 | 只看该作者
编译器不都说了吗,LED.C文件,129行缺少分号,不要把中文输入的分号,当成英文输入的分号

使用特权

评论回复
15
thuacn| | 2014-12-15 15:07 | 只看该作者
#include“calc.h”
输入法最好默认英语。

使用特权

评论回复
16
pang3dsa| | 2014-12-15 19:15 | 只看该作者
VOID main(VOID).    //void要用小写吧,括号后面多了个“.”符号
Case∵        :if ((currtoken ==‘=’)|| ((lastpress>=0×30)&&(lastpress<=0×39)))
// 这句有点疑问,那三个点不知道是网页的问题还是源程序的问题,没这样用过不确定是不是可行的
Case‘*’: if ((currtoken ==        ‘=’) || (lastpress>= 0×30)&&(lastpress<=0×39)))
{lvalue * =rvalue;
Result =calc_chkerror(lvalue):      //这里应该用分号
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
jinhai_lucky + 1 谢谢
17
xingsqd| | 2014-12-16 00:15 | 只看该作者
落雪绽菊 发表于 2014-12-14 23:37
建议楼主说明这个程序的功能,简单流程图,和出现的问题。这样别人看起来高效一些。 ...

:lol

使用特权

评论回复
18
jinhai_lucky|  楼主 | 2014-12-16 16:15 | 只看该作者
pang3dsa 发表于 2014-12-15 19:15
VOID main(VOID).    //void要用小写吧,括号后面多了个“.”符号
Case∵        :if ((currtoken ==‘=’ ...

谢谢您的细心分析

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝