第十四节:矩阵键盘的单个触发。(下)

  1.  case 8:     //此处的小延时用来等待刚才列输出信号稳定,再判断输入信号。不是去抖动延时。  
  2.           uiKeyTimeCnt++;  
  3.                   if(uiKeyTimeCnt>1)  
  4.                   {  
  5.                      uiKeyTimeCnt=0;  
  6.              ucKeyStep++;     //切换到下一个运行步骤  
  7.                   }  
  8.               break;  
  9.   
  10.      case 9:  
  11.           if(key_sr1==1&&key_sr2==1&&key_sr3==1&&key_sr4==1)  
  12.           {    
  13.              ucKeyStep++;  //如果没有按键按下,切换到下一个运行步骤  
  14.              ucKeyLock=0;  //按键自锁标志清零  
  15.              uiKeyTimeCnt=0; //按键去抖动延时计数器清零,此行非常巧妙          
  16.   
  17.           }  
  18.                   else if(ucKeyLock==0)  //有按键按下,且是第一次触发  
  19.                   {  
  20.                      if(key_sr1==0&&key_sr2==1&&key_sr3==1&&key_sr4==1)  
  21.                          {  
  22.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  23.                                 if(uiKeyTimeCnt>const_key_time)  
  24.                                 {  
  25.                                    uiKeyTimeCnt=0;  
  26.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  27.                                    ucKeySec=3;  //触发3号键 对应朱兆祺学习板的S3键  
  28.                                 }  
  29.                            
  30.                          }  
  31.                      else if(key_sr1==1&&key_sr2==0&&key_sr3==1&&key_sr4==1)  
  32.                          {  
  33.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  34.                                 if(uiKeyTimeCnt>const_key_time)  
  35.                                 {  
  36.                                    uiKeyTimeCnt=0;  
  37.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  38.                                    ucKeySec=7;  //触发7号键 对应朱兆祺学习板的S7键  
  39.                                 }  
  40.                            
  41.                          }  
  42.                      else if(key_sr1==1&&key_sr2==1&&key_sr3==0&&key_sr4==1)  
  43.                          {  
  44.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  45.                                 if(uiKeyTimeCnt>const_key_time)  
  46.                                 {  
  47.                                    uiKeyTimeCnt=0;  
  48.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  49.                                    ucKeySec=11;  //触发11号键 对应朱兆祺学习板的S11键  
  50.                                 }  
  51.                            
  52.                          }  
  53.                      else if(key_sr1==1&&key_sr2==1&&key_sr3==1&&key_sr4==0)  
  54.                          {  
  55.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  56.                                 if(uiKeyTimeCnt>const_key_time)  
  57.                                 {  
  58.                                    uiKeyTimeCnt=0;  
  59.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  60.                                    ucKeySec=15;  //触发15号键 对应朱兆祺学习板的S15键  
  61.                                 }  
  62.                            
  63.                          }  
  64.                     
  65.                   }  
  66.               break;  
  67.   
  68.      case 10:   //按键扫描输出第四列低电平  
  69.           key_dr1=1;        
  70.           key_dr2=1;  
  71.           key_dr3=1;      
  72.           key_dr4=0;  
  73.   
  74.           uiKeyTimeCnt=0;  //延时计数器清零  
  75.           ucKeyStep++;     //切换到下一个运行步骤  
  76.               break;  
  77.   
  78.      case 11:     //此处的小延时用来等待刚才列输出信号稳定,再判断输入信号。不是去抖动延时。  
  79.           uiKeyTimeCnt++;  
  80.                   if(uiKeyTimeCnt>1)  
  81.                   {  
  82.                      uiKeyTimeCnt=0;  
  83.              ucKeyStep++;     //切换到下一个运行步骤  
  84.                   }  
  85.               break;  
  86.   
  87.      case 12:  
  88.           if(key_sr1==1&&key_sr2==1&&key_sr3==1&&key_sr4==1)  
  89.           {    
  90.              ucKeyStep=1;  //如果没有按键按下,返回到第一步,重新开始扫描  
  91.              ucKeyLock=0;  //按键自锁标志清零  
  92.              uiKeyTimeCnt=0; //按键去抖动延时计数器清零,此行非常巧妙          
  93.   
  94.           }  
  95.                   else if(ucKeyLock==0)  //有按键按下,且是第一次触发  
  96.                   {  
  97.                      if(key_sr1==0&&key_sr2==1&&key_sr3==1&&key_sr4==1)  
  98.                          {  
  99.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  100.                                 if(uiKeyTimeCnt>const_key_time)  
  101.                                 {  
  102.                                    uiKeyTimeCnt=0;  
  103.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  104.                                    ucKeySec=4;  //触发4号键 对应朱兆祺学习板的S4键  
  105.                                 }  
  106.                            
  107.                          }  
  108.                      else if(key_sr1==1&&key_sr2==0&&key_sr3==1&&key_sr4==1)  
  109.                          {  
  110.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  111.                                 if(uiKeyTimeCnt>const_key_time)  
  112.                                 {  
  113.                                    uiKeyTimeCnt=0;  
  114.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  115.                                    ucKeySec=8;  //触发8号键 对应朱兆祺学习板的S8键  
  116.                                 }  
  117.                            
  118.                          }  
  119.                      else if(key_sr1==1&&key_sr2==1&&key_sr3==0&&key_sr4==1)  
  120.                          {  
  121.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  122.                                 if(uiKeyTimeCnt>const_key_time)  
  123.                                 {  
  124.                                    uiKeyTimeCnt=0;  
  125.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  126.                                    ucKeySec=12;  //触发12号键 对应朱兆祺学习板的S12键  
  127.                                 }  
  128.                            
  129.                          }  
  130.                      else if(key_sr1==1&&key_sr2==1&&key_sr3==1&&key_sr4==0)  
  131.                          {  
  132.                             uiKeyTimeCnt++;  //去抖动延时计数器  
  133.                                 if(uiKeyTimeCnt>const_key_time)  
  134.                                 {  
  135.                                    uiKeyTimeCnt=0;  
  136.                                    ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零  
  137.                                    ucKeySec=16;  //触发16号键 对应朱兆祺学习板的S16键  
  138.                                 }  
  139.                            
  140.                          }  
  141.                     
  142.                   }  
  143.               break;  
  144.   
  145.     
  146.   }  
  147.   
  148.   
  149. }  
  150.   
  151.   
  152. void key_service() //第三区 按键服务的应用程序  
  153. {  
  154.   switch(ucKeySec) //按键服务状态切换  
  155.   {  
  156.     case 1:// 1号键 对应朱兆祺学习板的S1键  
  157.   
  158.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  159.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  160.           break;          
  161.     case 2:// 2号键 对应朱兆祺学习板的S2键  
  162.   
  163.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  164.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  165.           break;       
  166.     case 3:// 3号键 对应朱兆祺学习板的S3键  
  167.   
  168.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  169.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  170.           break;            
  171.     case 4:// 4号键 对应朱兆祺学习板的S4键  
  172.   
  173.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  174.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  175.           break;     
  176.     case 5:// 5号键 对应朱兆祺学习板的S5键  
  177.   
  178.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  179.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  180.           break;     
  181.     case 6:// 6号键 对应朱兆祺学习板的S6键  
  182.   
  183.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  184.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  185.           break;     
  186.     case 7:// 7号键 对应朱兆祺学习板的S7键  
  187.   
  188.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  189.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  190.           break;     
  191.     case 8:// 8号键 对应朱兆祺学习板的S8键  
  192.   
  193.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  194.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  195.           break;     
  196.     case 9:// 9号键 对应朱兆祺学习板的S9键  
  197.   
  198.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  199.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  200.           break;     
  201.     case 10:// 10号键 对应朱兆祺学习板的S10键  
  202.   
  203.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  204.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  205.           break;     
  206.     case 11:// 11号键 对应朱兆祺学习板的S11键  
  207.   
  208.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  209.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  210.           break;     
  211.     case 12:// 12号键 对应朱兆祺学习板的S12键  
  212.   
  213.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  214.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  215.           break;     
  216.     case 13:// 13号键 对应朱兆祺学习板的S13键  
  217.   
  218.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  219.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  220.           break;     
  221.     case 14:// 14号键 对应朱兆祺学习板的S14键  
  222.   
  223.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  224.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  225.           break;     
  226.     case 15:// 15号键 对应朱兆祺学习板的S15键  
  227.   
  228.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  229.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  230.           break;     
  231.     case 16:// 16号键 对应朱兆祺学习板的S16键  
  232.   
  233.           uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。  
  234.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
  235.           break;     
  236.   }                  
  237. }  
  238.   
  239.   
  240.   
  241. void T0_time() interrupt 1  
  242. {  
  243.   TF0=0;  //清除中断标志  
  244.   TR0=0; //关中断  
  245.   
  246.   key_scan(); //按键扫描函数  
  247.   
  248.   if(uiVoiceCnt!=0)  
  249.   {  
  250.      uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫  
  251.          beep_dr=0;  //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。  
  252.   }  
  253.   else  
  254.   {  
  255.      ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。  
  256.            beep_dr=1;  //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。  
  257.   }  
  258.   
  259.   
  260.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f  
  261.   TL0=0x2f;  
  262.   TR0=1;  //开中断  
  263. }  
  264.   
  265.   
  266. void delay_long(unsigned int uiDelayLong)  
  267. {  
  268.    unsigned int i;  
  269.    unsigned int j;  
  270.    for(i=0;i<uiDelayLong;i++)  
  271.    {  
  272.       for(j=0;j<500;j++)  //内嵌循环的空指令数量  
  273.           {  
  274.              ; //一个分号相当于执行一条空语句  
  275.           }  
  276.    }  
  277. }  
  278.   
  279.   
  280. void initial_myself()  //第一区 初始化单片机  
  281. {  
  282.   
  283.   
  284.   beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。  
  285.   
  286.   
  287.   TMOD=0x01;  //设置定时器0为工作方式1  
  288.   
  289.   
  290.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f  
  291.   TL0=0x2f;  
  292.   
  293. }  
  294. void initial_peripheral() //第二区 初始化外围  
  295. {  
  296.   EA=1;     //开总中断  
  297.   ET0=1;    //允许定时中断  
  298.   TR0=1;    //启动定时中断  
  299.   
  300. }  

 

总结陈词:
    在这一节中,有的人咋看我的按键扫描代码,会觉得代码太多了。我一直认为,只要单片机容量够,代码多一点少一点并不重要,只要不影响运行效率就行。而且有时候,代码写多一点,可读性非常强,修改起来也非常方便。如果一味的追求压缩代码,就会刻意用很多循环,数组等元素,代码虽然紧凑了,但是可分离性,可改性,可读性就没那么强。我说那么多并不是因为我技术有限而不懂压缩,就找个借口敷衍大家,不信?我下一节把这节的代码压缩一下分享给大家。凡是相似度高的那部分代码都可以压缩,具体怎么压缩?欲知详情,请听下回分解-----矩阵键盘单个触发的压缩代码编程。

(上半部分http://www.eeskill.com/group/topic_scan/id/465

永不止步步 发表于11-20 14:13 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:381041个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号