欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3783|回復: 0
收起左側

分享在Keil C51中遇到的一個小bug的解決過程

[復制鏈接]
ID:100029 發表于 2015-12-22 18:55 | 顯示全部樓層 |閱讀模式
用Keil C51編寫一個遍歷LED多段數碼管的所有管腳的程序,想使用sprintf函數把實際運行時的數值顯示出來,結果遇到一個很奇怪的問題,就是顯示的數值并不是參數的實際數值。程序如下:

#include "stc15.h"
#include "stdio.h"

char myBuf[50];
void main(void)
{
    unsigned char i1,i2,i3;        //這個定義導致的sprintf出錯,并且移位操作也顯得異常。
    unsigned int tp;
   
    for (tp=0; tp<4096;tp++) {
        sprintf(myBuf, "nP=%#x:", tp);
        SendString(myBuf);     //通過串口把數值顯示出來。
       //P2.0-P2.4
        i1 = tp & 0x1F;
        P2 &= 0xE0;
        P2 |= i1;
        sprintf(myBuf, "P2=%#x:", i1);
        SendString(myBuf);

        //P4.5-P4.7
        P4 &= 0x1F;
        i2 = ((tp>>5) & 0x7)<<5;
        P4 |= i2;
        sprintf(myBuf, "P4=%#x: ", i2);
        SendString(myBuf);
      
        //P3.4-P3.7   
        P3 &= 0x0F;
        i3 = (tp>>8)<<4;
        P3 |= i3;
        sprintf(myBuf, "P3=%#x\r\n", i3);
        SendString(myBuf);
      
        delay(4000);
    }
}
以上的運行結果,nP, P2,P3,P4都是0xFFFF類似的格式,而不是所期望的0xFF。如下所示:
Test Uart at 115200.
nP=0x0:P2=0x0:P4=0x0: P3=0x0
nP=0x1:P2=0x101:P4=0x1: P3=0x1
nP=0x2:P2=0x202:P4=0x2: P3=0x2
nP=0x3:P2=0x303:P4=0x3: P3=0x3
nP=0x4:P2=0x404:P4=0x4: P3=0x4
nP=0x5:P2=0x505:P4=0x5: P3=0x5
......
......
nP=0x1d7:P2=0x17d7:P4=0x6d7: P3=0x1d7
nP=0x1d8:P2=0x18d8:P4=0x6d8: P3=0x1d8
nP=0x1d9:P2=0x19d9:P4=0x6d9: P3=0x1d9
nP=0x1da:P2=0x1ada:P4=0x6da: P3=0x1da
nP=0x1db:P2=0x1bdb:P4=0x6db: P3=0x1db
這個問題折騰了將近1天的時間,最后發現把i1,i2,i3的定義由unsigned char修改為unsigned int,這個問題就消失了。究其原因,是因為sprintf函數中的x變量是整數型的,在C51中把unsigned char變量發送時,就出現了錯誤。

具體原因不清楚,算不算Keil C51編譯器的Bug呢?這里用的是Keil C51 9.54a。


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表