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

QQ登錄

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

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

為什么接受按鍵的數(shù)組元素個(gè)數(shù)要比按鍵個(gè)數(shù)多一個(gè)才正常?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:262 發(fā)表于 2016-3-11 22:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
開(kāi)始是一樣多的,顯示會(huì)有問(wèn)題,但是通過(guò)按鍵10直接跳出來(lái)就正常,后來(lái)數(shù)組元素多+了一個(gè)才正常了,但是想不通為什么要多加一個(gè)才正常,又不是字符串。按鍵返回值得那個(gè)函數(shù)就沒(méi)貼了,包含在anjian.c里面。還有外部函數(shù)調(diào)用我怎么沒(méi)反應(yīng),delay()、key()使用前聲明了extern啊,編譯也通過(guò),下載到單片機(jī)里沒(méi)反應(yīng)。
  1. #include<reg52.h>
  2. #include "anjian.c"//按鍵檢測(cè)函數(shù)key()
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define NUM 4//等待按鍵個(gè)數(shù)為NUM
  6. #define time 10000//按鍵抖動(dòng)延時(shí),大概90ms
  7. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  8. 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  9. uchar str[NUM+1]={0};//按鍵字符數(shù)組,必須加1,否則會(huì)亂碼!
  10. void strkey()//按鍵值賦給str[]數(shù)組
  11. {
  12.         uchar i;
  13.         for(i=0;i<NUM;i++)
  14.         {
  15.                 str[i]=key();
  16.                 if(str[i]==10)//按鍵10表示確認(rèn)
  17.                 {
  18.                         break;
  19.                 }
  20.                 if(str[i]==11)//按鍵11表示取消,數(shù)組清零
  21.                 {
  22.                         for(i=0;i<NUM;i++)
  23.                                 str[i]=0;
  24.                         i=0;
  25.                         str[i]=key();
  26.                 }
  27.         }

  28. }
  29. void main()
  30. {
  31.         uchar a,x;
  32.         strkey();
  33.         while(1)
  34.         {
  35.                 for(x=0;x<4;x++)//顯示str[]數(shù)組元素到4個(gè)數(shù)碼管
  36.                 {
  37.                         a=str[x];
  38.                         P3=table[a];
  39.                         P2=(~(0x01<<x));
  40.                         delay(200);
  41.                         P2=0xff;
  42.                 }
  43.                 a=0;
  44.         }

  45. }
復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:262 發(fā)表于 2016-3-11 22:44 | 只看該作者
硬件不對(duì)也可出現(xiàn)亂碼啊

硬件沒(méi)問(wèn)題啊,上面有說(shuō),有按鍵10跳出break就正常,多加個(gè)數(shù)組元素的個(gè)數(shù)就可以正常了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:262 發(fā)表于 2016-3-11 22:44 | 只看該作者
問(wèn)下,c語(yǔ)言的一個(gè)問(wèn)題:返回指針的函數(shù),這個(gè)指針指向的是這個(gè)函數(shù)的內(nèi)部一個(gè)變量,這個(gè)函數(shù)完了,這個(gè)變量不是銷(xiāo)毀了嗎?那還返回那個(gè)指針有什么用?是不是那個(gè)變量要是全局或者靜態(tài)局部?
回復(fù)

使用道具 舉報(bào)

地板
ID:262 發(fā)表于 2016-3-11 22:44 | 只看該作者
建議把其他函數(shù)貼一下,必須寫(xiě)NUM+1,是因?yàn)槟銛?shù)字按鍵一共按了四次,但是確認(rèn)或刪除你 for(i=0;i<NUM;i++)循環(huán)計(jì)數(shù)時(shí)算入在內(nèi)了,也就是說(shuō)你總共是按了5次,所以導(dǎo)致的。
回復(fù)

使用道具 舉報(bào)

5#
ID:262 發(fā)表于 2016-3-11 22:45 | 只看該作者
確認(rèn)、刪除這兩個(gè)鍵還沒(méi)處理好(暫時(shí)不管),確認(rèn)按了還是會(huì)算按鍵10,我貼下按鍵檢測(cè)
回復(fù)

使用道具 舉報(bào)

6#
ID:262 發(fā)表于 2016-3-11 22:45 | 只看該作者

  1. anjian.c文件里就只有延時(shí)delay()+key()函數(shù)
  2. #include<reg52.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define time 10000//按鍵抖動(dòng)延時(shí),大概90ms
  6. void delay(uint  z)
  7. {
  8.         while(z--);
  9. }
  10. uchar key()//按鍵檢測(cè)程序,返回的是0-F的字符
  11. {
  12.         uchar x,temp,k,flag,temp2;
  13.         flag=1;
  14.         while(flag)
  15.         {
  16.         for(x=0;x<4;x++)
  17.         {
  18.                 temp2=~(0x01<<x);//利用1左移后反轉(zhuǎn),即0左移
  19.                 P1=temp2;
  20.                 temp=P1;
  21.                 while(temp!=temp2)
  22.                 {
  23.                         delay(time);
  24.                         P1=temp2;
  25.                         temp=P1;
  26.                         while(temp!=temp2)
  27.                         {
  28.                                 switch(temp)
  29.                                 {
  30.                                         case 0xee:k=12;break;
  31.                                         case 0xde:k=13;break;
  32.                                         case 0xbe:k=14;break;
  33.                                         case 0x7e:k=15;break;

  34.                                         case 0xeD:k=8;break;
  35.                                         case 0xDD:k=9;break;
  36.                                         case 0xBD:k=10;break;
  37.                                         case 0x7D:k=11;break;

  38.                                         case 0xeB:k=4;break;
  39.                                         case 0xDB:k=5;break;
  40.                                         case 0xBB:k=6;break;
  41.                                         case 0x7B:k=7;break;

  42.                                         case 0xe7:k=0;break;
  43.                                         case 0xD7:k=1;break;
  44.                                         case 0xB7:k=2;break;
  45.                                         case 0x77:k=3;break;
  46.                                 }
  47.                                 flag=0;
  48.                                 do
  49.                                 {
  50.                                         P1=temp2;
  51.                                         temp=P1;
  52.                                         delay(time);
  53.                                 }
  54.                                 while(temp!=temp2);
  55.                         }

  56.                         
  57.                 }


  58.         }
  59.         }
  60.         return k;
  61. }
復(fù)制代碼



按鍵檢測(cè)key()沒(méi)問(wèn)題,我單獨(dú)在一個(gè)main中試過(guò)了,才做成.c文件方便包含的
回復(fù)

使用道具 舉報(bào)

7#
ID:262 發(fā)表于 2016-3-11 22:45 | 只看該作者

打個(gè)比方:你十個(gè)按鍵鍵值分別是0-9,那么0-9就剛好是10個(gè)鍵值了;要看你是從那個(gè)數(shù)起的,1-10是10個(gè),0-9也是10個(gè)!能明白不?
回復(fù)

使用道具 舉報(bào)

8#
ID:262 發(fā)表于 2016-3-11 22:46 | 只看該作者
小蜜蜂o
anjian.c文件里就只有延時(shí)delay()+key()函數(shù)
#include
#define uint unsigned int

//////還有外部函數(shù)調(diào)用我怎么沒(méi)反應(yīng),delay()、key()使用前聲明了extern啊,編譯也通過(guò),下載到單片機(jī)里沒(méi)反應(yīng)。//////////沒(méi)太看懂什么意思。你是說(shuō)包含在anjian。c的文件不能被主函數(shù)調(diào)用嗎?還是說(shuō)可以調(diào)用,但不做反應(yīng)?戳艘幌履闵线叺暮瘮(shù)沒(méi)什么問(wèn)題,延時(shí)函數(shù)好像不是90ms,如果真是的話(huà)建議改小點(diǎn),一般按鍵抖動(dòng)在10-15ms之間,延時(shí)的話(huà)寫(xiě)20ms就可以,人正常按按鍵的時(shí)間在100ms-300ms,如果按得較快,延時(shí)90ms是會(huì)發(fā)生問(wèn)題的。
回復(fù)

使用道具 舉報(bào)

9#
ID:262 發(fā)表于 2016-3-11 22:47 | 只看該作者
我之前沒(méi)包含anjian.c文件,直接在使用前聲明為extern函數(shù),最后編譯出來(lái)的程序好小,我那個(gè)包含文件跟.c同一個(gè)文件夾,但是,.c跟工程不是同一個(gè)文件夾,是不是這個(gè)問(wèn)題?。然后試了另一種,就是包含那個(gè)文件,但是不聲明為外部函數(shù),這樣就正常
回復(fù)

使用道具 舉報(bào)

10#
ID:262 發(fā)表于 2016-3-11 22:47 | 只看該作者
heicad 發(fā)表于 2016-3-11 22:45
打個(gè)比方:你十個(gè)按鍵鍵值分別是0-9,那么0-9就剛好是10個(gè)鍵值了;要看你是從那個(gè)數(shù)起的,1-10是10個(gè),0- ...

我是從str[0]開(kāi)始賦值的啊,顯示也是從它開(kāi)始
回復(fù)

使用道具 舉報(bào)

11#
ID:262 發(fā)表于 2016-3-11 22:48 | 只看該作者
本帖最后由 heicad 于 2016-3-11 22:50 編輯

引用:
-------------------------------------------
小蜜蜂o 發(fā)表
我之前沒(méi)包含anjian.c文件,直接在使用前聲明為extern函數(shù),最后編譯出來(lái)的程序好小,我那個(gè)包含文件跟.c ...-------------------------------------------

我是這樣理解的,問(wèn)題的關(guān)鍵不在于你用extern去聲明函數(shù),而實(shí)際你沒(méi)有進(jìn)行函數(shù)聲明(extern不是聲明函數(shù)用的),在C語(yǔ)言中書(shū)中我只看到了extern可以用于聲明變量,沒(méi)有看到extern可以聲明函數(shù)。于是我上網(wǎng)查了一下,是這樣說(shuō)的你細(xì)細(xì)理解一下這兩句話(huà),很繞口,:C語(yǔ)言外部函數(shù) //
1、在定義函數(shù)時(shí),若在函數(shù)首部的最左端加關(guān)鍵字extern,則表示此函數(shù)是外部調(diào)用,可被其他文件調(diào)用,函數(shù)首部可以為

Extern int fun(int a,int b);
C語(yǔ)言規(guī)定,聲明函數(shù)和外部變量時(shí)(即外部聲明)缺省是extern,可被其他文件見(jiàn)調(diào)用或使用。

2、在需要調(diào)用函數(shù)的文件中,用extern(缺省默認(rèn))對(duì)函數(shù)聲明,表示該函數(shù)是在其他文件中定義的外部函數(shù)

注意:C語(yǔ)言沒(méi)有局部函數(shù)!
照他的意思C語(yǔ)言中的函數(shù)全是全局函數(shù),而你用extern聲明,寫(xiě)不寫(xiě)沒(méi)有關(guān)系因?yàn)閑xtern是程序默認(rèn)寫(xiě)上的,也就是說(shuō),問(wèn)題關(guān)鍵不再extern,而在于沒(méi)有聲明函數(shù)。聲明的話(huà),你把key()函數(shù)聲明寫(xiě)到anjian.h中在讓主函數(shù)包含以下anjian.h就可以了。
回復(fù)

使用道具 舉報(bào)

12#
ID:262 發(fā)表于 2016-3-11 22:50 | 只看該作者
還是搞不明白這些 ABC 字母組合的意思,別人編寫(xiě)的就沒(méi)出現(xiàn) LZ 這樣的問(wèn)題 。同樣是16個(gè)按鍵輸入顯示字符與數(shù)字,還是你的編寫(xiě)思路有誤呢?
回復(fù)

使用道具 舉報(bào)

13#
ID:262 發(fā)表于 2016-3-11 22:50 | 只看該作者
heicad 發(fā)表于 2016-3-11 22:50
還是搞不明白這些 ABC 字母組合的意思,別人編寫(xiě)的就沒(méi)出現(xiàn) LZ 這樣的問(wèn)題 。同樣是16個(gè)按鍵輸入顯示字符與 ...

框架很簡(jiǎn)單啊,key()沒(méi)問(wèn)題,不用看。就是那個(gè)strkey()函數(shù)里的數(shù)組賦值那里,下面那兩個(gè)if也可以不用看,那是額外的,/**/掉,main()里面就是把str【】數(shù)組前4個(gè)元素顯示到數(shù)碼管。
回復(fù)

使用道具 舉報(bào)

14#
ID:262 發(fā)表于 2016-3-11 22:50 | 只看該作者
就只知道{0xc0~0x8e}用于共陽(yáng)數(shù)碼管顯示的,其它的英文還真沒(méi)明白是啥意思。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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