找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3702|回复: 1
打印 上一主题 下一主题
收起左侧

PIC单片机开发板之矩阵键盘扫描(if()else嵌套方式)

[复制链接]
跳转到指定楼层
楼主
ID:103513 发表于 2016-1-17 02:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   /*
为自已写的矩阵键盘检测+数码管显示+蜂鸣器响
采用if().....else嵌套方式;编译通过,却后二列显示不出来(你找出来了吗?一个不算问题的问题)
*/
//----------------------------------------------------------------
  1. #include <pic.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. __CONFIG(0x3B31);
  5. const unsigned char table[] = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //数码管数组
  6. //--------------------变量定义------------------------------------
  7. uint keynum,keytem,num;  //定义变量,//keynum按键端口读回值,keytem为松手检测值(以示区分),num数码管
  8. //--------------------函数调用 声明-------------------------------
  9. void init();    //初始化函数
  10. void keyscan();    //矩阵键盘扫描
  11. void didi(uchar dinum);  //蜂鸣器
  12. void disp();  //数码管显示
  13. //-------------------主函数---------------------------------------
  14. void delay(x)  //延时函数,几乎每个程序都要用到,所以放在了主函数分界线内
  15. {
  16. uchar a,b;
  17. for (a=x;a>0;a--)
  18. for(b=110;b>0;b--);
  19. }

  20. void main()
  21. {
  22. init();  //初始化
  23. while(1)
  24. {
  25. keyscan(); //矩阵键盘扫描
  26. disp();  //数码管显示
  27. }
  28. }
  29. //------------初始化函数-------------------------------------------
  30. void init()
  31. {
  32. TRISA=0;PORTA=0x02; //38译码器

  33. TRISB=1;                       //矩阵键盘

  34. TRISC=0;PORTC=0x01;; //38使能
  35. TRISD=0;PORTD=0x00;  //LED灯(数码管)
  36. TRISE=0;PORTE=0x00;  //蜂鸣器
  37. }
  38. //----------要调用的函数--------------------------------------------
  39. void keyscan()
  40. {                           //第一列扫描

  41. PORTB=0xef;     //送出RB4=1110  1111
  42. keynum=PORTB;   

  43. keynum=keynum&0x0f;

  44. if(keynum!=0xef)   

  45. {
  46.   delay(5);   

  47.   keynum=PORTB;   

  48.   keynum=keynum&0x0f;
  49.   if(keynum!=0x0f)  

  50.   {
  51.    keytem=keynum;

  52.    didi(1);
  53.    while(keytem!=0x0f)

  54.     {
  55.     keytem=PORTB;
  56.     keytem=keytem&0x0f;

  57.     }
  58.   keynum=keynum|0xe0;  

  59.   }

  60. else       //第二列扫描
  61.   {
  62.   PORTB=0xdf;     

  63.   keynum=PORTB;   

  64.   keynum=keynum&0x0f;

  65.   if(keynum!=0xdf)  

  66.    {
  67.    delay(5);  

  68.    keynum=PORTB;  

  69.    keynum=keynum&0x0f;
  70.    if(keynum!=0x0f)  

  71.     {
  72.     keytem=keynum;  

  73.     didi(1);
  74.     while(keytem!=0x0f)

  75.      {
  76.      keytem=PORTB;
  77.      keytem=keytem&0x0f;

  78.      }
  79.    keynum=keynum|0xd0;  

  80.     }
  81.    }
  82.   else      

  83.      {
  84.    PORTB=0xbf;     

  85.    keynum=PORTB;   

  86.    keynum=keynum&0x0f;

  87.    if(keynum!=0xbf)  

  88.    {
  89.     delay(5);  

  90.     keynum=PORTB;   

  91.     keynum=keynum&0x0f;
  92.     if(keynum!=0x0f)

  93.      {
  94.      keytem=keynum;  

  95.      didi(1);
  96.      while(keytem!=0x0f)

  97.       {
  98.       keytem=PORTB;
  99.       keytem=keytem&0x0f;

  100.       }
  101.     keynum=keynum|0xb0;  

  102.      }
  103.    
  104.     else       //第四列扫描
  105.      {
  106.      PORTB=0x7f;   

  107.      keynum=PORTB;   

  108.      keynum=keynum&0x0f;

  109.      if(keynum!=0x7f)

  110.       {
  111.       delay(5);   

  112.       keynum=PORTB;  

  113.       keynum=keynum&0x0f;
  114.       if(keynum!=0x0f)

  115.        {
  116.        keytem=keynum;  

  117.        didi(1);
  118.        while(keytem!=0x0f)

  119.         {
  120.         keytem=PORTB;
  121.         keytem=keytem&0x0f;

  122.         }
  123.       keynum=keynum|0x70;   

  124.        }
  125.       }
  126.      } ////////

  127.    }
  128.   }
  129. }
  130.   }
  131. }

  132. void didi(uchar dinum)
  133. {
  134. uchar di_num;
  135. for(di_num=dinum;di_num>0;di_num--)
  136. {
  137. RE0=1;
  138. delay(100);
  139. RE0=0;
  140. delay(50);
  141. }
  142. }

  143. void disp()
  144. {
  145. switch(keynum)
  146. {
  147. case 0xee:PORTD=table[1];break;
  148. case 0xed:PORTD=table[2];break;
  149. case 0xeb:PORTD=table[3];break;
  150. case 0xe7:PORTD=table[4];break;
  151. case 0xde:PORTD=table[5];break;
  152. case 0xdd:PORTD=table[6];break;
  153. case 0xdb:PORTD=table[7];break;
  154. case 0xd7:PORTD=table[8];break;
  155. case 0xbe:PORTD=table[9];break;
  156. case 0xbd:PORTD=table[10];break;
  157. case 0xbb:PORTD=table[11];break;
  158. case 0xb7:PORTD=table[12];break;
  159. case 0x7e:PORTD=table[13];break;
  160. case 0x7d:PORTD=table[14];break;
  161. case 0x7b:PORTD=table[15];break;
  162. case 0x77:PORTD=table[0];break;
  163. }
  164. }
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96943 发表于 2017-10-11 15:35 | 只看该作者
看的我眼花,楼主来说说吧,好让我长点经验。我也碰到PIC单片机if语句嵌套到第二层就不能进入的情况
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表