打印

谁能帮我具体分析一下这个按钮扫描程序的含义(em78p153s)

[复制链接]
1565|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Jimmy_zjd|  楼主 | 2013-6-26 08:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        按键扫描
;==========================================
KEY_SCAN:
                JBS                B_TCCINT1
                RET
                BC                B_TCCINT1
                ;
                JBC                P_KEY
                JMP                KEY_RELEASE
                ;
                INC                KEY_COUNT1
                MOV                A,@15
                SUB                A,KEY_COUNT1
                JBS                C
                RET
                CLR                KEY_COUNT1                        ;30ms
                CLR                KEY_COUNT2
                ;
                JBC                B_ENKEY
                RET
                BS                B_ENKEY
                ;
                INC                KEY_MODE
                MOV                A,@3
                SUB                A,KEY_MODE
                JBC                C
                CLR                KEY_MODE
SCAN_MODE1:
                MOV                A,KEY_MODE
                JBS                Z
                JMP                SCAN_MODE2
                BC                0X06.0
                BS                0X06.1
                RET
SCAN_MODE2:
                MOV                A,@1
                XOR                A,KEY_MODE
                JBS                Z
                JMP                SCAN_MODE3
                BC      0X06.1
                ;BC                0X06.0
                BS      0X06.0
                ;BS                0X06.1
                RET
SCAN_MODE3:
               
                BS                0X06.0
               
                BS                0X06.1
                RET
                ;
KEY_RELEASE:
                INC                KEY_COUNT2
                MOV                A,@15
                SUB                A,KEY_COUNT2
                JBS                C
                RET
                CLR                KEY_COUNT1
                CLR                KEY_COUNT2
                BC                B_ENKEY
                RET

相关下载

相关帖子

沙发
airwill| | 2013-6-26 12:25 | 只看该作者
搞一堆代码, 还没有注释, 呵呵
幸好不长, 还是自己分析吧

使用特权

评论回复
板凳
xtpi| | 2013-6-26 12:30 | 只看该作者
这么一点代码不算什么罗,给有缘人的呀,懂的人一看就明白,代码注释并不是每一行都得写呀,一个小模块或者功能才写一个注释就够罗

使用特权

评论回复
地板
Jimmy_zjd|  楼主 | 2013-6-26 13:21 | 只看该作者
airwill 发表于 2013-6-26 12:25
搞一堆代码, 还没有注释, 呵呵
幸好不长, 还是自己分析吧

不好意思,忘记了,它的相关变量定义如下:;        引脚定义
;--------------------------------------------
        P_KEY                        ==                0X06.2
;--------------------------------------------
;        变量位定义
;--------------------------------------------
        B_TCCINT1                ==                0X10.0
        B_TCCINT2                ==                0X10.1
        B_ENKEY                        ==                0X10.2
       
;--------------------------------------------
;        变量定义
;--------------------------------------------
        REG_ACC                        ==                0X12                ;缓存
        A_BUFFER                ==                0X13
        R3_BUFFER                ==                0X14
        R4_BUFFER                ==                0X15
        ;
        KEY_COUNT1                ==                0X16
        KEY_COUNT2                ==                0X17
        KEY_MODE                ==                0X18

使用特权

评论回复
5
Jimmy_zjd|  楼主 | 2013-6-26 13:26 | 只看该作者
xtpi 发表于 2013-6-26 12:30
这么一点代码不算什么罗,给有缘人的呀,懂的人一看就明白,代码注释并不是每一行都得写呀,一个小模块或者 ...

因为刚进入单片机这一行,所以很多地方不明白其这样做的目的和必要性,所以才想请单片机行业里的前辈们指教一下。谢谢

使用特权

评论回复
6
Jimmy_zjd|  楼主 | 2013-6-27 09:23 | 只看该作者
怎么回事?这人呢?都没伸手的。

使用特权

评论回复
7
hopewise| | 2013-6-27 15:38 | 只看该作者
义隆没弄过,大约是这样的
按键扫描
;==========================================
KEY_SCAN:
                JBS                B_TCCINT1         //位变量B_TCCINT1等于1吗?
                RET                                  //不是,则返回
                BC                B_TCCINT1          //是的,则清零
                ;
                JBC                P_KEY             //P_KEY按键按下吗?
                JMP                KEY_RELEASE       //没有,则调到KEY_RELEASE判断按键是否真正弹起
                ;
                INC                KEY_COUNT1        //是的,则按键按下的次数变量加一
                MOV                A,@15            
                SUB                A,KEY_COUNT1      
                JBS                C                 //够15次(即30ms=15*2ms)吗?  
                RET                                  //不到,则返回
                CLR                KEY_COUNT1        //够了,则清按键按下的次数变量               
                CLR                KEY_COUNT2        
                ;
                JBC                B_ENKEY           //B_ENKEY按键按下吗?
                RET                                  //没有,则返回
                BS                B_ENKEY            //是的
                ;
                INC                KEY_MODE
                MOV                A,@3
                SUB                A,KEY_MODE
                JBC                C                 //按下次数够3次吗?
                CLR                KEY_MODE          //是的,则清KEY_MODE变量
SCAN_MODE1:
                MOV                A,KEY_MODE
                JBS                Z                 //B_ENKEY是第3次按下吗?
                JMP                SCAN_MODE2        //不是,则调到SCAN_MODE2
                BC                0X06.0             //是的,则清0X06的位0
                BS                0X06.1
                RET
SCAN_MODE2:
                MOV                A,@1
                XOR                A,KEY_MODE
                JBS                Z                //B_ENKEY是第1次按下吗?
                JMP                SCAN_MODE3       //不是,则调到SCAN_MODE3
                BC      0X06.1                      //是的,则清0X06的位0
                ;BC                0X06.0
                BS      0X06.0                      //0X06的位1置1
                ;BS                0X06.1
                RET                                 //返回
SCAN_MODE3:
               
                BS                0X06.0             //0X06的位0置1
               
                BS                0X06.1             //0X06的位1置1
                RET                                  //返回
                ;
KEY_RELEASE:                                         //按键弹起判断
                INC                KEY_COUNT2
                MOV                A,@15
                SUB                A,KEY_COUNT2
                JBS                C                 //按键弹起时间够30ms吗?
                RET                                  //没到,则返回
                CLR                KEY_COUNT1        //清KEY_COUNT1变量
                CLR                KEY_COUNT2
                BC                 B_ENKEY           //置B_ENKEY引脚为0
                RET                                  //返回

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Jimmy_zjd + 1 分析得很好,谢
8
Jimmy_zjd|  楼主 | 2013-6-28 14:35 | 只看该作者
hopewise 发表于 2013-6-27 15:38
义隆没弄过,大约是这样的
按键扫描
;==========================================

SCAN_MODE1就是按第一次吗?如果是,它为什么不是检测说是不是第一次按下,而直接就检测是不是第三次按下。第一次按下时输出口的状态怎样?在SCAN_MODE2时为什么又是检测是不是第一次按下?它应该检测是不是第二次按下呀。第二次按下它的输出状态又是怎样呢?还有SCAN_MODE3,它直接就是P60,P61口置1,为什么?就按它这程序,按第一下,按第二下,按第三下它的两个输出口分别是怎样的状态?请大师帮忙解答。谢谢了。

使用特权

评论回复
9
Jimmy_zjd|  楼主 | 2013-7-2 16:55 | 只看该作者
本帖最后由 Jimmy_zjd 于 2013-7-2 17:07 编辑

自己搞定了。呵呵。不过 hopewise网友给了很大帮助,谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝