找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5235|回复: 4
收起左侧

独立键盘循环,自己用汇编写的,烧录后就是按键没反应

[复制链接]
ID:53308 发表于 2013-8-26 23:51 | 显示全部楼层 |阅读模式
                        程序在keil中模拟没找出问题来,但是下载到单片机里面就是运行不了,
                    键盘是p3.0-3.3    ,led灯是p2.0-p2.3,想实现按p3.0一下,p2.0点亮\或者灭。其他按键类推。烧录后,没实现功能,具体为按键后灯没任何反应。

                        ORG 0000H               
                        AJMP START
                        ORG 0080H

                        START:
                        MOV P2,#0FFH       ;全灭p2口led
                          MOV P3,#0FFH;使得P3口全部高电平,准备独立按键初始状态

                          KEYCHECK1:                ;按键检查是否有1->0,改变
                          MOV A,#00H                ;清0累加器内数值
                          JNB P3.0,        DELAY
                           JNB P3.1,DELAY
                                JNB P3.2,DELAY
                                 JNB P3.3,DELAY
                                  LJMP KEYCHECK1
                          
                          KEYCHECK2:                 ;延时后,是否还保持低电平,是则调用键盘释放程序,否则跳到keycheck1
                           JNB P3.0,LOOP                 
                            JNB P3.1,LOOP
                                 JNB P3.2,LOOP
                                  JNB P3.3,LOOP
                                        LJMP START


                           DELAY:                           ;延时程序,目的为消除机械抖动
               MOV R7,#100
                D1: MOV R6,#100
                 DJNZ R6,$
                   DJNZ R7,D1
                                   LJMP KEYCHECK2

                           LOOP:                                  ;判断键盘是否释放,是则继续,否则跳到loop做自动循环
                             MOV A,P3                          ;给A输入p3状态
                         D2:
                                 MOV R1,P3                          ;用r1和ff比较大小,从而判断是否释放
                CJNE R1,#0FFH,D2               
                            JNB ACC.0,K1                 ;判断那个键按下,点亮那个灯,a一直带P3的值
                                 JNB ACC.1,K2
                                  JNB ACC.2,K3
                                   JNB ACC.3,K4
                                   LJMP START

                                K1:                                   ;取反输出口,点亮和熄灭灯
                                CPL P2.0
                                LJMP START
                                K2:
                                CPL P2.1
                                LJMP START
                                K3:
                                CPL P2.2
                                LJMP START
                                K4:
                                CPL P2.3                               
                                LJMP START

                                END



键盘接法

键盘接法
回复

使用道具 举报

ID:18297 发表于 2013-8-27 21:25 | 显示全部楼层
                         ORG 0000H               
                     AJMP START

                     ORG 0080H
START:                MOV P2,#0FFH
                 
KEY1:                MOV A,P3
                        CJNE A,#0FFH,KEY2
                        AJMP KEY1
KEY2:                ACALL DELAY       
                        MOV A,P3
                        CJNE A,#0FFH,KEY3
                        AJMP KEY1
KEY3:                 MOV R0,P3
                       
KEY4:                MOV A,P3
                        CJNE A,#0FFH,KEY4
                        MOV A,R0
                        CJNE A,#0FEH,KEY01
                        CPL P2.0
KEY01:                CJNE A,#0FDH,KEY02
                        CPL P2.1
KEY02:                 CJNE A,#0FBH,KEY03
                        CPL P2.2
KEY03:                CJNE A,#0F7H,KEY1
                        CPL P2.3
            AJMP KEY1


  DELAY:          MOV R7,#100                                                                ;延时程序,目的为消除机械抖动
  D1:                 MOV R6,#100                                                          
            DJNZ R6,$
            DJNZ R7,D1
                        RET
                       
                        END
自己看看,这个仿真过。
回复

使用道具 举报

ID:7485 发表于 2013-8-28 08:35 | 显示全部楼层
本帖最后由 ahshmj 于 2013-8-28 08:37 编辑

第一次看见这样的按键程序。
KEYCHECK1:               
                  JNB P3.0,      K1
                           JNB P3.1,      K2
                           JNB P3.2,      K3
                           JNB P3.3,      K4
                           JMP KEYCHECK1
K1:
                           CALL    DELAY                     ;延时
                           JB P3.0,      START            ;再次确认不是误动作
                          CPL P2.0                            ;执行按键功能
                           JNB   P3.0,      $                   ;等待按键抬起
                           LJMP START                       返回
K2:
                 ......
K3:     
                 ......
K4                    
                         ......

回复

使用道具 举报

ID:53308 发表于 2013-8-28 09:42 | 显示全部楼层
已经解决了,是因为  
“       CJNE R1,#0FFH,D2       ”
中的比较出问题,我将p3状态给了r1,然后和0ff比较,实际上P3高四位是做别的用途,状态不定的。
所以改成如下,屏蔽掉高四位:
                         D2:
                                 MOV A,P3                          ;用r1和ff比较大小,从而判断是否释放
                                 ANL A,#0FH
                CJNE A,#0FH,D2

再烧录就可以了。
回复

使用道具 举报

ID:153199 发表于 2017-2-17 13:38 | 显示全部楼层
学习了, 很不错的经验,值得分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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