amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 5077|回复: 19

学习马老师的状态机,自己编写的4个独立键盘。有连_发功能

[复制链接]
发表于 2010-4-3 23:06:11 | 显示全部楼层 |阅读模式
学习了马老师的状态机后自己写的键盘子程序。我觉得用状态机做键盘,最好分开写,一个是键盘检测,别一个是键盘功能。我在学习了马老师的键盘程序后自己写了一个,很好用 。

char key_scan()
{  //键盘子程序
        static char key_state=0,key_time,key_old;
        char key_data,key_return=0;
        P1=P1|0x0f;
        key_data=P1&0x0f;
        switch(key_state)
        {
           case 0:
              if(key_data!=0x0f)
                  {          //有键按下
                            key_state=1;
                          key_old=key_data;
                 }
                  break;
                case 1:
                        if(key_data==key_old)
                        {        //确认键盘
                             key_state=2;
                                 key_time=0;
                                 key_return=1;
                                 switch(key_data)
                                 {
                                         case 0x0e:
                                             key_temp=1;// 启动键
                                                 break;
                                        case 0x0d:
                                                key_temp=2;        //加1键
                                                 break;
                                        case 0x0b:
                                                 key_temp=3; //减1键
                                                 break;
                                        case 0x07:
                                                key_temp=4;        //设置键
                                                 break;
                                    default:
                                             break;
                                 }
                        }
                        else
                        {
                          key_state=0;
                          break;
                        }
                case 2:
                     //
                         if(key_data==0x0f)
                         {        //松开
                           key_state=0;
                           key_temp=0;//无键按下??????????????????????????????????
                //           key_return=1;
                         }
                         else if(++key_time >= 50)                // 按键时间计数
                        {
                                key_state = 3;        // 按下时间>1s,状态转换到计时2
                                key_time = 0;                                // 清按键计数器
                                key_return = 2;                        // 输出"2"
                        }
                        break;
                case 3:
                          //
                        if (key_data==0x0f)
                        {
                                key_state =0;
                            key_temp=0;//无键按下???????????????????????????????????
                        } //按键已释放,转换到按键初始态
                        else
                        {
                                if (++key_time >= 10)                // 按键时间计数
                                {
                                        key_time = 0;                        // 按下时间>0.5s,清按键计数器
                                        key_return = 2;                // 输出"2"
                                }
                        }
                        break;
                }

return(key_return);
}
//键盘处理
void key_down()
{
   key_zt=key_scan();//读键盘
   switch(key_zt)//根据键状态决定功能
                 {
                         case 1:
                         { //        单击
                                 switch(key_temp)
                                 {
                                        case 1:         //开始
                                                do thing;
                                                      break;
                                        case 2:         //单加1
                                                  ci++;
                                               
                                                break;
                                        case 3:        //单减1
                                               
                                                   ci--;
                                                  
                                                break;
                                        case 4:
                                                do thing;
                                                   break;
                                        default :
                                                break;                                 
                                 }
                                }
                                break;
                        case 2:
                                {         //连击
                                  switch(key_temp)
                                          {
                                           case 2:         //连加1
                                                ci++;
                                                                               
                                                break;
                                        case 3:        //连减1
                                               
                                                          ci--;
                                                 
                                                break;
                                        default :
                                           break;
                                  }
                                  }
                                break;
                        default :
                          break;
                 }
}
发表于 2010-4-4 15:54:05 | 显示全部楼层
这是我的AD键盘状态机,也是学马老师的,呵呵
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3956125&bbs_page_no=1&search_mode=3&search_text=Npng&bbs_id=9999
发表于 2011-7-29 14:03:58 | 显示全部楼层
谢谢楼主!!我现在在学习,消化中!!
发表于 2011-7-29 20:19:23 | 显示全部楼层
用这个代码在我板子上试,是51的。为什么单击的时候,步进不是1,而是好多呢?代码不是带了消抖部分了么? 还有就是我用定时器来扫描,必须是20ms一个周期,不然加减键都没反应,,求解释!!
发表于 2011-8-11 16:33:10 | 显示全部楼层
回复【楼主位】yhy630  
-----------------------------------------------------------------------

有连_发功能

能解释连_发的含义吗?怎么样去操作键盘?
发表于 2012-2-16 20:30:09 | 显示全部楼层
mark
发表于 2012-2-16 21:56:17 | 显示全部楼层
回复【5楼】enovo2468  
mark
-----------------------------------------------------------------------
发表于 2012-11-4 21:51:34 | 显示全部楼层
好帖子,谢谢分享
发表于 2013-11-14 17:47:37 | 显示全部楼层
不错,我试了,可以用
发表于 2013-11-14 17:48:05 | 显示全部楼层
不错,我试了,可以用
发表于 2013-12-2 15:47:41 | 显示全部楼层
学习、。。。。
发表于 2014-8-27 21:53:52 | 显示全部楼层
mark,学习!
发表于 2014-9-29 10:06:41 | 显示全部楼层
学习学习。。。
发表于 2014-10-2 22:43:57 | 显示全部楼层
mark.......
发表于 2014-10-3 01:38:08 | 显示全部楼层
下载了学习啦
发表于 2014-10-3 04:59:49 | 显示全部楼层
不错,我试了,可以用.
发表于 2014-10-11 19:44:43 | 显示全部楼层
mark                       
发表于 2014-10-11 19:57:40 | 显示全部楼层
mark,学习了!
发表于 2014-10-12 21:13:19 | 显示全部楼层
如果一个按键短路了,那不是一直停留在 key_state==3 ,并且其它按键也不能够反应?
发表于 2014-11-23 18:36:38 | 显示全部楼层

学习学习。。。
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-18 18:20

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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