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

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

QQ登錄

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

搜索
查看: 2725|回復(fù): 11
收起左側(cè)

哪位大神可以幫忙求解?單片機(jī)矩陣鍵盤(pán)程序問(wèn)題

[復(fù)制鏈接]
ID:798494 發(fā)表于 2020-8-5 14:06 | 顯示全部樓層 |閱讀模式
        最近剛剛開(kāi)始學(xué)單片機(jī),看的是郭天祥師傅的視頻教程。但是買(mǎi)的開(kāi)發(fā)板是普中科技的。所以寫(xiě)了一個(gè)矩陣按鍵的程序。但是出錯(cuò)了。求各位大神解答。謝謝了?問(wèn)題故障是:按鍵按下一個(gè)之后,八個(gè)數(shù)碼管會(huì)顯示對(duì)應(yīng)的數(shù)字。但是第二次按下別的按鍵。就沒(méi)有反應(yīng)了。(附件為開(kāi)發(fā)板的原理圖)        以下是本人寫(xiě)的程序:
#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開(kāi)發(fā)板原理圖.pdf

227.86 KB, 下載次數(shù): 5

回復(fù)

使用道具 舉報(bào)

ID:807712 發(fā)表于 2020-8-5 14:24 | 顯示全部樓層
普中內(nèi)有視頻與代碼,為何不先看看再說(shuō)呢?
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2020-8-5 14:26 | 顯示全部樓層
若函數(shù)實(shí)現(xiàn)寫(xiě)在void mian()之后則要在void mian()之前寫(xiě)原形函數(shù),若函數(shù)實(shí)現(xiàn)寫(xiě)在void mian()之前則不需要寫(xiě)函數(shù)原形;學(xué)這樣的矩陣代碼看著都眼花,理解起來(lái)也好似顯得不易;不如學(xué)其他的矩陣代碼既簡(jiǎn)潔又容易理解,可參https://blog.csdn.net/xianfajushi/article/details/80884859
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2020-8-5 14:35 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:798494 發(fā)表于 2020-8-5 15:14 | 顯示全部樓層
塞北江南 發(fā)表于 2020-8-5 14:24
普中內(nèi)有視頻與代碼,為何不先看看再說(shuō)呢?

普中的視頻代碼我都看過(guò)了。他們的是矩陣按鍵掃描邏輯我也看懂了。但是我想弄一個(gè)就是基于郭天祥那邊的程序格式。另外因?yàn)閮蓚(gè)開(kāi)發(fā)板線路不同,所以也想試試自己寫(xiě)一個(gè)邏輯跟普中教程不一樣的程序。
回復(fù)

使用道具 舉報(bào)

ID:798494 發(fā)表于 2020-8-5 15:36 | 顯示全部樓層
xianfajushi 發(fā)表于 2020-8-5 14:26
若函數(shù)實(shí)現(xiàn)寫(xiě)在void mian()之后則要在void mian()之前寫(xiě)原形函數(shù),若函數(shù)實(shí)現(xiàn)寫(xiě)在void mian()之前則不需要 ...

感謝老板們的支持!
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2020-8-5 20:48 | 顯示全部樓層
樓主這個(gè)程序根本就不可能運(yùn)行!首先是主函數(shù)名寫(xiě)錯(cuò)void mian(),正確寫(xiě)法是void main(),其次是顯示函數(shù)體是死循環(huán)while(1),被按鍵函數(shù)執(zhí)行一次就出不來(lái)。不論是郭天祥的還是普中的示例矩陣鍵盤(pán)掃描函數(shù)只是為說(shuō)明一個(gè)基本原理,實(shí)戰(zhàn)中不宜采用。給你一個(gè)適用于你的開(kāi)發(fā)板的 4*4矩陣鍵盤(pán)示例參考,有詳細(xì)注釋,不難理解。
  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;                //數(shù)碼管位計(jì)數(shù)變量
  11. bit   sign=0;                //按鍵標(biāo)志位變量
  12. uchar count=0;                //消抖計(jì)數(shù)變量       
  13. uchar code table[]={//0~15共陰數(shù)碼管段碼數(shù)組
  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};//緩存數(shù)組
  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)                                //檢測(cè)有按鍵按下
  26.         {
  27.                 if((++count>=10)&&(sign==0))//消抖計(jì)數(shù)10ms與判斷按鍵狀態(tài)
  28.                 {                       
  29.                         sign=1;                        //按鍵狀態(tài)標(biāo)志置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;                                //按鍵狀態(tài)標(biāo)志清0
  50.                 count=0;                                //消抖計(jì)數(shù)清0
  51.         }
  52. }

  53. void display()        //數(shù)碼管顯示程序
  54. {                                                                                                                                         
  55.         dis_buf[0]=table[KeyValue%10];//分解鍵值個(gè)位
  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++;                        //位計(jì)數(shù)
  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);//控制主循環(huán)周期約1ms
  83.         }        
  84. }

復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

ID:798494 發(fā)表于 2020-8-6 09:08 | 顯示全部樓層
wulin 發(fā)表于 2020-8-5 20:48
樓主這個(gè)程序根本就不可能運(yùn)行!首先是主函數(shù)名寫(xiě)錯(cuò)void mian(),正確寫(xiě)法是void main(),其次是顯示函數(shù)體 ...

感謝大佬的支持,非常感謝!可否后續(xù)繼續(xù)關(guān)注我?可以交學(xué)費(fèi)。嗯嗯還是感謝老板做我的明燈
回復(fù)

使用道具 舉報(bào)

ID:798494 發(fā)表于 2020-8-6 14:12 | 顯示全部樓層
wulin 發(fā)表于 2020-8-5 20:48
樓主這個(gè)程序根本就不可能運(yùn)行!首先是主函數(shù)名寫(xiě)錯(cuò)void mian(),正確寫(xiě)法是void main(),其次是顯示函數(shù)體 ...

你好 !您能幫幫我指出那個(gè)地方有問(wèn)題嗎?
然后能不能跟我講一下哪兒改一下  可以讓這個(gè)程序跑起來(lái)
回復(fù)

使用道具 舉報(bào)

ID:462827 發(fā)表于 2020-8-6 19:43 | 顯示全部樓層
你這個(gè)矩陣按鍵掃描和數(shù)碼管顯示的函數(shù)都寫(xiě)得太長(zhǎng)了吧,至少可以縮短一半以上。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2020-8-7 06:49 | 顯示全部樓層
Judehan 發(fā)表于 2020-8-6 14:12
你好 !您能幫幫我指出那個(gè)地方有問(wèn)題嗎?
然后能不能跟我講一下哪兒改一下  可以讓這個(gè)程序跑起來(lái)

給你改正main()函數(shù)名,去掉顯示函數(shù)中的死循環(huán) while(1),去掉按鍵函數(shù)中的錯(cuò)誤和贅句,把顯示函數(shù)放在主函數(shù)中可以勉強(qiáng)跑起來(lái),但離實(shí)用還有很大距離。下面注釋掉的部分基本都是錯(cuò)誤的或與錯(cuò)誤相關(guān)。
  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. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:808700 發(fā)表于 2020-8-7 16:34 | 顯示全部樓層
Judehan 發(fā)表于 2020-8-6 09:08
感謝大佬的支持,非常感謝!可否后續(xù)繼續(xù)關(guān)注我?可以交學(xué)費(fèi)。嗯嗯還是感謝老板做我的明燈

如果需要長(zhǎng)期指點(diǎn)的話,可私聊我
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美精品国产一级在线 | 久久国产日韩欧美 | 日韩福利 | 欧美a级成人淫片免费看 | 人人擦人人干 | 精品美女视频在线观看免费软件 | 中文字幕一区二区三区精彩视频 | 国产h在线 | 免费一区二区三区 | 久久精品一区 | 亚洲精品一区二区三区中文字幕 | 国产在线二区 | 91亚洲国产| 欧美多人在线 | 欧美性生交大片免费 | 在线只有精品 | 亚洲国产精品久久 | 久草视频网站 | 欧美午夜精品久久久久久浪潮 | 日本天堂视频在线观看 | 日日爱av| 日韩视频一区二区三区 | 日韩在线视频网址 | 二区国产 | 久久精品久久久久久 | 午夜男人视频 | 久久久久久看片 | pacopacomama在线 | 成人免费网视频 | 婷婷一级片 | 日韩精品1区2区 | 日韩精品免费视频 | 成人综合在线视频 | 国产乱码精品一区二区三区中文 | 国产片淫级awww | 久久婷婷色 | 日韩三级免费观看 | 亚洲精品成人av | 免费一区| 欧美视频成人 | 国产精品一区二区av |