標(biāo)題: C語言函數(shù)帶入?yún)?shù)運(yùn)行不正常請(qǐng)各位指點(diǎn)[已解決] [打印本頁(yè)]

作者: wannenggong    時(shí)間: 2024-8-9 20:53
標(biāo)題: C語言函數(shù)帶入?yún)?shù)運(yùn)行不正常請(qǐng)各位指點(diǎn)[已解決]
這兩天調(diào)試一個(gè)函數(shù),總是不能達(dá)成控制目的而編譯結(jié)果為無錯(cuò)誤、無警告,最后發(fā)現(xiàn)是變量帶參運(yùn)算不正常搞得一頭霧水,以前沒碰到這種情況誠(chéng)請(qǐng)高手指點(diǎn)一下,先謝了!(單片機(jī)為STC8H8K64U,編譯環(huán)境為keil uv3或keil uv5)
引用的顯示定位函數(shù)如下:
  1. //----局部顯示定位函數(shù)-------------------------------------------------
  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位數(shù)據(jù)
  9.     SendData(y0%256); //取得y0的低8位數(shù)據(jù)

  10.     SendData(y1/256);
  11.     SendData(y1%256-1); //y-end
  12.     SendData(0x01);
  13. }
復(fù)制代碼

在調(diào)試的顯示應(yīng)用函數(shù)如下:
  1. //----顯示一位數(shù)字函數(shù)-----------------------------------------------
  2. //在x0、y0起始的位置位置顯示字寬hi/2高h(yuǎn)i的字符
  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; //字模點(diǎn)陣數(shù)據(jù)數(shù)量(高*寬/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. }
復(fù)制代碼

在主函數(shù)中如下運(yùn)行結(jié)果是顯示屏沒有反應(yīng):
void main()
{
*****
*****
EPD_init_LUT();
EPD_Display_num(32,100,64,2);//在32行100列處顯示2
while(1);
}

如果把所有帶參變量都賦值帶入則在主函數(shù)中如下運(yùn)行就會(huì)顯示正常了:
為清楚的說明問題我把整個(gè)函數(shù)貼在主函數(shù)中試運(yùn)行,其實(shí)如果將顯示函數(shù)EPD_Display_num()中的變量全部賦值后在主函數(shù)中帶入顯示函數(shù)也可以正常顯示的。
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    時(shí)間: 2024-8-10 17:37


作者: ppcbug    時(shí)間: 2024-8-10 22:48
是不是 函數(shù) 在外 而 沒有聲明?
KEIL  和 IAR  好像 函數(shù)不聲明 是 有一定比例 會(huì)出問題的。

檢查一下 , 是否  有  【函數(shù)未聲明】 的警告。
鑒于可能導(dǎo)致運(yùn)行錯(cuò)誤, 我覺得應(yīng)該改成 【錯(cuò)誤】而不是警告。
作者: 188610329    時(shí)間: 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    時(shí)間: 2024-8-11 20:27
ppcbug 發(fā)表于 2024-8-10 22:48
是不是 函數(shù) 在外 而 沒有聲明?
KEIL  和 IAR  好像 函數(shù)不聲明 是 有一定比例 會(huì)出問題的。

你好,并沒有“函數(shù)未聲明”的警告,我只會(huì)編寫一些簡(jiǎn)單的程序,一般需要調(diào)試的函數(shù)以及需要調(diào)用的函數(shù)我都是按順序先寫到主函數(shù)的前面,所以不存在函數(shù)聲明問題。
作者: wannenggong    時(shí)間: 2024-8-11 20:32
188610329 發(fā)表于 2024-8-11 01:24
void EPD_Display_num(u16 x0, u16 y0, u8 hi,u8 dat)

=>

多謝指點(diǎn),我改過后也沒作用,而實(shí)際使用時(shí)hi最大值也不超過64,而涉及到hi計(jì)算時(shí)也有變量u16 size變量參與應(yīng)該也不能超值。
作者: wannenggong    時(shí)間: 2024-8-11 20:37
ppcbug 發(fā)表于 2024-8-10 22:48
是不是 函數(shù) 在外 而 沒有聲明?
KEIL  和 IAR  好像 函數(shù)不聲明 是 有一定比例 會(huì)出問題的。



作者: xrba    時(shí)間: 2024-8-12 10:28
還真沒有發(fā)現(xiàn)問題在哪兒,最可能的原因是 size 值不對(duì)。
1、可否跟蹤一下,查查size,或者打印一個(gè)日志。
2、size = hi * hi / 16; //字模點(diǎn)陣數(shù)據(jù)數(shù)量(高*寬/8)
把這句修改一下
size = hi / 16 * hi; //字模點(diǎn)陣數(shù)據(jù)數(shù)量(高*寬/8)
這樣試試
作者: wannenggong    時(shí)間: 2024-8-12 18:04
xrba 發(fā)表于 2024-8-12 10:28
還真沒有發(fā)現(xiàn)問題在哪兒,最可能的原因是 size 值不對(duì)。
1、可否跟蹤一下,查查size,或者打印一個(gè)日志。
...

多謝,我今天又弄了好久仍然沒找到原因,問題應(yīng)該不是出在size這個(gè)變量,在我的測(cè)試中hi=64是固定值,我將size置換成256仍然無果,另外程序調(diào)試過程中也能看到這個(gè)變量的運(yùn)算結(jié)果為0x100(=256)。
作者: wannenggong    時(shí)間: 2024-8-12 18:19
因?yàn)槲彝骐娮觾r(jià)簽?zāi)習(xí)r能夠找到的例程都是arduino-esp8266的和stm32的而我比較容易上手的就是esp8266模塊,幾乎都是用arduino代碼實(shí)現(xiàn)了刷屏操作后就移植初始化代碼到stc51單片機(jī)中再深入玩耍,碰到了眼下的問題后,今天我再次連接了esp8266模塊并將這兩個(gè)函數(shù)貼到了arduino上編譯燒錄后發(fā)現(xiàn)顯示非常順利毫無問題,以前我也經(jīng)常在arduino上寫一些簡(jiǎn)單的c函數(shù),有時(shí)也復(fù)制arduino上的c函數(shù)到keil3中編譯應(yīng)用,也重來沒出現(xiàn)過問題,而此次是經(jīng)過反向驗(yàn)證應(yīng)該說明函數(shù)真的沒毛病了,那么,問題在哪里呢?我也重新安裝了keil3軟件,這是玩了很多年51單片機(jī)第一次遇到的久拖不決的問題,真的百思不得其解。
作者: wannenggong    時(shí)間: 2024-8-12 21:50
問題已經(jīng)解決了,感謝樓上各位的指點(diǎn)與參與,雖然問題已經(jīng)解決、程序運(yùn)行沒也問題了但問題的出現(xiàn)原因我也說不清楚,問題就是多引用了一個(gè)數(shù)組數(shù)據(jù)的.h文件造成的,注釋掉這個(gè)文件就一切正常了。程序初期調(diào)試時(shí)曾經(jīng)引用了一個(gè)數(shù)組文件:#include"Ap_29demo.h",后來重新編寫了這個(gè)寫字符的函數(shù)時(shí)為了調(diào)方便就把新做的點(diǎn)陣數(shù)據(jù)數(shù)組直接貼在了程序的上方,準(zhǔn)備等函數(shù)調(diào)試通過后再重新修改整理這個(gè)Ap_29demo.h文件,另外因?yàn)橛玫降牡讓雍瘮?shù)少工程還沒有分模塊,只是一個(gè)含有主函數(shù)的工程文件,原以為后做的數(shù)組名稱與Ap_29demo.h中的數(shù)組文件不同名稱應(yīng)該不會(huì)有問題,但不知道啥原因就偏偏在這里翻車了,貌似只有在主函數(shù)中調(diào)用數(shù)組數(shù)據(jù)時(shí)才會(huì)找到主文件中的數(shù)組文件,但我卻真的不知道為什么會(huì)這樣,也請(qǐng)各位賜教。









歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1