这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » C51 关于C51的一个难题,请大虾指点一二

共2条 1/1 1 跳转至

C51 关于C51的一个难题,请大虾指点一二

院士
2006-09-17 18:14:16     打赏
C51 关于C51的一个难题,请大虾指点一二



关键词: 关于     一个     难题     大虾     指点     一二    

院士
2006-12-22 22:43:00     打赏
2楼
问 各位兄弟,你们有没有碰过这样的问题:在C51里边不同地方调用同一函数,结果不一样,我这里指的结果是有时会出错有时不会出错,所传递的参数是没有错的,如下面函数是将数值转换成字符串,就出现这样的问题
void IntToString(char *Str,unsigned long iData,unsigned char iBits)
{    unsigned char  iTemp;
    unsigned char  temp_bit;
          unsigned char  i;
          unsigned long temp_data;
         temp_bit = iBits;
         temp_data = iData;
    
    for( i = temp_bit-1; i >= 0; i-- )
    {         iTemp = (char)( temp_data % 10 );
        Str[i] = iTemp+'0';
        temp_data = temp_data/10;
        
        if( i == 0 )
        break;
        
    }
    Str[temp_bit]='\0';
}

在连续多次调用(传递参数正确)情况下有时会出现这样的情况,程序跑飞到以下这段代码中,并且跳不出来。
                 C?ULDIV:
C:0x04C1    B800C1   CJNE     R0,#0x00,C:0485
C:0x04C4    B90059   CJNE     R1,#0x00,C:0520
C:0x04C7    BA002D   CJNE     R2,#0x00,C:04F7
C:0x04CA    EC       MOV      A,R4
C:0x04CB    8BF0     MOV      B(0xF0),R3
C:0x04CD    84       DIV      AB
C:0x04CE    CF       XCH      A,R7
C:0x04CF    CE       XCH      A,R6
C:0x04D0    CD       XCH      A,R5
C:0x04D1    FC       MOV      R4,A
C:0x04D2    E5F0     MOV      A,B(0xF0)
C:0x04D4    CB       XCH      A,R3
C:0x04D5    F9       MOV      R1,A
C:0x04D6    7818     MOV      R0,#0x18
C:0x04D8    EF       MOV      A,R7
C:0x04D9    2F       ADD      A,R7
C:0x04DA    FF       MOV      R7,A
C:0x04DB    EE       MOV      A,R6
C:0x04DC    33       RLC      A
C:0x04DD    FE       MOV      R6,A
C:0x04DE    ED       MOV      A,R5
C:0x04DF    33       RLC      A
C:0x04E0    FD       MOV      R5,A
C:0x04E1    EC       MOV      A,R4
C:0x04E2    33       RLC      A
C:0x04E3    FC       MOV      R4,A
C:0x04E4    EB       MOV      A,R3
C:0x04E5    33       RLC      A
C:0x04E6    FB       MOV      R3,A
C:0x04E7    10D703   JBC      CY(0xD0.7),C:04ED
C:0x04EA    99       SUBB     A,R1
C:0x04EB    4004     JC       C:04F1
C:0x04ED    EB       MOV      A,R3
C:0x04EE    99       SUBB     A,R1
C:0x04EF    FB       MOV      R3,A
C:0x04F0    0F       INC      R7
C:0x04F1    D8E5     DJNZ     R0,C:04D8
C:0x04F3    E4       CLR      A
C:0x04F4    F9       MOV      R1,A
C:0x04F5    FA       MOV      R2,A
C:0x04F6    22       RET      

不知道是不是KEILC51的库函数有问题,我用的是
c51.exe     v7.00
a51.exe     v7.00a

不知各有兄弟有何高见,请指教!谢谢 1: 真的有意思啊,不知道你怎么想的啊for( i = temp_bit-1; i >= 0; i-- )

你这个循环可以把51的(iBits-1)~0x00的RAM(包括堆栈指针,R0~R7等)全部修改,不乱套才怪呢
2: 谢谢xwj胡提醒,你真是一语中的啊,我将for()改了一下就行了

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]