找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1559|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

C語(yǔ)言函數(shù)帶入?yún)?shù)運(yùn)行不正常請(qǐng)各位指點(diǎn)[已解決]

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這兩天調(diào)試一個(gè)函數(shù),總是不能達(dá)成控制目的而編譯結(jié)果為無(wú)錯(cuò)誤、無(wú)警告,最后發(fā)現(xiàn)是變量帶參運(yùn)算不正常搞得一頭霧水,以前沒(méi)碰到這種情況誠(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é)果是顯示屏沒(méi)有反應(yīng):
void main()
{
*****
*****
EPD_init_LUT();
EPD_Display_num(32,100,64,2);//在32行100列處顯示2
while(1);
}

如果把所有帶參變量都賦值帶入則在主函數(shù)中如下運(yùn)行就會(huì)顯示正常了:
為清楚的說(shuō)明問(wèn)題我把整個(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);
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2024-8-10 17:37 | 只看該作者

回復(fù)

使用道具 舉報(bào)

板凳
ID:628113 發(fā)表于 2024-8-10 22:48 | 只看該作者
是不是 函數(shù) 在外 而 沒(méi)有聲明?
KEIL  和 IAR  好像 函數(shù)不聲明 是 有一定比例 會(huì)出問(wèn)題的。

檢查一下 , 是否  有  【函數(shù)未聲明】 的警告。
鑒于可能導(dǎo)致運(yùn)行錯(cuò)誤, 我覺(jué)得應(yīng)該改成 【錯(cuò)誤】而不是警告。
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 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)

試試
回復(fù)

使用道具 舉報(bào)

5#
ID:281828 發(fā)表于 2024-8-11 20:27 | 只看該作者
ppcbug 發(fā)表于 2024-8-10 22:48
是不是 函數(shù) 在外 而 沒(méi)有聲明?
KEIL  和 IAR  好像 函數(shù)不聲明 是 有一定比例 會(huì)出問(wèn)題的。

你好,并沒(méi)有“函數(shù)未聲明”的警告,我只會(huì)編寫(xiě)一些簡(jiǎn)單的程序,一般需要調(diào)試的函數(shù)以及需要調(diào)用的函數(shù)我都是按順序先寫(xiě)到主函數(shù)的前面,所以不存在函數(shù)聲明問(wèn)題。
回復(fù)

使用道具 舉報(bào)

6#
ID:281828 發(fā)表于 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),我改過(guò)后也沒(méi)作用,而實(shí)際使用時(shí)hi最大值也不超過(guò)64,而涉及到hi計(jì)算時(shí)也有變量u16 size變量參與應(yīng)該也不能超值。
回復(fù)

使用道具 舉報(bào)

7#
ID:281828 發(fā)表于 2024-8-11 20:37 | 只看該作者
ppcbug 發(fā)表于 2024-8-10 22:48
是不是 函數(shù) 在外 而 沒(méi)有聲明?
KEIL  和 IAR  好像 函數(shù)不聲明 是 有一定比例 會(huì)出問(wèn)題的。


回復(fù)

使用道具 舉報(bào)

8#
ID:1130414 發(fā)表于 2024-8-12 10:28 | 只看該作者
還真沒(méi)有發(fā)現(xiàn)問(wè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)
這樣試試
回復(fù)

使用道具 舉報(bào)

9#
ID:281828 發(fā)表于 2024-8-12 18:04 | 只看該作者
xrba 發(fā)表于 2024-8-12 10:28
還真沒(méi)有發(fā)現(xiàn)問(wèn)題在哪兒,最可能的原因是 size 值不對(duì)。
1、可否跟蹤一下,查查size,或者打印一個(gè)日志。
...

多謝,我今天又弄了好久仍然沒(méi)找到原因,問(wèn)題應(yīng)該不是出在size這個(gè)變量,在我的測(cè)試中hi=64是固定值,我將size置換成256仍然無(wú)果,另外程序調(diào)試過(guò)程中也能看到這個(gè)變量的運(yùn)算結(jié)果為0x100(=256)。
回復(fù)

使用道具 舉報(bào)

10#
ID:281828 發(fā)表于 2024-8-12 18:19 | 只看該作者
因?yàn)槲彝骐娮觾r(jià)簽?zāi)習(xí)r能夠找到的例程都是arduino-esp8266的和stm32的而我比較容易上手的就是esp8266模塊,幾乎都是用arduino代碼實(shí)現(xiàn)了刷屏操作后就移植初始化代碼到stc51單片機(jī)中再深入玩耍,碰到了眼下的問(wèn)題后,今天我再次連接了esp8266模塊并將這兩個(gè)函數(shù)貼到了arduino上編譯燒錄后發(fā)現(xiàn)顯示非常順利毫無(wú)問(wèn)題,以前我也經(jīng)常在arduino上寫(xiě)一些簡(jiǎn)單的c函數(shù),有時(shí)也復(fù)制arduino上的c函數(shù)到keil3中編譯應(yīng)用,也重來(lái)沒(méi)出現(xiàn)過(guò)問(wèn)題,而此次是經(jīng)過(guò)反向驗(yàn)證應(yīng)該說(shuō)明函數(shù)真的沒(méi)毛病了,那么,問(wèn)題在哪里呢?我也重新安裝了keil3軟件,這是玩了很多年51單片機(jī)第一次遇到的久拖不決的問(wèn)題,真的百思不得其解。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

11#
ID:281828 發(fā)表于 2024-8-12 21:50 | 只看該作者
問(wèn)題已經(jīng)解決了,感謝樓上各位的指點(diǎn)與參與,雖然問(wèn)題已經(jīng)解決、程序運(yùn)行沒(méi)也問(wèn)題了但問(wèn)題的出現(xiàn)原因我也說(shuō)不清楚,問(wèn)題就是多引用了一個(gè)數(shù)組數(shù)據(jù)的.h文件造成的,注釋掉這個(gè)文件就一切正常了。程序初期調(diào)試時(shí)曾經(jīng)引用了一個(gè)數(shù)組文件:#include"Ap_29demo.h",后來(lái)重新編寫(xiě)了這個(gè)寫(xiě)字符的函數(shù)時(shí)為了調(diào)方便就把新做的點(diǎn)陣數(shù)據(jù)數(shù)組直接貼在了程序的上方,準(zhǔn)備等函數(shù)調(diào)試通過(guò)后再重新修改整理這個(gè)Ap_29demo.h文件,另外因?yàn)橛玫降牡讓雍瘮?shù)少工程還沒(méi)有分模塊,只是一個(gè)含有主函數(shù)的工程文件,原以為后做的數(shù)組名稱(chēng)與Ap_29demo.h中的數(shù)組文件不同名稱(chēng)應(yīng)該不會(huì)有問(wèn)題,但不知道啥原因就偏偏在這里翻車(chē)了,貌似只有在主函數(shù)中調(diào)用數(shù)組數(shù)據(jù)時(shí)才會(huì)找到主文件中的數(shù)組文件,但我卻真的不知道為什么會(huì)這樣,也請(qǐng)各位賜教。




評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表