打印

老实说我给PIC整得很恼火 郁闷

[复制链接]
5959|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ql1007|  楼主 | 2010-9-10 15:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
pic, TE, pd, PDA, tmp
本帖最后由 ql1007 于 2010-9-10 15:21 编辑

相当的郁闷 。。。程序上电加的读写EEPROM,那么上电显示都不正确 原本上电显示显示8个8,可现在只显示5个8.。。完全不对,起初怀疑是读写EEPROM的问题,单独测试过是没问题的 ,查看读回那个地址看 的确写入成功,后来继续测试 把上电读写EEPROM那段  屏蔽掉 读写EEPROM的函数看。。。也是一样的现象。。。。显示部分不会有问题 去掉上电加的读写EEPROM部分 显示正常全8  等待操作。。。。我就郁闷了 。。。什么情况能影响到上电刚开始显示都不对?逻辑上看是没有任何问题,那会是什么问题 。。自己查了有两个星期把 没有结果。。怀疑过编译器问题 我使用的是PICC9.70 。。。郁闷无比。。怀疑是编译器问题。。看门狗是关了的,这里的朋友很热心 试试了 看有没有朋友知道什么问题 哎
#include <pic.h>
unsigned char EEpromRead(unsigned char address);
void EEpromWrite(unsigned char address,unsigned char data);
unsigned char displaydata[8];
unsigned char bKey;
unsigned char tyle;
void keyboradscan(void);
void interrupt dealtime();
void desplay(void);
void scan(void);
void tmint(void);
void delay(unsigned char i);
unsigned char l_tmpdate1[8];//定义数组变量
unsigned char l_tmpdate2[8];
unsigned char safekey[6]={6,6,6,6,6,6};
unsigned char mima;
unsigned char flag2;
unsigned char keys;
void menushow(unsigned char menu9);
unsigned char menu;
unsigned char n;//最好定义成全局变量
unsigned char j;//全局变量
unsigned char shetemp=0;//全局变量控制设置时的输入显示
unsigned char shezhi;
extern void port_init();
extern void LCDInit(void);
extern unsigned char setLCDsegment(void);
extern void InitLcd();
void LCDinit();
void bijiao();

//内部晶振振荡


void main(void)
{
unsigned char vb;
port_init();//端口初始化
flag2=EEpromRead(255);//读EEPROM
if(flag2!=0x01)//如果上次是1 说明这次上电是睡眠状态
{EEpromWrite(255,0x01);}
else
{
EEpromWrite(255,0xff);
asm("nop");
asm("sleep");
asm("nop");
while(1);
}
LCDinit();//LCD初始化
displaydata[0]=8;
displaydata[1]=8;
displaydata[2]=8;
displaydata[3]=8;
displaydata[4]=8;
displaydata[5]=8;
displaydata[6]=8;
displaydata[7]=8;
setLCDsegment();
tyle=0;
//delay(65536);
tmint();
while(1)
{
   switch(keys)
       {
          case 99://用于测试时按0  显示保存的数组,正式版会撤销
                {
                    displaydata[0]=l_tmpdate1[0];
                    displaydata[1]=l_tmpdate1[1];
                    displaydata[2]=l_tmpdate1[2];
                    displaydata[3]=l_tmpdate1[3];
                    displaydata[4]=l_tmpdate1[4];
                    displaydata[5]=l_tmpdate1[5];
                    displaydata[6]=l_tmpdate1[6];
                    displaydata[7]=l_tmpdate1[7];
                    setLCDsegment();
                }break;
          case 16:
                  {  j=0;
                     shezhi=1;
                     keys=0;
                     menu=8;
                     menushow(menu);//显示6-7-8-9-
                     
                 }break;
          case 6://设置
            {
              j=0;
              keys=0;
              tyle=1;
              menu=1;
              menushow(menu);//显示1-
            
            }
           break;
          case 64:
            {   
              switch(tyle)
                {
                 case 1:
                   {
                    j=0;
                    keys=0;
                    if(safekey[0]!=l_tmpdate1[0]||safekey[1]!=l_tmpdate1[1]||safekey[2]!=l_tmpdate1[2]||safekey[3]!=l_tmpdate1[3]||safekey[4]!=l_tmpdate1[4]||safekey[5]!=l_tmpdate1[5])
                        {
                           tyle=0;//如果与旧密码不一致 清0
                           keys=6;//同时致KEYS为6
                        }
                    else {
                           tyle=2;
                           menu=2;
                           menushow(menu);//显示2-
                        }
        } break;
              case 2:
                {  
                    j=0;
                    keys=0;
                   l_tmpdate2[0]=l_tmpdate1[0];
                   l_tmpdate2[1]=l_tmpdate1[1];
                   l_tmpdate2[2]=l_tmpdate1[2];
                   l_tmpdate2[3]=l_tmpdate1[3];
                   l_tmpdate2[4]=l_tmpdate1[4];
                   l_tmpdate2[5]=l_tmpdate1[5];
                   menu=3;
                   menushow(menu);//显示2-
                   tyle=3;
                  
                }break;
              case 3:
                 {   j=0;
                     keys=0;
                   if(l_tmpdate2[0]!=l_tmpdate1[0]||l_tmpdate2[1]!=l_tmpdate1[1]||l_tmpdate2[2]!=l_tmpdate1[2]||l_tmpdate2[3]!=l_tmpdate1[3]||l_tmpdate2[4]!=l_tmpdate1[4]||l_tmpdate2[5]!=l_tmpdate1[5])
                        {
                           tyle=0;
                           keys=6;
                        }
                    else {
                           tyle=0;//回到case 16 ,把TYLE清0
                           shezhi=0;
                           keys=16;
                        }
                   }break;
                }   
              }break;
          }
}

}

peizhizi.gif (289.95 KB )

peizhizi.gif

QQ加了后.gif (898.13 KB )

QQ加了后.gif

没加E2PROM显示正确.gif (666.17 KB )

没加E2PROM显示正确.gif
沙发
ql1007|  楼主 | 2010-9-10 15:10 | 只看该作者
void menushow(unsigned char menu9)
{
switch(menu9)
{
  case 8:
      {//6-7-8-9-
        displaydata[7]=6;
        displaydata[6]=14;
        displaydata[5]=7;
        displaydata[4]=14;
        displaydata[3]=8;
        displaydata[2]=14;
        displaydata[1]=9;
        displaydata[0]=14;
        setLCDsegment();
      }
      break;
case 1:
      {//1-
        displaydata[7]=1;
        displaydata[6]=14;
        displaydata[5]=16;
        displaydata[4]=16;
        displaydata[3]=16;
        displaydata[2]=16;
        displaydata[1]=16;
        displaydata[0]=16;
        setLCDsegment();
      }
      break;
    case 2:
      {//2-
        displaydata[7]=2;
        displaydata[6]=14;
        displaydata[5]=16;
        displaydata[4]=16;
        displaydata[3]=16;
        displaydata[2]=16;
        displaydata[1]=16;
        displaydata[0]=16;
        setLCDsegment();
      }
      break;
     case 3:
      {//3-
        displaydata[7]=3;
        displaydata[6]=14;
        displaydata[5]=16;
        displaydata[4]=16;
        displaydata[3]=16;
        displaydata[2]=16;
        displaydata[1]=16;
        displaydata[0]=16;
        setLCDsegment();
      }
      break;
      
}

}
void delay(unsigned char i)
{

int r;
for(;i>0;i--) /**/
for(r=1500;r>0;r--)
{;}


}
//*********************************************************
//    定时中断初始化(OPTION_REG)
//*********************************************************
void tmint(void)
{
T0CS=0;      //时钟源为内部指令周期            
PSA=0;           //分频器分配给TMR0
//
PS2=1;          //TMR0的分频比为1:256         
PS1=1;
PS0=1;
//

GIE=1;          //允许总中断
TMR0IE=1;         //允许定时器0溢出中断
TMR0IF=0;         //清楚定时器0中断标志
TMR0=0Xd8;      //预置初值 T=(256-0xd8)x256=4000uS
}

void keyboradscan(void)
{
unsigned char key_a=200,key_i=0;
unsigned char temp;
    //while(key_a--);      //先消抖;
unsigned char  result;   
   
  

PORTC=0X7F;                 ////C7输出低电平,其他三位输出高电平 C7是列线
asm("nop");                 //插入一定延时,确保电平稳定
result=PORTC;               //读回C口高4位结果
result=result&0x0f;         //清除高4位 因为我的布线 高四位是列线 低四位是行线

if(result!=0x0f)            //判断低4位是否为全1(全1代表没按键按下)
   {
     result=result|0x70;     //否,加上高4位0x70,做为按键扫描的结果
      switch(result)
      {
      
       case 0x77: keys=64;while((PORTC&0x0f)!=0x0f);break;//ent
      }

   }
else                        //是,改变高4位输出,重新判断是否有按键按下
   {
   PORTC=0Xbf;               //C6输出低电平,其他三位输出高电平 C6是列
   asm("nop");               //插入一定延时,确保电平稳定
   result=PORTC;             //读回C口结果
   result=result&0x0f;       //清除高4位
   if(result!=0x0f)          //判断低4位是否为全1(全1代表没按键按下)
     {
     result=result|0xb0;     //否,加上高4位0xb,做为按键扫描的结果
     switch(result)
      {
       case 0xb7: keys=16;

while((PORTC&0x0f)!=0x0f);break;//set
       case 0xbe:
              
               if(tyle==0)
               {
                  keys=6;
               }

               else {displaydata[7-(j+2)]=6;setLCDsegment(); l_tmpdate1[j]=6;j++;}while((PORTC&0x0f)!=0x0f);break;
               
       case 0xbd: keys=3;displaydata[7-j]=3;j++;setLCDsegment();while((PORTC&0x0f)!=0x0f);break;//3
       case 0xbb: keys=9;displaydata[7-j]=9;j++;setLCDsegment();while((PORTC&0x0f)!=0x0f);break;//9
      }

     
     }
   else                      //是,改变高4位输出,重新扫描
       {
       PORTC=0Xdf;           //C5输出低电平,其他三位输出高电平
       asm("nop");           //插入一定延时,确保电平稳定
       result=PORTC;         //读回C口高4位结果
       result=result&0x0f;   //清除高4位
       if(result!=0x0f)      //判断低4位是否为全1(全1代表没按键按下)
        {
        result=result|0xd0;  //否,加上高4位0x0d,做为按键扫描的结果
        switch(result)
          {
           case 0xde: keys=1;displaydata[7-j]=1;j++;setLCDsegment();while((PORTC&0x0f)!=0x0f);break;//1
           case 0xdd: keys=2;displaydata[7-j]=2;j++;setLCDsegment();while((PORTC&0x0f)!=0x0f);break;
         //2

          case 0xdb: keys=4;displaydata[7-j]=4;j++;setLCDsegment();while((PORTC&0x0f)!=0x0f);break;//4
          case 0xd7: keys=5;displaydata[7-j]=5;j++;setLCDsegment(); l_tmpdate1[j]=5;while((PORTC&0x0f)!=0x0f);break;//5
         }
        }
       else                  //是,改变高4位的输出,重新扫描
          {
          PORTC=0Xef;        //C4输出低电平,其他三位输出高电平
          asm("nop");        //插入一定延时,确保电平稳定
          result=PORTC;      //读回C口高4位结果
          result=result&0x0f;//清除高4位
          if(result!=0x0f)   //判断低四位是否为全1(全1代表没有按键按下)
            {
             result=result|0xe0;//否,加上高4位0x0e,做为按键扫描的结果
            switch(result)
                 {
                   case 0xe7: keys=32;
                          j--;
                          
                          setLCDsegment();
           while((PORTC&0x0f)!=0x0f);break;//del
                   case 0xeb:
                           keys=99;while((PORTC&0x0f)!=0x0f);break;//0 调试用于观察键值保存数组
                   case 0xee: keys=7;displaydata[7-j]=7;j++;setLCDsegment();while((PORTC&0x0f)!=0x0f);break;//7
                   case 0xed: keys=8;displaydata[7-j]=8;j++;setLCDsegment();while((PORTC&0x0f)!=0x0f);break;//8
                 }
            }
          else               //是,全部按键扫描结束,没有按键按下,置无按键按下标志位
            {
             result=0xff;    //扫描结果为0xff,做为没有按键按下的标志
            }   
          }      
      }
   }

   result;

}



//*********************************************************
void interrupt dealtime()   //中断入口,该中断完成数码管的动态扫描
{                          //每中断一次的时间为4毫秒
    unsigned char i,n;

if(TMR0IF==1&&TMR0IE==1)
   {
   //判断TMR1中断 T1中断
      //TMR0IE=0;//禁止溢出中断,防止干扰
            TMR0IF=0;          // 清除TMR1中断标志,每次中断溢出需要软件将TMR1IF清零
            
            keyboradscan();
           TMR0 = 0Xd8;
           
   }        
    PORTC=0;          //为下一次按键做准备;
    TMR0IF=0;
    GIE=1;         //开中断
}


void LCDinit()
{
LCDCON = 0b11001011;  //LCD on, WERR off, SLPEN on 31Khz, 1/4 multiplex//
LCDPS = 0b00110010;   //type a waveform, 1/3 BIAS, 1:3 prescaler  LCD的相位寄存器 ,
LCDREF = 0b10000110;  //
LCDCST = 0b00000000;  //maximum contrast  LCD对比度控制寄存器 最大
LCDSE0 = 0b10110001;  //segment SEG 0 4 5 7  
LCDSE1 = 0b11110000;  //segment 12~15 enable
LCDSE2 = 0b11111111;//segment 16~23 enable
LCDDATA0=0;
LCDDATA1=0;
LCDDATA2=0;
LCDDATA3=0;
LCDDATA4=0;
LCDDATA5=0;
LCDDATA6=0;
LCDDATA7=0;
LCDDATA8=0;
LCDDATA9=0;
LCDDATA10=0;
LCDDATA11=0;
LCDRL = 0b11110100;   //low power mode, A type waveform:4clock for A and 12 clock for B, B type waveform:4 clock for A and 28 clock for B
LCDIF = 0;
LCDIE = 0;            //interrupt disabled
LCDEN = 1;            //LCD on
}


void port_init()
{
OSCCON = 0b01101010;//内部4M晶振运行 方便定时器0
//ADCON1=0X07;
//SWDTEN=1;              //WDT看门狗由SWDTEN这位控制,使能WDT
  ANSELA=0;//设置A口为普通数字口,必须先把ANESELA设为数字IO 这样才能使用输出输入功能
  ANSELB=0;////B口也设置成数字IO口
  ANSELE=0;//E口也设置成数字IO口
  TRISA=0B11000000;//RA6 7做晶振输入 ,0-5做为数码管控制输出
  TRISB=0b00000000;
  TRISC = 0x0F; //键盘的列设为输出,行设为输入,RC7 C6 C5 C4 输出 ,C0 C1 C2 C3输入
  TRISD = 0x00; //数码管控制 设为输出
  TRISE = 0B00001000; //RE3始终为输入 RE0 1 2为数码管输出

}
unsigned char setLCDsegment(void){
const unsigned char Arabic[17]={
    0xFA,0x60,0xD6,0xF4,0x6C,0xBC,0xBE,0xE0,
    0xFE,0xFC,0xEE,0x3E,0x9A,0x76,0x04,0xce,0x00
};    //0123456789abcdef 0xce是P 0x04是-   //0123456789abcdef
   
   
unsigned char data0=0,data1=0,data2=0,data3=0,data4=0,data5=0,data6=0,data7=0,data8=0,data9=0,data10=0; //LCDDATAx暂存
unsigned char num;
    unsigned char data11=0;


  if(displaydata[0]<17){//轮流扫描8个数码管
  num=Arabic[displaydata[0]];
        data1|=(num&0x80)>>1;
        data4|=(num&0x40);
        data7|=(num&0x20)<<1;
        data10|=(num&0x10)<<2;
        data1|=(num&0x08)<<4;
        data4|=(num&0x04)<<5;
        data7|=(num&0x02)<<6;
}else{
  return 0;
}

/***********************
第二个数
    17 18
seg 12 13
************************/

if(displaydata[1]<17){
  num=Arabic[displaydata[1]];
        data1|=(num&0x80)>>3;
    data4|=(num&0x40)>>2;
    data7|=(num&0x20)>>1;
    data10|=(num&0x10);
    data1|=(num&0x08)<<2;
    data4|=(num&0x04)<<3;
    data7|=(num&0x02)<<4;
}else{
  return 0;
}


/**
第三个数
   15 16
seg21 22
*/

if(displaydata[2]<17){
  num=Arabic[displaydata[2]];
        data2|=(num&0x80)>>2;
    data5|=(num&0x40)>>1;
    data8|=(num&0x20);
    data11|=(num&0x10)<<1;
    data2|=(num&0x08)<<3;
    data5|=(num&0x04)<<4;
    data8|=(num&0x02)<<5;
}else{
  return 0;
}

/**********************
第四个数
    13 14
seg 16 20
***********************/

if(displaydata[3]<17){
  num=Arabic[displaydata[3]];
        data2|=(num&0x80)>>7;
data5|=(num&0x40)>>6;
data8|=(num&0x20)>>5;
data11|=(num&0x10)>>4;
data2|=(num&0x08)<<1;
data5|=(num&0x04)<<2;
data8|=(num&0x02)<<3;
}else{
  return 0;
}

/*********************
第5个数
    13 14
seg 16 20
**********************/

if(displaydata[4]<17){
  num=Arabic[displaydata[4]];
        data2|=(num&0x80);
    data5|=(num&0x40)<<1;
    data8|=(num&0x20)<<2;
    data11|=(num&0x10)<<3;
    data0|=(num&0x08)<<4;
    data3|=(num&0x04)<<5;
    data6|=(num&0x02)<<6;
}else{
  return 0;
}

/**********************
第六个数
   9 10
SEG4 5
*************************/

if(displaydata[5]<17){
  num=Arabic[displaydata[5]];
        data0|=(num&0x80)>>3;
data3|=(num&0x40)>>2;
data6|=(num&0x20)>>1;
data9|=(num&0x10);
data0|=(num&0x08)<<2;
data3|=(num&0x04)<<3;
data6|=(num&0x02)<<4;
}else{
  return 0;
}

/**********************
第7个数
   7   8
SEG19  18
*************************/

if(displaydata[6]<17){
  num=Arabic[displaydata[6]];
        data2|=(num&0x80)>>4;
data5|=(num&0x40)>>3;
data8|=(num&0x20)>>2;
data11|=(num&0x10)>>1;
data2|=(num&0x08)>>1;
data5|=(num&0x04);
data8|=(num&0x02)<<1;
}else{
  return 0;
}

/***********************
第二个数
    17 18
seg 12 13
************************/
if(displaydata[7]<17){
  num=Arabic[displaydata[7]];
        data0|=(num&0x80)>>7;
data3|=(num&0x40)>>6;
data6|=(num&0x20)>>5;
data9|=(num&0x10)>>4;
data2|=(num&0x08)>>2;
data5|=(num&0x04)>>1;
data8|=(num&0x02);
}else{
  return 0;
}


/***********************
显示开机令
20
SEG15
************************/
data10|=0x01<<7;
data10|=0x01<<5;
data11|=0x01<<6;
if(keys == 32 )//清除标志
{
   
switch(7-j)
   {
      case 7://第8个数码管清零
           displaydata[7]=16;
           num=Arabic[displaydata[7]];
           data2|=(num&0x80)>>4;
           data5|=(num&0x40)>>3;
           data8|=(num&0x20)>>2;
           data11|=(num&0x10)>>1;
           data2|=(num&0x08)>>1;
           data5|=(num&0x04);
           data8|=(num&0x02)<<1;
            break;           
//break;
      
      case 6://第7个数码管
          displaydata[6]=16;
          num=Arabic[displaydata[6]];
          data2|=(num&0x80)>>4;
          data5|=(num&0x40)>>3;
          data8|=(num&0x20)>>2;
          data11|=(num&0x10)>>1;
          data2|=(num&0x08)>>1;
          data5|=(num&0x04);
          data8|=(num&0x02)<<1;
           break;
      case 5://第6个数码管
           displaydata[5]=16;
           num=Arabic[displaydata[5]];
        data0|=(num&0x80)>>3;
data3|=(num&0x40)>>2;
data6|=(num&0x20)>>1;
data9|=(num&0x10);
data0|=(num&0x08)<<2;
data3|=(num&0x04)<<3;
data6|=(num&0x02)<<4;
           break;
      case 4://第5个数码管
           displaydata[4]=16;
          num=Arabic[displaydata[4]];
          data2|=(num&0x80);
          data5|=(num&0x40)<<1;
          data8|=(num&0x20)<<2;
           data11|=(num&0x10)<<3;
    data0|=(num&0x08)<<4;
    data3|=(num&0x04)<<5;
    data6|=(num&0x02)<<6;
           break;
      case 3://第4个数码管
            displaydata[3]=16;
            num=Arabic[displaydata[3]];
        data2|=(num&0x80)>>7;
data5|=(num&0x40)>>6;
data8|=(num&0x20)>>5;
data11|=(num&0x10)>>4;
data2|=(num&0x08)<<1;
data5|=(num&0x04)<<2;
data8|=(num&0x02)<<3;
           break;
      case 2://第3个数码管
displaydata[2]=16;
           num=Arabic[displaydata[2]];
        data2|=(num&0x80)>>2;
    data5|=(num&0x40)>>1;
    data8|=(num&0x20);
    data11|=(num&0x10)<<1;
    data2|=(num&0x08)<<3;
    data5|=(num&0x04)<<4;
    data8|=(num&0x02)<<5;
           break;
      case 1://第2个数码管
displaydata[1]=16;
          num=Arabic[displaydata[1]];
        data1|=(num&0x80)>>3;
    data4|=(num&0x40)>>2;
    data7|=(num&0x20)>>1;
    data10|=(num&0x10);
    data1|=(num&0x08)<<2;
    data4|=(num&0x04)<<3;
    data7|=(num&0x02)<<4;
           break;
      case 0://第1个数码管
displaydata[0]=16;
          num=Arabic[displaydata[0]];
        data1|=(num&0x80)>>1;
        data4|=(num&0x40);
        data7|=(num&0x20)<<1;
        data10|=(num&0x10)<<2;
        data1|=(num&0x08)<<4;
        data4|=(num&0x04)<<5;
        data7|=(num&0x02)<<6;
           break;
      default:
         break;
   }
}



    LCDDATA0=data0;
    LCDDATA1=data1;   
    LCDDATA2=data2;
    LCDDATA3=data3;
LCDDATA4=data4;   
    LCDDATA5=data5;
    LCDDATA6=data6;
LCDDATA7=data7;   
    LCDDATA8=data8;
    LCDDATA9=data9;
LCDDATA10=data10;
    LCDDATA11=data11;//LCDDATA等于就是输出到段码的值
return 1;
}


unsigned char EEpromRead(unsigned char address)
{
EEADRL =  address;//向低位直接写入要读的地址
/*
以下是读E2PROM必须要有的三个步骤

*/
    CFGS   = 0;
EEPGD  = 0;
RD     = 1;
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");

return EEDATL;
}


void EEpromWrite(unsigned char address,unsigned char data)
{
unsigned char tmp;
unsigned char flag;
unsigned char i;
flag=0;
// for(i=0;i<0xff;i++){
     EEADRL = address;//存放要读写的地址
  EEDATL = data;    //EEDATL存放要读写的8位数据
  CFGS   = 0;       //访问数据存储器 或者程序存储器
  EEPGD  = 0;      //0是访问数据存储器 1是访问程序存储器
  GIE=0;
  tmp    = INTCON;
  INTCON = 0;

  WREN   = 1;  //允许执行写操作
  EECON2 = 0x55; //数据EEPROM 解锁模式位 为了解锁写操作 必须先写0X55 再写0XAA
  EECON2 = 0xAA;
  WR     = 1;   //写完后才能将WR置位
        while(!EEIF);//ziji
        GIE=1;
        EEIF=0;//ziji
     asm("nop");
     asm("nop");
     WREN   = 0;   //写完后软件清零
     INTCON = tmp;
  
//}

}

使用特权

评论回复
板凳
ql1007|  楼主 | 2010-9-10 15:43 | 只看该作者
继续试了下 在BUILD OPTION哩设置把SPEED原先未打上钩的 打上钩后编译后 即使加了读写部分也是显示正常了 。。。这是为什么呢

MPLAB设置.gif (399.72 KB )

MPLAB设置.gif

使用特权

评论回复
地板
ql1007|  楼主 | 2010-9-10 15:48 | 只看该作者
说来说去还就是编译器问题。。。日。。第一次搞PIC这么郁闷 以前搞NXP也没这么郁闷 擦

使用特权

评论回复
5
mei326| | 2010-9-10 22:15 | 只看该作者
好像PIC7.0BUG~我也是刚搞PIC,用的编译器是PICC9.63,遇到了很多问题!楼主有兴趣交流下

使用特权

评论回复
6
NE5532| | 2010-9-10 22:36 | 只看该作者
说来说去还就是编译器问题。。。日。。第一次搞PIC这么郁闷 以前搞NXP也没这么郁闷 擦
ql1007 发表于 2010-9-10 15:48


再一次说明了我为什么反对在PIC上完C语言!

使用特权

评论回复
7
headwolf_83| | 2010-9-11 08:14 | 只看该作者
用PICC STD版本的编译器,PRO和LITE就不要用了。除非上193X,那没办法。

使用特权

评论回复
8
headwolf_83| | 2010-9-11 08:15 | 只看该作者
7楼的发言审核通过后可以找地方去下。

使用特权

评论回复
9
xymxym| | 2010-9-11 08:18 | 只看该作者
如果用的不是新款单片机,建议还是用8.05的,最稳定的一版,或者9.65的也可以!9.70有用过,绝对让你吐血!

使用特权

评论回复
10
headwolf_83| | 2010-9-11 08:21 | 只看该作者
感觉HI-TECH被MCHP收购后反而越做越差了。还是说DEMO版和Z版的差异太大了。

使用特权

评论回复
11
lxyppc| | 2010-9-11 10:32 | 只看该作者
如果不是正版还是用8.05的吧

使用特权

评论回复
12
yewuyi| | 2010-9-11 11:49 | 只看该作者
我9.50版本用的好好,没发现有什么问题。

9.70版本只用来编译PIC16F193X,也没发现有什么问题。

稍微看了看LZ的程序,整个程序混乱无比,以LZ 的功力就不要去猜想编译器如何如何了,还是先先好好想想如何把程序写得规范点,以改变编译器优化等级来判断编译器有问题者绝大多数都是瞎扯,如果发现编译器有问题,完全可以通过写测试代码验证并确认这个问题,请问LZ你能验证并确认吗?

使用特权

评论回复
13
杜专| | 2010-9-11 13:53 | 只看该作者
写这么多switch case

我服了LZ 简单看了下 完全可以用别的方法写嘛

我用几年的PICC了  感觉还可以啊

既然LZ 你选择了PICC 你就要相信编译器塞

使用特权

评论回复
14
linqing171| | 2010-9-11 14:22 | 只看该作者
前一阵,一个项目,客户催的很急,只给了软件一周的时间,但是因为样品有几十k的利润,所以老板就压迫着我们去做。结果电路板有问题,第一板连飞线都没有办法调。
用的182x,编译器也是全新的,多年没有做pic了,结果按list文件里面的汇编代码了挨个地方做注释,分析了一整天,从中断if(enable & flag)到中断中的状态机和全局变量、临时区域、算法里面的16MUL16后高位的额外处理、AD/SSP 里面的处理逻辑,等等详细审核。替换成16F81x后用proteus功能仿真。所有工作做完后,软硬联调的时候,直接就是好的。
特别编译器的网站上写着,对这个型号没有测试过,这种事情还是必须做的,另外说一下,对于PIC16F1827的ADC,内置的函数发现一个bug。另外现在用惯了startup.s里面都有清空RAM的代码的编译器,我的这个编译器竟然上电不进行任何RAM清空。

我用的CCSC 最新的试用版本。其实一般项目来说,试用版本在时间和空间限制上能用的话就尽量用试用版的,对我们做软件的行业也是一种保护。

对于楼主的图里面的 goto 03c8 和 goto 038a 都是去调用楼主的dealtime()。
速度降低后就能用了,楼主试一下,上电后先延时50ms看看,是不是电源不稳定的时候就进行了读写EEPROM?

使用特权

评论回复
15
yewuyi| | 2010-9-11 17:57 | 只看该作者
1、LZ的代码上电后竟然初始化一下端口就直接操作EEPROM,这本身就说明LZ写代码胆子很大。。。
2、switch多点到也正常,但π顺序都能能排成那个乱样实在让看代码的人头疼无比
3、中断中竟然敢随便操作GIE那更是胆大妄为了。
4、LZ上学的时候肯定没好好学C语言基础知识,难道不知道声明和定义等等如何分开,如何形成多文件格式的代码便于审查代码更是无影无踪
5、关于配置字的宏也没见到,不知道是不是自己手工配置的?也不知道配置成什么样了。。。
6、那内部的delay简直让人触目惊心
7、难道不知在编译器的库函数中有读EE和写EE的库函数可以直接调用吗?也不知道你自己写的那读写EEPROM的代码对不对,但写的那么零乱,实在不敢多想。
8、操作端口时难道不知道使用端口缓冲吗?竟然很潇洒的直接对这端口一通捣鼓,嘿嘿,某一天你将会因为这个死的很难看,别说我们没告诉你。
9、keyboradscan();这个函数在中断一通调用,请问相关的临界代码处理在哪?!
10、综合LZ的那些代码,LZ的基础尚不及格,还是慎言编译器为好。。。

使用特权

评论回复
16
lxyppc| | 2010-9-11 20:50 | 只看该作者
呵呵,难得楼上能细看楼主的代码
楼主可以就楼上说的这些问题查查代码

使用特权

评论回复
17
ql1007|  楼主 | 2010-9-13 09:58 | 只看该作者
回复版主:
  贴上的程序并不是我的最终,仅仅是测试 我只像测试 是不是我的编译器问题 所以很多并没有整理,另外 上电读写EEPROM没什么问题吧 。。我测试过是没问题
再者 我就不说别的 。。。我周末重新测试了 仅仅留了案件显示,不开优化 SPEED ,案件反映特别慢。。开了后正常了。。。
请问版主 这是我的问题???

貌似我搞了4年ARM第一次知道编译器能有这么大作用。。。
也许我的确像你说的基础差吧。。。

使用特权

评论回复
18
ql1007|  楼主 | 2010-9-13 10:00 | 只看该作者
连贝能的人都说有问题 。。。版主不能因别人的程序 而去怀疑。。。作为一个工程师 是用来解决问题的 ,如果你连自己的编译器都不敢去怀疑。。。我很怀疑你的能力 。。至少我试了!!!
只是每个人遇到的情况不一样 你不知道的事情多了

使用特权

评论回复
19
ql1007|  楼主 | 2010-9-13 10:07 | 只看该作者
不过很感谢你那么热心 能从头到尾读了一遍我的撮作。。。还是要谢谢的

使用特权

评论回复
20
yewuyi| | 2010-9-13 11:56 | 只看该作者
连贝能的人都说有问题 。。。版主不能因别人的程序 而去怀疑。。。作为一个工程师 是用来解决问题的 ,如果你连自己的编译器都不敢去怀疑。。。我很怀疑你的能力 。。至少我试了!!!
只是每个人遇到的情况不一样  ...
ql1007 发表于 2010-9-13 10:00


不是不敢怀疑,而是怀疑了就要能证明它,否则就无意义。

使用特权

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

本版积分规则

35

主题

122

帖子

0

粉丝