导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→怎么仿真可以通过,烧片后程序不运行? 帮我看看啊[landysky]

 *第41247篇: 怎么仿真可以通过,烧片后程序不运行? 帮我看看啊

  
楼 主:landysky 2006年6月9日20:50
 怎么仿真可以通过,烧片后程序不运行? 帮我看看啊
// LCD Module:        LM3037
// Display Size:      144x32
// Driver/Controller: ST7920
// Interface:         P0--LCDBUS  P2.4--RS
//                    P2.3--RW    P2.2--E
// by:                Landy
// Date:          2006-05-25
// System;            AT89S52/12MHz/PLCC44
// Edith:             1.0
//-------------------------------------------------
// P.S.:              p3.6,P3.7正式使用时取消
//-------------------------------------------------

#include   <stdio.h>  
#include   <reg52.h>  
#include   <intrins.h>  

//-----------------------------------

#define uchar unsigned char // 0~255
#define uint  unsigned int   // 0~65535
#define LcdBus      P0      //LCDM数据总线
#define DataPortB   P1      //PIC16C74B PORTB
#define BitPortB    P3      //接138,读位信息

//-----------------------------------
uchar bdata  FlagBit;
uchar bdata  CodeNum[5];
uchar  data  PortBData;
uchar bdata  Segvalue[5];

//------------------------------------
sbit   ENABLE1  = P3^6;
sbit   ENABLE2  = P3^7;
sbit   ENABLE3  = P2^7;
sbit   ENABLE4  = P2^6;
sbit   ENABLE5  = P2^5;

sbit   RS       = P2^4;
sbit   RW       = P2^3;
sbit   E        = P2^2;
sbit   ENABLE6  = P2^1;
sbit   ENABLE7  = P2^0;

sbit   FlagBit0 =FlagBit^0;
sbit   FlagBit1 =FlagBit^1;
sbit   FlagBit2 =FlagBit^2;
sbit   FlagBit3 =FlagBit^3;
sbit   FlagBit4 =FlagBit^4;
sbit   FlagBit5 =FlagBit^5;
sbit   FlagBit6 =FlagBit^6;
sbit   FlagBit7 =FlagBit^7;

//-----------------------------------
//SubRoutine
//-----------------------------------

//-----------------------------------
/* 定时器1的10ms中断服务程序 */
//void timer1() interrupt 3 using 2{
  //    TF1=0;
    //  _nop_();
      //ReadPortB();
      //test();
      //_nop_();_nop_();
//}

// Delay Routine
//-----------------------------------
void delayms(uint);
void delayms(uint m)        // 12MHz Xtal, close to ms value
{
    uint data j;
    uint data i;
    for(i=0; i  <m; i++)
        for(j=0; j  <109; j++)
                    _nop_();
}

//send command
void SdCmd(uchar);
void SdCmd(uchar Command)
{

    RW = 0;
    RS = 0;
     E = 0;
    LcdBus = Command;
       E =1;
       _nop_();
       E =0;
    _nop_(); _nop_();
    _nop_(); _nop_();
    _nop_(); _nop_();
    _nop_(); _nop_();
}

//send display data
void SdData(uchar);
void SdData(uchar DData)
{

    RW =0;
    RS =1;
     E =0;
    LcdBus =DData;
     E =1;
    _nop_();
     E =0;
    _nop_(); _nop_();
    _nop_(); _nop_();
    _nop_(); _nop_();
    _nop_(); _nop_();
}


void ClrScr(void);
void ClrScr(void)
     {
      SdCmd(0x01);
     }

//Display
void hzkdis(uchar code *);
void hzkdis(uchar code *s)
{while(*s>  0)
      {SdData(*s);
           s++;
           delayms(2);
      }
}

//Read PortB
void ReadPortB(void);
void ReadPortB(void)
{      P3=0xff;
       FlagBit=BitPortB;
       FlagBit=BitPortB;
       FlagBit=~FlagBit;
       PortBData=DataPortB;
       _nop_();
       _nop_();
       PortBData=DataPortB;
       if (FlagBit7)
          { CodeNum[0]=PortBData; }
  else if (FlagBit6)
          { CodeNum[1]=PortBData; }
  else if (FlagBit5)
          { CodeNum[2]=PortBData; }
  else if (FlagBit4)
          { CodeNum[3]=PortBData; }
  else if (FlagBit3)
          { CodeNum[4]=PortBData; }
       else {_nop_();}
}

//display data
void DDData(void);
void DDData(void)
{   char data *strs=Segvalue+2;
   uchar t1;
   delayms(5);
   SdCmd(0x90);
   _nop_();
   _nop_();
   _nop_();
    for(t1=0;t1  <3;t1++)
       {
       _nop_();
       _nop_();
     switch(*strs)
           {
            case 0:hzkdis("0");break;
            case 1:hzkdis("1");break;
            case 2:hzkdis("2");break;
            case 3:hzkdis("3");break;
            case 4:hzkdis("4");break;
            case 5:hzkdis("5");break;
            case 6:hzkdis("6");break;
            case 7:hzkdis("7");break;
            case 8:hzkdis("8");break;
            case 9:hzkdis("9");break;
            case 13:hzkdis(" ");break;
             default:_nop_();
           }
          _nop_();
          _nop_();
          strs++;
          _nop_();
          _nop_();
       }
}

void PaSet(void);
void PaSet(void)
{
  ClrScr();
  SdCmd(0x80);
  _nop_();
  delayms(5);


}
//LED SEGGENT CODE CONVERT TO DIGITAL
void LedSegToNum(void);
void LedSegToNum()
{uchar data value;
uchar data *pt1;
uchar data *pt2;
uchar data mm;
        pt2=Segvalue;
       _nop_();
     for(mm=0;mm  <5;mm++)
         {
           switch(CodeNum[mm])
                 { case 0x20:{value=0;}break;
                   case 0xe9:{value=1;}break;
                   case 0x42:{value=2;}break;
                   case 0xc0:{value=3;}break;
                   case 0x89:{value=4;}break;
                   case 0x84:{value=5;}break;
                   case 0x04:{value=6;}break;
                   case 0xe1:{value=7;}break;
                   case 0x00:{value=8;}break;
                   case 0x80:{value=9;}break;
                   case 0x01:{value=0x0A;}break;
                   case 0x0c:{value=0x0B;}break;
                   case 0x26:{value=0x0C;}break;
                   case 0x48:{value=0x0D;}break;
                   case 0x06:{value=0x0E;}break;
                   case 0x07:{value=0x0F;}break;
                   case 0xcf:{value=0x10;}break;     //- RUN
                   case 0xe7:{value=0x11;}break;     //ˉ START
                   case 0xee:{value=0x12;}break;     //_ STOP
                   case 0xef:{value=0x13;}break;     //ALL DARK
                   default:{_nop_();}
                   }
                *pt2=value;
                 ++pt2;
                }
}
//display  notice
void  Display(uchar data *);
void  Display(uchar data *points)
{
uchar data *pt4=points;
   switch(*(pt4+1))
         {
          case 0:{
          PaSet();
          delayms(5);hzkdis("0 起始电压   ");delayms(5);DDData();hzkdis("%");}break;
          case 1:{PaSet();hzkdis("1 起动时间   ");DDData();hzkdis("s");}break;
          case 2:{PaSet();hzkdis("2 软停时间   ");DDData();hzkdis("s");}break;
          case 3:{PaSet();hzkdis("3 起动延时   ");DDData();hzkdis("s");}break;
          case 4:{PaSet();hzkdis("4 限流设定   ");DDData();hzkdis("%");}break;
          case 5:{PaSet();hzkdis("5 编程输出   ");DDData();}break;
          case 6:{PaSet();hzkdis("6 瞬停设置   ");DDData();}break;
          case 7:{PaSet();hzkdis("7 瞬停后再起动 ");DDData();}break;
          case 8:{PaSet();hzkdis("8 起动模式   ");DDData();}break;
          case 9:{PaSet();hzkdis("9 操作控制方式 ");DDData();}break;
          case 0xa:{
                    switch(*pt4)
                       {  case 0x10:{PaSet();hzkdis("ˉA   起动状态 ");}break;
                          case 0x11:{PaSet();hzkdis("-A  运行状态 " );}break;
                          case 0x12:{PaSet();hzkdis("_A  软停状态 " );}break;
                          case 0x13:{PaSet();hzkdis("A  0-20mA 电流量程  ");DDData();}break;
                            default:_nop_();
                        }
                    }break;
          case 0xb:{PaSet();hzkdis("B 电流显示方式 " );DDData();}break;
          case 0xc:{PaSet();hzkdis("C 通讯地址     ");DDData();}break;
          case 0xd:{PaSet();hzkdis("D 参");SdData(0xca);SdData(0xfd); hzkdis("设置   ");DDData();}break;
          case 0xe:{PaSet();hzkdis("E ");SdData(0xb9);SdData(0xfd);hzkdis("载倍");SdData(0xca);SdData(0xfd);hzkdis("设定 ");DDData();hzkdis("%");}break;
          case 0xf:{if (*pt4!=0x10) {SdCmd(0x01);PaSet();hzkdis("F 缺相保护   ");}
                     else  { switch(*(pt4+4))
                                  {case 0x1:{PaSet();hzkdis("-F01  瞬停       ");}break;
                                   case 0x2:{PaSet();hzkdis("-F02  起动时间太长 ");}break;
                                   case 0x3:{PaSet();hzkdis("-F03  ");SdData(0xb9);SdData(0xfd);hzkdis("  热  ");}break;
                                   case 0x4:{PaSet();hzkdis("-F04  输入缺相   ");}break;
                                   case 0x5:{PaSet();hzkdis("-F05  频率出错   ");}break;
                                   case 0x6:{PaSet();hzkdis("-F06  参");SdData(0xca);SdData(0xfd);hzkdis("出错 ");}break;
                                   case 0x7:{PaSet();hzkdis("-F07  起动");SdData(0xb9);SdData(0xfd);hzkdis("载   ");}break;
                                   case 0x8:{PaSet();hzkdis("-F08  运行");SdData(0xb9);SdData(0xfd);hzkdis("载   ");}break;
                                   case 0x9:{PaSet();hzkdis("-F09  输出缺相   ");}break;
                                    default:_nop_();
                                  }
                             }

                     }
           default:_nop_();
        }
}
void DePlay(void);
void DePlay(void)
{
     delayms(10);

            // LedSegToNum();
           // initLCDM();           //initial lcdm
     delayms(20);
     Display(Segvalue);
     delayms(1000);
}

//-----------------------------------
// Init LCD module
//-----------------------------------
void initLCDM(void);
void initLCDM(void )
{

     RW=0;
     RS=0;
      E=0;
     _nop_();
     LcdBus=0xff;    // pull up
     SdCmd(0x30);    // 8bit I/F, basic command, graphic off
     SdCmd(0x06);    // cursor right shift
     SdCmd(0x0C);    // display on

}
//Test
void test(void);
void test(void)
{

  ClrScr();
  delayms(5);
SdCmd(0x80);
      hzkdis("    WELCOME!    ");
       delayms(1000);
SdCmd(0x90);
      hzkdis("    固态软启动器    ");
}

void Debug(void);
void Debug(void)
{ uchar counter;
  uchar *text=Segvalue;
  for(counter=0;counter  <=0x0f;counter++)
      { delayms(5);
        switch(counter)
             {case 0x0: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=3;*(text+4)=0;}break;
              case 0x1: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=1;*(text+4)=0;}break;
              case 0x2: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=2;}break;
              case 0x3: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
              case 0x4: {Segvalue[1]=counter;*(text+2)=2;*(text+3)=5;*(text+4)=0;}break;
              case 0x5: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
              case 0x6: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
              case 0x7: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
              case 0x8: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=1;}break;
              case 0x9: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=1;}break;
             case 0x0a: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
             case 0x0b: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
             case 0x0c: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
             case 0x0d: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
             case 0x0e: {Segvalue[1]=counter;*(text+2)=1;*(text+3)=5;*(text+4)=0;}break;
             case 0x0f: {Segvalue[1]=counter;Segvalue[2]=0;}break;

               default:_nop_();
             }
          if (Segvalue[1]==0x0a) {DePlay(); Segvalue[0]=0x13;DePlay();
                                            Segvalue[0]=0x10;DePlay();
                                            Segvalue[0]=0x11;DePlay();
                                            Segvalue[0]=0x12;DePlay();}
     else if (Segvalue[1]==0x0f) {Deplay(); Segvalue[0]=0x10;Segvalue[3]=0;Segvalue[4]=1;DePlay();
                                                                           Segvalue[4]=2;DePlay();
                                                                           Segvalue[4]=3;DePlay();
                                                                           Segvalue[4]=4;DePlay();
                                                                           Segvalue[4]=5;DePlay();
                                                                           Segvalue[4]=6;DePlay();
                                                                           Segvalue[4]=7;DePlay();
                                                                           Segvalue[4]=8;DePlay();
                                                                           Segvalue[4]=9;DePlay(); }
         else DePlay();

      }
}


//-----------------------------------
// Main Program
//-----------------------------------
     main()

   delayms(200);
   SP=0x90;
   EA=0;
   delayms(20);                // disable interrupts

   ENABLE1=0;
   ENABLE2=0;
   ENABLE3=1;
   ENABLE4=1;
   ENABLE5=1;
   delayms(2);
   initLCDM();           //initial lcdm
   delayms(20);
  
  // TMOD = 0x20;
  // TH1  = 0xff-0x64;
   //TL1  = TH1;
  // TCON = 0x40;
   //ET1=1;
   //EA=1;
   //TR1=1;
while(1)
     {_nop_();_nop_();
     //ReadPortB();
     // CodeNum[0]=0xcf;        //
     // CodeNum[1]=0xC0;        //
     // CodeNum[2]=0xe9;        //
     // CodeNum[3]=0xC0;        //
     // CodeNum[4]=0x00;        //
     // TR1=0;

      _nop_();_nop_();
      _nop_();_nop_();
      ENABLE1=0;
      ENABLE2=0;
      ENABLE3=1;
      ENABLE4=1;
      ENABLE5=1;
      test();
      delayms(2);
      initLCDM();             //initial lcdm
      Debug();                //调试函数
      _nop_();_nop_();
      LedSegToNum();
      delayms(50);
      Display(Segvalue);
      delayms(50);
      _nop_();
      SdCmd(0x30);            // 8bit I/F, basic command, graphic off
      ClrScr();               // clr text screen
      delayms(1000);
      }
}
//end of program

    以上程序仿真可以通过运行,烧片后程序运行以下好象就死掉了,找了几天都没发现问题,程序是用KEIL C51编译的,采用伟福的仿真器仿真的,我先烧了一个简单的程序,检查电路板没什么问题,火快烧到眉毛了,第一次用C写的程序,以前用汇编从来没出过这种问题,大家帮我看看程序啊,谢谢了!
 
 

  
2楼:landysky 2006年6月11日09:35
 顶一 下
大家提提意见啊
  
3楼:戈卫东 2006年6月12日01:51
 太长了
会要人的命的

>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:哪位大侠知道这是什么芯片?

[下一篇主题]:招聘硬件工程师