搜索
bottom↓
回复: 19

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

[复制链接]

出0入0汤圆

发表于 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;
                 }
}

出0入0汤圆

发表于 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

出0入0汤圆

发表于 2011-7-29 14:03:58 | 显示全部楼层
谢谢楼主!!我现在在学习,消化中!!

出0入0汤圆

发表于 2011-7-29 20:19:23 | 显示全部楼层
用这个代码在我板子上试,是51的。为什么单击的时候,步进不是1,而是好多呢?代码不是带了消抖部分了么? 还有就是我用定时器来扫描,必须是20ms一个周期,不然加减键都没反应,,求解释!!

出0入0汤圆

发表于 2011-8-11 16:33:10 | 显示全部楼层
回复【楼主位】yhy630  
-----------------------------------------------------------------------

有连_发功能

能解释连_发的含义吗?怎么样去操作键盘?

出0入0汤圆

发表于 2012-2-16 20:30:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-16 21:56:17 | 显示全部楼层
回复【5楼】enovo2468  
mark
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-11-4 21:51:34 | 显示全部楼层
好帖子,谢谢分享

出0入0汤圆

发表于 2013-11-14 17:47:37 | 显示全部楼层
不错,我试了,可以用

出0入0汤圆

发表于 2013-11-14 17:48:05 | 显示全部楼层
不错,我试了,可以用

出0入0汤圆

发表于 2013-12-2 15:47:41 | 显示全部楼层
学习、。。。。

出0入0汤圆

发表于 2014-8-27 21:53:52 | 显示全部楼层
mark,学习!

出0入0汤圆

发表于 2014-9-29 10:06:41 | 显示全部楼层
学习学习。。。

出0入0汤圆

发表于 2014-10-2 22:43:57 | 显示全部楼层
mark.......

出0入0汤圆

发表于 2014-10-3 01:38:08 | 显示全部楼层
下载了学习啦

出0入0汤圆

发表于 2014-10-3 04:59:49 | 显示全部楼层
不错,我试了,可以用.

出0入0汤圆

发表于 2014-10-11 19:44:43 | 显示全部楼层
mark                       

出0入0汤圆

发表于 2014-10-11 19:57:40 | 显示全部楼层
mark,学习了!

出0入0汤圆

发表于 2014-10-12 21:13:19 | 显示全部楼层
如果一个按键短路了,那不是一直停留在 key_state==3 ,并且其它按键也不能够反应?

出0入0汤圆

发表于 2014-11-23 18:36:38 | 显示全部楼层

学习学习。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 00:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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