找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1141|回复: 4
收起左侧

Error [1250]could not find space (2 bytes) for variable _SEC pic单片机编译问题

[复制链接]
ID:769545 发表于 2022-6-30 23:43 | 显示全部楼层 |阅读模式
我是新手,提问的帖不够全面,现在完整发出来,请问一下高手

出错提示如下:
Error   [1250] E:\thermometer\PIC\thermometer.c; 72. could not find space (2 bytes) for variable _SEC

unsigned int SEC;这样定义编译会通过,这样的话比较的数是不是少于255;理论上是不会的。是不是我哪儿设置不对?

单片机源程序如下:
#include <pic.h>
//#include "thermometer.h"
unsigned char volatile ADCY_COUNT @ 0X25;
unsigned char volatile DIP0 @ 0X26;
unsigned char volatile DIP1 @ 0X27;
unsigned char volatile WEI @ 0X30;
unsigned char sbstatus @ 0x23;
bit volatile ADCY@((unsigned)&sbstatus*8+0;

unsigned char LED @ 0x21;
bit volatile LEDdp@((unsigned)&LED*8+0;
bit volatile LEDg@((unsigned)&LED*8+1;
bit volatile LEDf@((unsigned)&LED*8+2;
bit volatile LEDe@((unsigned)&LED*8+3;
bit volatile LEDd@((unsigned)&LED*8+4;
bit volatile LEDc@((unsigned)&LED*8+5;
bit volatile LEDb@((unsigned)&LED*8+6;
bit volatile LEDa@((unsigned)&LED*8+7;

#define XLEDa  RC0
#define XLEDb  RC1
#define XLEDc  RC5
#define XLEDd  RC4
#define XLEDe  RC3
#define XLEDf  RC2
#define XLEDg  RA5

//unsigned char volatile SEC; //双字节
unsigned int SEC;
unsigned char  i;

void DisbytLED(void)
  {
                XLEDa=LEDa;
                XLEDb=LEDb;
             XLEDc=LEDc;
        XLEDd=LEDd;
        XLEDe=LEDe;
        XLEDf=LEDf;
        XLEDg=LEDg;
                //LEDdp=;
  }
void interrupt ISR(void)
{
  if(T0IE&&T0IF==1)
    {   T0IF=0;
     TMR0=TMR0+0X03;
     OPTION_REG=0X01;
     LED=0X00;
      DisbytLED();      
      if(WEI==0X00)
      {
         RA0=1;
         RA1=0;
         LED=DIP0;
         WEI=0X01;
      }
      else
      {
         RA1=1;
         RA0=0;
         LED=DIP1;
         WEI=0X00;
      }  

    DisbytLED();
    SEC=SEC+1;
    if(SEC==500)   
        ADCY=1;
    SEC=0;   
    }
  }


void cydelay()   //采样时间延时程序
{
  for (i=255;i>0;i--)
    {
     asm("nop");
     asm("nop");
     asm("nop");
     asm("nop");
    }

}

void initial()    //初始化程序
{
  INTCON=0X00;
  TRISA=0X0C;
  ANSEL=0X04;
  //TRISB=0X00;
  TRISC=0X00;
//TRISD=0X00;
OPTION_REG=0X01;
  ADCON1=0X04;
  ADCON0=0X00;
  CMCON=0x07;
  INTCON=0XA0;
}
/*主程序*/
main()
{
WEI=0X00;
ADCY=0;
initial();//调用初始化端口程序


for(;;)
{
   asm("clrwdt");//清除看门狗
  // DIP0=0X11;
   //DIP1=0XFF;
    SEC=SEC+1;
   if(SEC>=500)
    ADCY=1;
}
}
// LLED=0XFF;
// LLED1=0;
  //LOLED=0XFF;


回复

使用道具 举报

ID:887371 发表于 2022-7-1 09:36 | 显示全部楼层
这代码太多问题了。
1.不要大量使用volatile 绝对定位变量。
2.能用自动变量就不要用全局变量。
3.中断服务中使用函数。
4.多处代码逻辑混乱。
5.picc的特有语法使用错误。你这代码功能我猜测是2位数码管显示,只需要标准C语言就能完成,完全不需要用到picc的特有语法。虽然你没定义几个变量,因语法出错,编译提示定义的变量超出了极限。

楼主应要花几天学习下C语言基础。
回复

使用道具 举报

ID:769545 发表于 2022-7-1 18:45 | 显示全部楼层
datouyuan 发表于 2022-7-1 09:36
这代码太多问题了。
1.不要大量使用volatile 绝对定位变量。
2.能用自动变量就不要用全局变量。

中断里面的程序是1ms刷新一次,显示需要刷新,2位数码管的程序是一样的,不过可以调整;我奇怪的是:判别秒SEC大于500秒,意味着需要用2个字节,理论上需要定义int,但是编译会出错,如果定义一个字节char就能正常编译通过。我的意思是PICC的编译器是不是不能直接比较大的数据,如2个字节的数据。
回复

使用道具 举报

ID:329625 发表于 2022-7-1 19:26 | 显示全部楼层
先找到错误什么意思,然后去对应的地方修改
回复

使用道具 举报

ID:887371 发表于 2022-7-2 09:25 | 显示全部楼层
hym8085hym 发表于 2022-7-1 18:45
中断里面的程序是1ms刷新一次,显示需要刷新,2位数码管的程序是一样的,不过可以调整;我奇怪的是:判别 ...

假设你的mcu共有40byte RAM。由于你代码这么多问题,使得还没定义SEC,RAM就用掉了39byte。
所以定义一个字节(char)就能正常编译通过,定义l两个字节(short)就不能编译通过。
你按我提到的几点要求稍微改下,就不会出现你奇怪的现象。

再强调下,编译器一般不会有问题,该怀疑的是自己的代码,自己解决相关问题的思路。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表