xupota 发表于 2024-10-9 22:52:47

用软件模拟I2C没问题,但用中断来做,会提示 different return types



用软件模拟I2C驱动OLED没有问题,但为什么换成中断后,会提示different return types。

主要是提示错误的这两个地方在用软件模拟时,没有任何问题。

而且中断服务程序是手册上的,理应不会有错的吧。 能帮忙看看吗?谢谢!


void OLED_ShowChar(u8 x,u8 y,u8 ch,u8 size)
{
        unsigned char c=0,i=0;
        c = ch - ' ';        //获取字符的偏移量
        if(x+size/2>127){x = 0; y = y+2;}//这里是判断x位置是否已经超过显示宽度,如果超过就到2页后
       
        if(size == 8)//判断是8*6的字符
        {
                OLED_Set_Pos(x,y);//设置开始位置为x,y(第一页)
                for(i=0;i<6;i++)//循环6个列数据,因为只需要一页,所以写完一页即可
                {
                        OLED_WR_Byte(F6X8,OLED_DATA);
                }
        }
        if(size == 16)//判断是16*8的字符
        {
                OLED_Set_Pos(x,y);//设置开始位置为x,y(第一页)
                for(i=0;i<8;i++)//循环8个列数据
                {
                        OLED_WR_Byte(F8X16,OLED_DATA);//这里的C是偏移量,然后c*16是为了在数组里找到我们要的字符,i是数组第0-7的数据
                }
                        OLED_Set_Pos(x,y+1);        //因为这里的16*8的字符需要2页,设置第二页为开始位置
                for(i=0;i<8;i++)//这里是第二页的列数据循环
                {
                        OLED_WR_Byte(F8X16,OLED_DATA);//这里出现了+8是因为我们数组的第8-15个数据
                }
        }
}




void I2C_sendData(u8 dat)
{
        I2CTXD = dat;                                //数据放入发送寄存器
        I2C_busy =1;
        I2CMSCR=0x82;                                //允许主机中断,且向I2CMSCR请求(0010)发送数据命令
        while(I2C_busy);
       
}





void OLED_WR_Byte(u8 dat,u8 cmd)
{
        I2C_Start();
        I2C_sendData(0x78);
        I2C_ACK();
        if(cmd)
                I2C_sendData(0x40);
        else
                I2C_sendData(0x00);
        I2C_ACK();
        I2C_sendData(dat);
        I2C_ACK();
        I2C_Stop();
}

jkernet 发表于 2024-10-10 00:29:24

报错截图上面不是说了,你声明的是int OLED_ShowChar,实现确是void OLED_ShowChar,返回值类型不一致.

DebugLab 发表于 2024-10-10 08:14:39

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4612
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4613
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4698
3个硬件I2C程序,测试OK,供参考

21cnsound 发表于 2024-10-10 09:19:43

jkernet 发表于 2024-10-10 00:29
报错截图上面不是说了,你声明的是int OLED_ShowChar,实现确是void OLED_ShowChar,返回值类型不一致. ...

应该是这个问题,声明的和定义的函数返回类型不一致。

soma 发表于 2024-10-10 12:44:40

应该是形参输入错误造成的吧!
页: [1]
查看完整版本: 用软件模拟I2C没问题,但用中断来做,会提示 different return types