用软件模拟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();
}
报错截图上面不是说了,你声明的是int OLED_ShowChar,实现确是void OLED_ShowChar,返回值类型不一致. 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,供参考 jkernet 发表于 2024-10-10 00:29
报错截图上面不是说了,你声明的是int OLED_ShowChar,实现确是void OLED_ShowChar,返回值类型不一致. ...
应该是这个问题,声明的和定义的函数返回类型不一致。 应该是形参输入错误造成的吧!
页:
[1]