标题: C语言函数带入参数运行不正常请各位指点[已解决] [打印本页]

作者: wannenggong    时间: 2024-8-9 20:53
标题: C语言函数带入参数运行不正常请各位指点[已解决]
这两天调试一个函数,总是不能达成控制目的而编译结果为无错误、无警告,最后发现是变量带参运算不正常搞得一头雾水,以前没碰到这种情况诚请高手指点一下,先谢了!(单片机为STC8H8K64U,编译环境为keil uv3或keil uv5)
引用的显示定位函数如下:
  1. //----局部显示定位函数-------------------------------------------------
  2. void EPD_Display_locate(u16 x0, u16 x1, u16 y0, u16 y1)
  3. {
  4.     SendCommand(0x91);
  5.     SendCommand(0x90);

  6.     SendData(x0);   //x-start
  7.     SendData(x1 - 1); //x-end

  8.     SendData(y0/256); //取得y0的第9位数据
  9.     SendData(y0%256); //取得y0的低8位数据

  10.     SendData(y1/256);
  11.     SendData(y1%256-1); //y-end
  12.     SendData(0x01);
  13. }
复制代码

在调试的显示应用函数如下:
  1. //----显示一位数字函数-----------------------------------------------
  2. //在x0、y0起始的位置位置显示字宽hi/2高hi的字符
  3. void EPD_Display_num(u16 x0, u16 y0, u8 hi,u8 dat)
  4. {
  5.         u16 i,size;

  6.     EPD_Display_locate(x0, (x0+hi), y0, (y0+(hi/2)));
  7.                 size = hi * hi / 16; //字模点阵数据数量(高*宽/8)
  8.     SendCommand(0x10);
  9.     for(i = 0; i < size; i++)
  10.     {
  11.       SendData(0x00);
  12.     }
  13.     SendCommand(0x13);
  14.     for(i = 0; i < size; i++)
  15.     {
  16.       SendData(shu[size*dat+i]);
  17.     }

  18.     SendCommand(0x12);                     
  19.     delay_ms(1);        
  20.     read_BUSY();

  21. }
复制代码

在主函数中如下运行结果是显示屏没有反应:
void main()
{
*****
*****
EPD_init_LUT();
EPD_Display_num(32,100,64,2);//在32行100列处显示2
while(1);
}

如果把所有带参变量都赋值带入则在主函数中如下运行就会显示正常了:
为清楚的说明问题我把整个函数贴在主函数中试运行,其实如果将显示函数EPD_Display_num()中的变量全部赋值后在主函数中带入显示函数也可以正常显示的。
void main()
{
*****
*****
EPD_init_LUT();
    EPD_Display_locate(32, 96, 100, 132);         
    SendCommand(0x10);
    for(i = 0; i < 256; i++)        
    {
      SendData(0x00);
    }
    SendCommand(0x13);
    for(i = 0; i < 256; i++)
    {
      SendData(shu[512+i]);//显示2
    }
    SendCommand(0x12);                     
    delay_ms(1);        
    read_BUSY();
while(1);
}




作者: lkc8210    时间: 2024-8-10 17:37


作者: ppcbug    时间: 2024-8-10 22:48
是不是 函数 在外 而 没有声明?
KEIL  和 IAR  好像 函数不声明 是 有一定比例 会出问题的。

检查一下 , 是否  有  【函数未声明】 的警告。
鉴于可能导致运行错误, 我觉得应该改成 【错误】而不是警告。
作者: 188610329    时间: 2024-8-11 01:24
void EPD_Display_num(u16 x0, u16 y0, u8 hi,u8 dat)

=>

void EPD_Display_num(u16 x0, u16 y0, u16 hi,u8 dat)

试试
作者: wannenggong    时间: 2024-8-11 20:27
ppcbug 发表于 2024-8-10 22:48
是不是 函数 在外 而 没有声明?
KEIL  和 IAR  好像 函数不声明 是 有一定比例 会出问题的。

你好,并没有“函数未声明”的警告,我只会编写一些简单的程序,一般需要调试的函数以及需要调用的函数我都是按顺序先写到主函数的前面,所以不存在函数声明问题。
作者: wannenggong    时间: 2024-8-11 20:32
188610329 发表于 2024-8-11 01:24
void EPD_Display_num(u16 x0, u16 y0, u8 hi,u8 dat)

=>

多谢指点,我改过后也没作用,而实际使用时hi最大值也不超过64,而涉及到hi计算时也有变量u16 size变量参与应该也不能超值。
作者: wannenggong    时间: 2024-8-11 20:37
ppcbug 发表于 2024-8-10 22:48
是不是 函数 在外 而 没有声明?
KEIL  和 IAR  好像 函数不声明 是 有一定比例 会出问题的。



作者: xrba    时间: 2024-8-12 10:28
还真没有发现问题在哪儿,最可能的原因是 size 值不对。
1、可否跟踪一下,查查size,或者打印一个日志。
2、size = hi * hi / 16; //字模点阵数据数量(高*宽/8)
把这句修改一下
size = hi / 16 * hi; //字模点阵数据数量(高*宽/8)
这样试试
作者: wannenggong    时间: 2024-8-12 18:04
xrba 发表于 2024-8-12 10:28
还真没有发现问题在哪儿,最可能的原因是 size 值不对。
1、可否跟踪一下,查查size,或者打印一个日志。
...

多谢,我今天又弄了好久仍然没找到原因,问题应该不是出在size这个变量,在我的测试中hi=64是固定值,我将size置换成256仍然无果,另外程序调试过程中也能看到这个变量的运算结果为0x100(=256)。
作者: wannenggong    时间: 2024-8-12 18:19
因为我玩电子价签墨水屏时能够找到的例程都是arduino-esp8266的和stm32的而我比较容易上手的就是esp8266模块,几乎都是用arduino代码实现了刷屏操作后就移植初始化代码到stc51单片机中再深入玩耍,碰到了眼下的问题后,今天我再次连接了esp8266模块并将这两个函数贴到了arduino上编译烧录后发现显示非常顺利毫无问题,以前我也经常在arduino上写一些简单的c函数,有时也复制arduino上的c函数到keil3中编译应用,也重来没出现过问题,而此次是经过反向验证应该说明函数真的没毛病了,那么,问题在哪里呢?我也重新安装了keil3软件,这是玩了很多年51单片机第一次遇到的久拖不决的问题,真的百思不得其解。
作者: wannenggong    时间: 2024-8-12 21:50
问题已经解决了,感谢楼上各位的指点与参与,虽然问题已经解决、程序运行没也问题了但问题的出现原因我也说不清楚,问题就是多引用了一个数组数据的.h文件造成的,注释掉这个文件就一切正常了。程序初期调试时曾经引用了一个数组文件:#include"Ap_29demo.h",后来重新编写了这个写字符的函数时为了调方便就把新做的点阵数据数组直接贴在了程序的上方,准备等函数调试通过后再重新修改整理这个Ap_29demo.h文件,另外因为用到的底层函数少工程还没有分模块,只是一个含有主函数的工程文件,原以为后做的数组名称与Ap_29demo.h中的数组文件不同名称应该不会有问题,但不知道啥原因就偏偏在这里翻车了,貌似只有在主函数中调用数组数据时才会找到主文件中的数组文件,但我却真的不知道为什么会这样,也请各位赐教。









欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1