找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5928|回复: 2
收起左侧

关于一键多功能的问题,帮忙看看,谢过!!!

[复制链接]
ID:9596 发表于 2009-4-24 02:00 | 显示全部楼层 |阅读模式

;*****************************************************************
;开关SP1接在P1.0管脚上,在AT89C51单片机的P0端口接有四个发光二极管,上电的时候,
;L1接在P0.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P0.1管脚上的发光二极管在闪烁,
;再按下开关SP1的时候,L3接在P0.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,
;L4接在P0.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去
;***************************************************************************************
        ORG 0000H
        AJMP MAIN
 MAIN:  MOV R0,#0 

   ST1: MOV P0,#0FEH;           灯L1闪烁
        LCALL DE1;                   调用延时子程序
        MOV P0,#0FFH;
        LCALL DE1;                   调用延时子程序
       LCALL CHECK;                调用按键扫描程序


    ST2:MOV P0,#0FDH;           灯L2闪烁
        LCALL DE1;
        MOV P0,#0FFH;
        LCALL DE1;
 LCALL CHECK

    ST3:MOV P0,#0FBH;          灯L3闪烁
        LCALL DE1;
        MOV P0,#0FFH;
        LCALL DE1;
 LCALL CHECK

    ST4:MOV P0,#0F7H;          灯L4闪烁
        LCALL DE1;
        MOV P0,#0FFH;
        LCALL DE1;
 LCALL CHECK
CHECK:
 ;*******************************
;判断按键有没有按下及按了几次,即按键的识别
;********************************
 CHECK1:JB P1.0,L1;                              按下键了吗?
        LCALL DE2;
        JB P1.0,CHECK1;                            真的按下了吗?
 CHECK2:JNB P1.0,CHECK2;                    等待释放,释放了吗?
        LCALL DE2;
        JNB P1.0,CHECK2;                          真的释放了吗?
;*********************************
        INC R0;                                          R0的值加1
     L1:CJNE R0,#1,L2;                             R0的值为1吗?不为1,继续判断
        AJMP ST2;                                       为1,灯L2开始闪烁
     L2:CJNE R0,#2,L3;                             R0的值为2吗?不为2,继续判断
        AJMP ST3;                                       为2,灯L3开始闪烁
     L3:CJNE R0,#3,L4;                              R0的值为1吗?不为1,继续判段
        AJMP ST4;                                       为3,灯L4开始闪烁
     L4:CJNE R0,#4,ST1;                            R0的值为1吗?不为1,继续判断
        LJMP MAIN ;                                     为4,返回主程序,
  DE1:  MOV R5,#20
LOOP2: LCALL DE2;           调用延时10ms子程序
       DJNZ R5,LOOP2
       RET

  DE2: MOV R6,#20 ;延时10ms子程序
   L5: MOV R7,#248
       DJNZ R7,$
       DJNZ R6,L5
       RET
      END



程序在板子上调试的时候,发现按键按快了似乎来不及识别啊,要按下去一会会儿再松开才行,不过按了十几次之后发现灯L1变成常亮的了,不再闪烁,这时候随便怎么按也没有反应了,不知道怎么回事,希望各位帮忙指导指导,感激……

回复

使用道具 举报

ID:9972 发表于 2009-4-24 21:37 | 显示全部楼层
再看下按键去抖的程序,貌似有问题,判定确实按下再跳转,你的貌似先跳转再判断了。。。。
回复

使用道具 举报

ID:9596 发表于 2009-4-25 23:40 | 显示全部楼层

我请教过别人了,问题已经解决,程序也修改好了,不过也感谢你的帮忙。他说是按键的灵敏度太低,主要原因是程序延时时间过长。也就导致在一定时间内检测按键的次数很少,所以会出现按下按键却没有检测到的现象,只要想办法提高检测按键的频率就可以了;不过关于 “按了十几次之后发现灯L1变成常亮的了,不再闪烁”这个问题,他说是程序死机,原因是程序跑飞了,我不明白,程序为什么会跑飞,哪些情况会导致程序跑飞呢?得百度一下了,呵呵!谢谢

[此贴子已经被作者于2009-4-26 0:00:08编辑过]
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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