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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

哪位大神可以幫忙求解?單片機矩陣鍵盤程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:798494 發表于 2020-8-5 14:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
        最近剛剛開始學單片機,看的是郭天祥師傅的視頻教程。但是買的開發板是普中科技的。所以寫了一個矩陣按鍵的程序。但是出錯了。求各位大神解答。謝謝了?問題故障是:按鍵按下一個之后,八個數碼管會顯示對應的數字。但是第二次按下別的按鍵。就沒有反應了。(附件為開發板的原理圖)        以下是本人寫的程序:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar num;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay(uint z);
void ruixiang(uchar num);
void keykey();

void keykey()
{
        uchar temp,key;
        P1=0x7f;
        temp=P1;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
                delay(10);
                temp=P1;
                temp=temp&0x0f;
                if(temp!=0x0f)
                {
                        switch(temp)
                        {
                                case 0x77:key=0;break;
                                case 0x7b:key=1;break;
                                case 0x7d:key=2;break;
                                case 0x7e:key=3;break;
                        }
                        while(temp!=temp&0x0f)
                        {
                                temp=P1;
                                temp=temp&0x0f;        
                        }        
                        ruixiang(key);
                }
        }
        P1=0xbf;
        temp=P1;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
                delay(10);
                temp=P1;
                temp=temp&0x0f;
                if(temp!=0x0f)
                {
                        switch(temp)
                        {
                                case 0xb7:key=4;break;
                                case 0xbb:key=5;break;
                                case 0xbd:key=6;break;
                                case 0xbe:key=7;break;
                        }
                        while(temp!=temp&0x0f)
                        {
                                temp=P1;
                                temp=temp&0x0f;        
                        }        
                        ruixiang(key);
                }
        }
        P1=0xdf;
        temp=P1;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
                delay(10);
                temp=P1;
                temp=temp&0x0f;
                if(temp!=0x0f)
                {
                        switch(temp)
                        {
                                case 0xd7:key=8;break;
                                case 0xdb:key=9;break;
                                case 0xdd:key=10;break;
                                case 0xde:key=11;break;
                        }
                        while(temp!=temp&0x0f)
                        {
                                temp=P1;
                                temp=temp&0x0f;        
                        }        
                        ruixiang(key);
                }
        }
        P1=0xef;
        temp=P1;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
                delay(10);
                temp=P1;
                temp=temp&0x0f;
                if(temp!=0x0f)
                {
                        switch(temp)
                        {
                                case 0xe7:key=12;break;
                                case 0xeb:key=13;break;
                                case 0xed:key=14;break;
                                case 0xee:key=15;break;
                        }
                        while(temp!=temp&0x0f)
                        {
                                temp=P1;
                                temp=temp&0x0f;        
                        }        
                        ruixiang(key);
                }
        }
}

void ruixiang(uchar num)
{                                                                                                                                                           
        while(1)
        {
                LSA=0;LSB=0;LSC=0;
                P0=table[num];
                delay(1);
                P0=0x00;
                LSA=1;LSB=0;LSC=0;
                P0=table[num];
                delay(1);
                P0=0x00;
                LSA=0;LSB=1;LSC=0;
                P0=table[num];
                delay(1);
                P0=0x00;
                LSA=1;LSB=1;LSC=0;
                P0=table[num];
                delay(1);
                P0=0x00;
                LSA=0;LSB=0;LSC=1;
                P0=table[num];
                delay(1);
                P0=0x00;
                LSA=1;LSB=0;LSC=1;
                P0=table[num];
                delay(1);
                P0=0x00;
                LSA=0;LSB=1;LSC=1;
                P0=table[num];
                delay(1);
                P0=0x00;
                LSA=1;LSB=1;LSC=1;
                P0=table[num];
                delay(1);
                P0=0x00;
        }
}

void delay(uint z)
{
        uint a,b;
        for(a=z;a>0;a--)
                for(b=110;b>0;b--);
}

void mian()
{
        while(1)
        {
                keykey();
        }        
}




A2開發板原理圖.pdf

227.86 KB, 下載次數: 5

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

使用道具 舉報

沙發
ID:807712 發表于 2020-8-5 14:24 | 只看該作者
普中內有視頻與代碼,為何不先看看再說呢?
回復

使用道具 舉報

板凳
ID:332444 發表于 2020-8-5 14:26 | 只看該作者
若函數實現寫在void mian()之后則要在void mian()之前寫原形函數,若函數實現寫在void mian()之前則不需要寫函數原形;學這樣的矩陣代碼看著都眼花,理解起來也好似顯得不易;不如學其他的矩陣代碼既簡潔又容易理解,可參https://blog.csdn.net/xianfajushi/article/details/80884859
回復

使用道具 舉報

地板
ID:332444 發表于 2020-8-5 14:35 | 只看該作者
回復

使用道具 舉報

5#
ID:798494 發表于 2020-8-5 15:14 | 只看該作者
塞北江南 發表于 2020-8-5 14:24
普中內有視頻與代碼,為何不先看看再說呢?

普中的視頻代碼我都看過了。他們的是矩陣按鍵掃描邏輯我也看懂了。但是我想弄一個就是基于郭天祥那邊的程序格式。另外因為兩個開發板線路不同,所以也想試試自己寫一個邏輯跟普中教程不一樣的程序。
回復

使用道具 舉報

6#
ID:798494 發表于 2020-8-5 15:36 | 只看該作者
xianfajushi 發表于 2020-8-5 14:26
若函數實現寫在void mian()之后則要在void mian()之前寫原形函數,若函數實現寫在void mian()之前則不需要 ...

感謝老板們的支持!
回復

使用道具 舉報

7#
ID:213173 發表于 2020-8-5 20:48 | 只看該作者
樓主這個程序根本就不可能運行!首先是主函數名寫錯void mian(),正確寫法是void main(),其次是顯示函數體是死循環while(1),被按鍵函數執行一次就出不來。不論是郭天祥的還是普中的示例矩陣鍵盤掃描函數只是為說明一個基本原理,實戰中不宜采用。給你一個適用于你的開發板的 4*4矩陣鍵盤示例參考,有詳細注釋,不難理解。
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. /*
  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. */
  9. uchar KeyValue;                //鍵值變量
  10. uchar num=0;                //數碼管位計數變量
  11. bit   sign=0;                //按鍵標志位變量
  12. uchar count=0;                //消抖計數變量       
  13. uchar code table[]={//0~15共陰數碼管段碼數組
  14.         0x3f,0x06,0x5b,0x4f,
  15.         0x66,0x6d,0x7d,0x07,
  16.         0x7f,0x6f,0x77,0x7c,
  17.         0x39,0x5e,0x79,0x71};
  18. uchar data dis_buf[8]={0,0,0,0,0,0,0,0};//緩存數組
  19. void keyscan();
  20. void display();
  21. void delay(uint z);

  22. void keyscan()                                        //矩陣按鍵掃描程序
  23. {
  24.         P1=0xf0;                                        //賦值P1 1111 0000
  25.         if(P1!=0xf0)                                //檢測有按鍵按下
  26.         {
  27.                 if((++count>=10)&&(sign==0))//消抖計數10ms與判斷按鍵狀態
  28.                 {                       
  29.                         sign=1;                        //按鍵狀態標志置1
  30.                         switch(P1)
  31.                         {
  32.                                 case(0Xe0):KeyValue = 0;break;
  33.                                 case(0Xd0):KeyValue = 1;break;
  34.                                 case(0Xb0):KeyValue = 2;break;
  35.                                 case(0X70):KeyValue = 3;break;
  36.                         }
  37.                         P1=0x0f;                        //賦值P1 0000 1111
  38.                         switch(P1)
  39.                         {
  40.                                 case(0X0e):KeyValue+= 1;break;
  41.                                 case(0X0d):KeyValue+= 5;break;
  42.                                 case(0X0b):KeyValue+= 9;break;
  43.                                 case(0X07):KeyValue+=13;break;
  44.                         }
  45.                 }
  46.         }
  47.         else                                                //鍵抬起
  48.         {
  49.                 sign=0;                                //按鍵狀態標志清0
  50.                 count=0;                                //消抖計數清0
  51.         }
  52. }

  53. void display()        //數碼管顯示程序
  54. {                                                                                                                                         
  55.         dis_buf[0]=table[KeyValue%10];//分解鍵值個位
  56.         dis_buf[1]=table[KeyValue/10];//分解鍵值十位
  57. //        dis_buf[2]=
  58. //        dis_buf[3]=
  59. //        dis_buf[4]=
  60. //        dis_buf[5]=
  61. //        dis_buf[6]=
  62. //        dis_buf[7]=

  63.         P0=0x00;                //段碼消隱
  64.         P2&=0xe3;                //位碼清0
  65.         P0=dis_buf[num];//送段碼
  66.         P2|=num<<2;                //送位碼
  67.         num++;                        //位計數
  68.         num%=8;
  69. }

  70. void delay(uint z)
  71. {
  72.         uint a,b;
  73.         for(a=z;a>0;a--)
  74.                 for(b=110;b>0;b--);
  75. }

  76. void main()
  77. {
  78.         while(1)
  79.         {
  80.                 keyscan();
  81.                 display();
  82.                 delay(1);//控制主循環周期約1ms
  83.         }        
  84. }

復制代碼




回復

使用道具 舉報

8#
ID:798494 發表于 2020-8-6 09:08 | 只看該作者
wulin 發表于 2020-8-5 20:48
樓主這個程序根本就不可能運行!首先是主函數名寫錯void mian(),正確寫法是void main(),其次是顯示函數體 ...

感謝大佬的支持,非常感謝!可否后續繼續關注我?可以交學費。嗯嗯還是感謝老板做我的明燈
回復

使用道具 舉報

9#
ID:798494 發表于 2020-8-6 14:12 | 只看該作者
wulin 發表于 2020-8-5 20:48
樓主這個程序根本就不可能運行!首先是主函數名寫錯void mian(),正確寫法是void main(),其次是顯示函數體 ...

你好 !您能幫幫我指出那個地方有問題嗎?
然后能不能跟我講一下哪兒改一下  可以讓這個程序跑起來
回復

使用道具 舉報

10#
ID:462827 發表于 2020-8-6 19:43 | 只看該作者
你這個矩陣按鍵掃描和數碼管顯示的函數都寫得太長了吧,至少可以縮短一半以上。
回復

使用道具 舉報

11#
ID:213173 發表于 2020-8-7 06:49 | 只看該作者
Judehan 發表于 2020-8-6 14:12
你好 !您能幫幫我指出那個地方有問題嗎?
然后能不能跟我講一下哪兒改一下  可以讓這個程序跑起來

給你改正main()函數名,去掉顯示函數中的死循環 while(1),去掉按鍵函數中的錯誤和贅句,把顯示函數放在主函數中可以勉強跑起來,但離實用還有很大距離。下面注釋掉的部分基本都是錯誤的或與錯誤相關。
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;
  7. uchar num;
  8. uchar key;
  9. uchar code table[]={
  10. 0x3f,0x06,0x5b,0x4f,
  11. 0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f,0x77,0x7c,
  13. 0x39,0x5e,0x79,0x71};

  14. void delay(uint z);
  15. void ruixiang(uchar num);
  16. void keykey();

  17. void keykey()
  18. {
  19. //        uchar temp,key;
  20.         uchar temp;
  21.         P1=0x7f;
  22.         temp=P1;
  23. //        temp=temp&0x0f;
  24. //        if(temp!=0x0f)
  25.         if(temp!=0x7f)
  26.         {
  27.                 delay(10);
  28. //                temp=P1;
  29. //                temp=temp&0x0f;
  30. //                if(temp!=0x0f)
  31.                 if(temp!=0x7f)
  32.                 {
  33.                         switch(temp)
  34.                         {
  35.                                 case 0x77:key=0;break;
  36.                                 case 0x7b:key=1;break;
  37.                                 case 0x7d:key=2;break;
  38.                                 case 0x7e:key=3;break;
  39.                         }
  40.                         while(P1!=0x7f);
  41. //                        while(temp!=temp&0x0f)
  42. //                        {
  43. //                                temp=P1;
  44. //                                temp=temp&0x0f;        
  45. //                        }        
  46. //                        ruixiang(key);
  47.                 }
  48.         }
  49.         P1=0xbf;
  50.         temp=P1;
  51. //        temp=temp&0x0f;
  52. //        if(temp!=0x0f)
  53.         if(temp!=0xbf)
  54.         {
  55.                 delay(10);
  56. //                temp=P1;
  57. //                temp=temp&0x0f;
  58. //                if(temp!=0x0f)
  59.                 if(temp!=0xbf)
  60.                 {
  61.                         switch(temp)
  62.                         {
  63.                                 case 0xb7:key=4;break;
  64.                                 case 0xbb:key=5;break;
  65.                                 case 0xbd:key=6;break;
  66.                                 case 0xbe:key=7;break;
  67.                         }
  68.                         while(P1!=0xbf);
  69. //                        while(temp!=temp&0x0f)
  70. //                        {
  71. //                                temp=P1;
  72. //                                temp=temp&0x0f;
  73. //                        }        
  74. //                        ruixiang(key);
  75.                 }
  76.         }
  77.         P1=0xdf;
  78.         temp=P1;
  79. //        temp=temp&0x0f;
  80. //        if(temp!=0x0f)
  81.         if(temp!=0xdf)
  82.         {
  83.                 delay(10);
  84. //                temp=P1;
  85. //                temp=temp&0x0f;
  86. //                if(temp!=0x0f)
  87.                 if(temp!=0xdf)
  88.                 {
  89.                         switch(temp)
  90.                         {
  91.                                 case 0xd7:key=8;break;
  92.                                 case 0xdb:key=9;break;
  93.                                 case 0xdd:key=10;break;
  94.                                 case 0xde:key=11;break;
  95.                         }
  96.                         while(P1!=0xdf);
  97. //                        while(temp!=temp&0x0f)
  98. //                        {
  99. //                                temp=P1;
  100. //                                temp=temp&0x0f;        
  101. //                        }        
  102. //                        ruixiang(key);
  103.                 }
  104.         }
  105.         P1=0xef;
  106.         temp=P1;
  107. //        temp=temp&0x0f;
  108. //        if(temp!=0x0f)
  109.         if(temp!=0xef)
  110.         {
  111.                 delay(10);
  112. //                temp=P1;
  113. //                temp=temp&0x0f;
  114. //                if(temp!=0x0f)
  115.                 if(temp!=0xef)
  116.                 {
  117.                         switch(temp)
  118.                         {
  119.                                 case 0xe7:key=12;break;
  120.                                 case 0xeb:key=13;break;
  121.                                 case 0xed:key=14;break;
  122.                                 case 0xee:key=15;break;
  123.                         }
  124.                         while(P1!=0xef);
  125. //                        while(temp!=temp&0x0f)
  126. //                        {
  127. //                                temp=P1;
  128. //                                temp=temp&0x0f;        
  129. //                        }        
  130. //                        ruixiang(key);
  131.                 }
  132.         }
  133. }

  134. void ruixiang(uchar num)
  135. {
  136. //        while(1)
  137. //        {
  138.         LSA=0;LSB=0;LSC=0;
  139.         P0=table[num];
  140.         delay(1);
  141.         P0=0x00;
  142.         LSA=1;LSB=0;LSC=0;
  143.         P0=table[num];
  144.         delay(1);
  145.         P0=0x00;
  146.         LSA=0;LSB=1;LSC=0;
  147.         P0=table[num];
  148.         delay(1);
  149.         P0=0x00;
  150.         LSA=1;LSB=1;LSC=0;
  151.         P0=table[num];
  152.         delay(1);
  153.         P0=0x00;
  154.         LSA=0;LSB=0;LSC=1;
  155.         P0=table[num];
  156.         delay(1);
  157.         P0=0x00;
  158.         LSA=1;LSB=0;LSC=1;
  159.         P0=table[num];
  160.         delay(1);
  161.         P0=0x00;
  162.         LSA=0;LSB=1;LSC=1;
  163.         P0=table[num];
  164.         delay(1);
  165.         P0=0x00;
  166.         LSA=1;LSB=1;LSC=1;
  167.         P0=table[num];
  168.         delay(1);
  169.         P0=0x00;
  170. //        }
  171. }
  172. void delay(uint z)
  173. {
  174.         uint a,b;
  175.         for(a=z;a>0;a--)
  176.                 for(b=110;b>0;b--);
  177. }
  178. //void mian()
  179. void main()
  180. {
  181.         while(1)
  182.         {
  183.                 keykey();
  184.                 ruixiang(key);
  185.         }        
  186. }

復制代碼
回復

使用道具 舉報

12#
ID:808700 發表于 2020-8-7 16:34 | 只看該作者
Judehan 發表于 2020-8-6 09:08
感謝大佬的支持,非常感謝!可否后續繼續關注我?可以交學費。嗯嗯還是感謝老板做我的明燈

如果需要長期指點的話,可私聊我
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一二区成人影院电影网 | 日韩视频91 | 久久中文网 | 亚洲精品乱码久久久久久按摩观 | 精品一区二区久久久久久久网站 | 久草.com | h视频免费观看 | 国产精品久久久久久久久久不蜜臀 | 欧美精品一区二区三区在线 | 亚洲乱码一区二区三区在线观看 | 国产三级一区二区 | 亚洲成人综合社区 | 亚洲精品综合一区二区 | 亚洲九九精品 | 91视频国产一区 | 涩色视频在线观看 | 精品国产乱码久久久久久影片 | 黑人一级片视频 | 国产区高清| 国产成在线观看免费视频 | 国产精品99久久久久久宅男 | 欧美日韩一区二区在线播放 | 日韩免费三级 | 九九伦理片 | 国产亚洲日本精品 | 逼逼视频| 毛片综合 | 亚洲一区二区精品视频 | 欧美一二三四成人免费视频 | av网站在线播放 | 日日日操 | 中文字幕av亚洲精品一部二部 | 粉嫩在线| 一区二区精品电影 | 日韩精品不卡 | 欧美成人一区二区三区片免费 | av网站免费观看 | 精品国产一区二区三区性色av | 精品久久1| 亚洲男人的天堂网站 | 在线观看成人免费视频 |