找回密码
 立即注册
查看: 363|回复: 5

KEIL编译提示warning C188: 'parameter 1': value truncated

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2026-03-21 22:08:47
已绑定手机

6

主题

105

回帖

2264

积分

金牌会员

积分
2264
发表于 2025-12-20 12:29:13 | 显示全部楼层 |阅读模式
我用AI8051U-32Bit芯片指令,且头文件选择“AI8051U.H”编译时有些函数语句会始终提示

warning C188: 'parameter 1': value truncated,
但用STC89C52RC芯片指令,头文件选择“REG51.h”编译则一切正常。
附上出现该提示时的语句,麻烦各位大佬帮忙分析一下,看该如何操作才能避免这样子的错误警告。

//u8已经宏定义
#define  u8 unsigned char
#define  u16 unsigned int
#define  u32 unsigned int


提示框:
USER\oled.c(101): warning C188: 'parameter 1': value truncated

定位到的语句:
void OLED_Set_Pos(u8 x, u8 y)         //坐标设置
{
    x+=2;
    OLED_WR_Byte(0xb0+y,OLED_CMD);     <<<<<<这里就是定位到的出错语句
    OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
    OLED_WR_Byte((x&0x0f),OLED_CMD);
}  

和其相关的函数:
void OLED_WR_Byte(u8 dat,u8 cmd)    //写入函数
{   
    u8 i;              
    if(cmd)            //发送命令/数据
      OLED_DC_Set();    //发送数据
    else
      OLED_DC_Clr();    //发送指令      
    OLED_CS_Clr();        //片选选中状态
    for(i=0;i<8;i++)    //发送8位一字节的数据
    {              
        OLED_SCL_Clr();        //时钟线置0,准备写入数据
        if(dat&0x80)        //获得高位数据
        {
         OLED_SDA_Set();    //高位为1,数据线置1
        }
        else
        {
         OLED_SDA_Clr();    //高位不为1,数据线置0
        }
        OLED_SCL_Set();        //时钟线置1,写入数据
        dat<<=1;           //将数据左移至最高位
    }        



另外该程序一共出现了多处相同的警告,都是跟有运算的参数相关。最终也能正常下载运行
".\Objects\SPI-7-AI8051U-32Bit" - 0 Error(s), 9 Warning(s).

希望大家帮我解答下这个困惑的问题,谢谢


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:481
  • 最近打卡:2026-03-21 18:48:59
已绑定手机

104

主题

4193

回帖

9269

积分

荣誉版主

无情的代码机器

积分
9269
发表于 2025-12-20 13:14:07 | 显示全部楼层
OLED_CMD 应该是个超过u8位宽的定义所以告警?
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:252
  • 最近打卡:2026-03-19 10:28:30
已绑定手机

22

主题

627

回帖

2322

积分

金牌会员

积分
2322
发表于 2025-12-20 13:30:30 | 显示全部楼层
数据被截断了,OLED_CMD如果定义成了枚举,或是16位的
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:780
  • 最近打卡:2026-03-21 01:14:55

3

主题

104

回帖

2755

积分

金牌会员

积分
2755
发表于 2025-12-20 15:38:12 | 显示全部楼层
定义的变量存在超出范围的风险,改成16位就可以
void OLED_Set_Pos(u16 x, u16 y)         //坐标设置
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:178
  • 最近打卡:2026-03-22 02:05:49

25

主题

231

回帖

2059

积分

金牌会员

积分
2059
发表于 2025-12-20 16:34:58 | 显示全部楼层
void OLED_WR_Byte(u8 dat,u8 cmd)    //写入函数
函数定义 参数dat是u8类型。

调用是传入的是u16类型。
OLED_WR_Byte(0xb0+y,OLED_CMD);

0xb0+y默认是int类型。
如果确定不超范围的话,可以强制转换
OLED_WR_Byte((u8)0xb0+y,OLED_CMD);
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2026-03-21 22:08:47
已绑定手机

6

主题

105

回帖

2264

积分

金牌会员

积分
2264
发表于 2025-12-21 01:06:56 | 显示全部楼层
它提示的是参数1,也就是语句“OLED_WR_Byte(0xb0+y,OLED_CMD)”中的“0xb0+y”这个变量有问题,
我只能揣测它是担心数据计算后溢出而出现问题,因为定义的“y”是8位的,而“0xb0”也是8位,相加结果确实有超过256的可能。
如果真的这样,这软件设计还真挺贴心的。
最后我按照楼上hea老师的方法,强制转换成了u8,
弄成这样“OLED_WR_Byte((u8)(0xb0+y),OLED_CMD);”彻底没有提示了。
最后,谢谢老师们的热心帮助。
还有几天就要跨年2026了,希望大家撸起袖子加油干!收获满满,完美收官。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-22 03:28 , Processed in 0.119238 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表