久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3722|回復: 13
打印 上一主題 下一主題
收起左側

為什么接受按鍵的數組元素個數要比按鍵個數多一個才正常?

[復制鏈接]
跳轉到指定樓層
樓主
ID:262 發表于 2016-3-11 22:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
開始是一樣多的,顯示會有問題,但是通過按鍵10直接跳出來就正常,后來數組元素多+了一個才正常了,但是想不通為什么要多加一個才正常,又不是字符串。按鍵返回值得那個函數就沒貼了,包含在anjian.c里面。還有外部函數調用我怎么沒反應,delay()、key()使用前聲明了extern啊,編譯也通過,下載到單片機里沒反應。
  1. #include<reg52.h>
  2. #include "anjian.c"//按鍵檢測函數key()
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define NUM 4//等待按鍵個數為NUM
  6. #define time 10000//按鍵抖動延時,大概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};//按鍵字符數組,必須加1,否則會亂碼!
  10. void strkey()//按鍵值賦給str[]數組
  11. {
  12.         uchar i;
  13.         for(i=0;i<NUM;i++)
  14.         {
  15.                 str[i]=key();
  16.                 if(str[i]==10)//按鍵10表示確認
  17.                 {
  18.                         break;
  19.                 }
  20.                 if(str[i]==11)//按鍵11表示取消,數組清零
  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[]數組元素到4個數碼管
  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. }
復制代碼



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

使用道具 舉報

沙發
ID:262 發表于 2016-3-11 22:44 | 只看該作者
硬件不對也可出現亂碼啊

硬件沒問題啊,上面有說,有按鍵10跳出break就正常,多加個數組元素的個數就可以正常了。
回復

使用道具 舉報

板凳
ID:262 發表于 2016-3-11 22:44 | 只看該作者
問下,c語言的一個問題:返回指針的函數,這個指針指向的是這個函數的內部一個變量,這個函數完了,這個變量不是銷毀了嗎?那還返回那個指針有什么用?是不是那個變量要是全局或者靜態局部啊?
回復

使用道具 舉報

地板
ID:262 發表于 2016-3-11 22:44 | 只看該作者
建議把其他函數貼一下,必須寫NUM+1,是因為你數字按鍵一共按了四次,但是確認或刪除你 for(i=0;i<NUM;i++)循環計數時算入在內了,也就是說你總共是按了5次,所以導致的。
回復

使用道具 舉報

5#
ID:262 發表于 2016-3-11 22:45 | 只看該作者
確認、刪除這兩個鍵還沒處理好(暫時不管),確認按了還是會算按鍵10,我貼下按鍵檢測
回復

使用道具 舉報

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

  1. anjian.c文件里就只有延時delay()+key()函數
  2. #include<reg52.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define time 10000//按鍵抖動延時,大概90ms
  6. void delay(uint  z)
  7. {
  8.         while(z--);
  9. }
  10. uchar key()//按鍵檢測程序,返回的是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左移后反轉,即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. }
復制代碼



按鍵檢測key()沒問題,我單獨在一個main中試過了,才做成.c文件方便包含的
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

我是從str[0]開始賦值的啊,顯示也是從它開始
回復

使用道具 舉報

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

引用:
-------------------------------------------
小蜜蜂o 發表
我之前沒包含anjian.c文件,直接在使用前聲明為extern函數,最后編譯出來的程序好小,我那個包含文件跟.c ...-------------------------------------------

我是這樣理解的,問題的關鍵不在于你用extern去聲明函數,而實際你沒有進行函數聲明(extern不是聲明函數用的),在C語言中書中我只看到了extern可以用于聲明變量,沒有看到extern可以聲明函數。于是我上網查了一下,是這樣說的你細細理解一下這兩句話,很繞口,:C語言外部函數 //
1、在定義函數時,若在函數首部的最左端加關鍵字extern,則表示此函數是外部調用,可被其他文件調用,函數首部可以為

Extern int fun(int a,int b);
C語言規定,聲明函數和外部變量時(即外部聲明)缺省是extern,可被其他文件見調用或使用。

2、在需要調用函數的文件中,用extern(缺省默認)對函數聲明,表示該函數是在其他文件中定義的外部函數

注意:C語言沒有局部函數!
照他的意思C語言中的函數全是全局函數,而你用extern聲明,寫不寫沒有關系因為extern是程序默認寫上的,也就是說,問題關鍵不再extern,而在于沒有聲明函數。聲明的話,你把key()函數聲明寫到anjian.h中在讓主函數包含以下anjian.h就可以了。
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品视频一区二区三区 | 一区二区三区国产好的精 | 久久综合久色欧美综合狠狠 | 91中文字幕| 精品国产欧美一区二区三区成人 | 国产精品久久国产精品 | 综合国产| 99久久婷婷国产综合精品电影 | 日日干综合 | 国产 日韩 欧美 制服 另类 | 狠狠躁夜夜躁人人爽天天高潮 | 又黑又粗又长的欧美一区 | 精品久久久久久久久久久久久久 | 欧美午夜一区二区三区免费大片 | 欧美一级免费看 | 99pao成人国产永久免费视频 | 亚洲精品久久久久久久久久久 | 日韩1区2区 | 日韩精品在线观看一区二区 | 欧美一区二区三 | 国产成人一区在线 | 午夜在线精品偷拍 | 久久久久香蕉视频 | 国产欧美一区二区三区日本久久久 | 99成人在线视频 | 日韩三级免费网站 | 久久网日本 | 正在播放亚洲 | 欧美一区二区免费 | 成人午夜电影在线观看 | 精品亚洲一区二区三区四区五区 | 久久久久九九九九 | 日韩毛片网 | 国产在线资源 | 99久久精品一区二区毛片吞精 | 免费精品视频在线观看 | 久久另类视频 | 日韩av成人 | 成人黄色电影在线播放 | 中文字幕不卡在线88 | 午夜电影网 |