打印

大侠帮我看看我的程序哪错了啊?

[复制链接]
1662|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
发霉的味道|  楼主 | 2007-3-20 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, AC, ck, sd, se
#include "IO.H"

/* #define  WRITE  0xA0  ; */

/* #define  READ   0xA1  ; */

/* **************************/
void delay ( unsigned int timeM )

{  unsigned  int  con1;

         TH0  = 0x06 ;

         TL0  = 0x06 ;

         TMOD = 0x02 ;

            TF0  = 0 ;

            TR0  = 1 ;

   for ( ; timeM > 0 ; timeM-- )

       { for ( con1=4 ; con1>0 ; )

              if ( TF0 ) {   con1-- ;

                            TF0 = 0; 

                          }

        }

}


/* I2C Start */

void startI2C ( void )

{    SDAT = 1 ,SCLK = 1 ;

     someNOP()  ;

     SDAT = 0   ;

     someNOP()  ;

     SCLK = 0   ;

     return ;
}

/*    stop          */

void stopI2C ( void )

{    SDAT = 0  ,SCLK = 1 ;

     someNOP()   ;

     SDAT = 1    ;

     someNOP()   ;

     return  ;

}

/*    answer  */

void ackI2C ( bit answer)

{   if ( answer == 0 )  SDAT = 0  ;

    else   SDAT = 1   ;

    SCLK =  1    ;
     
    someNOP()    ;
    
    SCLK = 0     ;
         
   return    ;

}

/*   test ack */

bit testack ( void ) 

{      bit ack  ;

    SDAT = 1 ;

    SCLK = 1  ;

    _nop_()  ;

    _nop_()  ;

    if ( SDAT == 1 )  ack = 0 ;

    else  ack = 1  ;

    SCLK = 0  ;

    _nop_()  ;

    _nop_()  ;

   return ( ack ) ;

 }

/*  send byte */

void senddata ( unsigned char sdata )

{  unsigned char bitcount ;
   
   for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ )
       
       {     if ( sdata << bitcount & 0x80 )  SDAT = 1  ;
           
            else  SDAT = 0  ;

            SCLK = 1  ;

            someNOP() ;

            SCLK = 0  ;

        }

    return  ;

}

/*  receive byte  */

unsigned char receivedata ()

{   unsigned char bitcount , rdata = 0 ;

    for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ )
        
        {    SCLK = 0  ;
            
            someNOP() ;

            SCLK = 1  ;

            _nop_() ;

            _nop_() ;

            if ( SDAT == 1 ) rdata = ( rdata << 1 ) + 1  ;

            else  rdata <<= 1  ;

            _nop_() ;

            _nop_() ;

            SCLK = 0  ;

         }

     return ( ( unsigned char ) rdata ) ;

 }

 /*   read data  */

void  Rreceivedata ( unsigned char headadd , unsigned char N , unsigned char *buf )

{   startI2C () ;

    senddata ( 0xa0 ) ;

    testack () ;
    
    senddata ( headadd ) ;

    testack ()  ;

    startI2C () ;

    senddata ( 0xa1 ) ;

    testack () ;

    for (  ;  N != 0 ; N -- )
        
        {  *buf = receivedata () ;

           buf ++  ;

           ackI2C ( 0 ) ;

         }

    ackI2C ( 1 ) ;

    stopI2C () ;

    return   ;
         
 }

/*   write data */

void  Wsenddata ( unsigned char headadd , unsigned char N , unsigned char *buf )
  
{   startI2C () ;

    senddata ( 0xa0 ) ;

    testack () ;

    senddata ( headadd ) ;

    testack () ;

    for (  ; N != 0 ; N ++ )
        
        {   senddata ( *buf ) ;

            while ( testack () == 0 )

                  {      ;
                   
                   }

            buf ++   ;

         }

     stopI2C ()  ;

     delay ( 10 )  ;

     return  ;

 }                   

相关帖子

沙发
发霉的味道|  楼主 | 2007-3-20 16:45 | 只看该作者

!!!

void  Wsenddata ( unsigned char headadd , unsigned char N , unsigned char *buf )
  
{   startI2C () ;

    senddata ( 0xa0 ) ;


void  Rreceivedata ( unsigned char headadd , unsigned char N , unsigned char *buf )

{   startI2C () ;

    senddata ( 0xa0 ) ;
这几句不知道为什么总是无法编译,其它语句却可以正常编译.真急死我了.

使用特权

评论回复
板凳
taoest| | 2007-3-21 00:02 | 只看该作者

出错信息呢?

出错信息呢?

使用特权

评论回复
地板
turmary| | 2007-3-21 05:09 | 只看该作者

试试这个


#include "AtmelAT89X52.H"
#include "INTRINS.H"


#define someNOP() _nop_(); 
    _nop_()
#define SDAT P2_0
#define SCLK P2_1
/* #define  WRITE  0xA0  ; */
/* #define  READ   0xA1  ; */
/* **************************/
void delay(unsigned int timeM)
{
    unsigned int con1;
    TH0 = 0x06;
    TL0 = 0x06;
    TMOD = 0x02;
    TF0 = 0;
    TR0 = 1;
    for (; timeM > 0; timeM--) {
        for (con1 = 4; con1 > 0;)
            if (TF0) {
                con1--;
                TF0 = 0;
            }
    }
}

/* I2C Start */
void startI2C(void)
{
    SDAT = 1, SCLK = 1;
    someNOP();
    SDAT = 0;
    someNOP();
    SCLK = 0;
    return;
}

/*    stop          */
void stopI2C(void)
{
    SDAT = 0, SCLK = 1;
    someNOP();
    SDAT = 1;
    someNOP();
    return;
}

/*    answer  */
void ackI2C(bit answer)
{
    if (answer == 0)
        SDAT = 0;
    else
        SDAT = 1;
    SCLK = 1;

    someNOP();

    SCLK = 0;

    return;
}

/*   test ack */
bit testack(void)
{
    bit ack;
    SDAT = 1;
    SCLK = 1;
    _nop_();
    _nop_();
    if (SDAT == 1)
        ack = 0;
    else
        ack = 1;
    SCLK = 0;
    _nop_();
    _nop_();
    return (ack);
}

/*  send byte */
void senddata(unsigned char sdata)
{
    unsigned char bitcount;

    for (bitcount = 0; bitcount < 8; bitcount++)
     {
        if (sdata << bitcount & 0x80)
            SDAT = 1;

        else
            SDAT = 0;
        SCLK = 1;
        someNOP();
        SCLK = 0;
    }
    return;
}

/*  receive byte  */
unsigned char receivedata()
{
    unsigned char bitcount, rdata = 0;
    for (bitcount = 0; bitcount < 8; bitcount++)
     {
        SCLK = 0;

        someNOP();
        SCLK = 1;
        _nop_();
        _nop_();
        if (SDAT == 1)
            rdata = (rdata << 1) + 1;
        else
            rdata <<= 1;
        _nop_();
        _nop_();
        SCLK = 0;
    }
    return ((unsigned char) rdata);
}

/*   read data  */
void Rreceivedata(unsigned char headadd, unsigned char N,
          unsigned char *buf)
{
    startI2C();
    senddata(0xa0);
    testack();

    senddata(headadd);
    testack();
    startI2C();
    senddata(0xa1);
    testack();
    for (; N != 0; N--)
     {
        *buf = receivedata();
        buf++;
        ackI2C(0);
    }
    ackI2C(1);
    stopI2C();
    return;

}

/*   write data */
void Wsenddata(unsigned char headadd, unsigned char N, unsigned char *buf)
 {
    startI2C();
    senddata(0xa0);
    testack();
    senddata(headadd);
    testack();
    for (; N != 0; N++)
     {
        senddata(*buf);
        while (testack() == 0) {;

        }
        buf++;
    }
    stopI2C();
    delay(10);
    return;
}

使用特权

评论回复
5
发霉的味道|  楼主 | 2007-3-21 08:53 | 只看该作者

不是啊

我的这些IO口已经定义了,在IO.H中,我一直想不明白编译不出错,但是跟踪时,总是不能跟到
void  Wsenddata ( unsigned char headadd , unsigned char N , unsigned char *buf )
  
{   startI2C () ;             无法设断点

    senddata ( 0xa0 ) ;       无法设断点


void  Rreceivedata ( unsigned char headadd , unsigned char N , unsigned char *buf )

{   startI2C () ;             无法设断点

    senddata ( 0xa0 ) ;       无法设断点

这两个函数是进行8个字节连续操作的,其他语句可以正常断点,就是这开头两行,跟不了,试了重写了函数单字节操作没有问题,为什么连续操作就不行呢?

使用特权

评论回复
6
发霉的味道|  楼主 | 2007-3-21 12:33 | 只看该作者

!!

我自己顶高点!!

使用特权

评论回复
7
rainbowwrh| | 2007-3-21 12:43 | 只看该作者

无法设断点??

无法设断点???
可能这两句不是有效的语句, 所以编译器不允许在无效的语句(如注释, 空白的地方)设断点的. 仔细看看是不是其他地方出错了.

使用特权

评论回复
8
nust1996| | 2007-3-21 14:17 | 只看该作者

无法设断点??

无法设断点??
是因为被优化了,如果程序有错,你就把错误信息发出来啊

使用特权

评论回复
9
发霉的味道|  楼主 | 2007-3-21 14:36 | 只看该作者

!!!

没有出错信息啊,也没有提示出错.

使用特权

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

本版积分规则

7

主题

58

帖子

0

粉丝