• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

51编写程序按键的问题

大侠们教教我




    谢谢了
全部回复(29)
正序查看
倒序查看
yxdz
LV.7
2
2008-04-04 16:11
大侠你们知道吗
0
回复
yxdz
LV.7
3
2008-04-05 13:14
@yxdz
大侠你们知道吗
还在等啊
0
回复
yxdz
LV.7
4
2008-04-05 19:19
@yxdz
还在等啊
呜呜
0
回复
yxdz
LV.7
5
2008-04-06 08:33
@yxdz
还在等啊
哦,现在正遇清明小长假    可能大侠们都旅游了,希望你们回来帮我看看啊
0
回复
2008-04-06 13:49
@yxdz
哦,现在正遇清明小长假    可能大侠们都旅游了,希望你们回来帮我看看啊
真晕,你这个思路有点乱.

先申明,我也不是DX,只是比你先学几天.

不同的扫描方法应做成不同的子程序.在初始化后主程序里通过扫锚按键来判定调用哪一组子程序.这样明白了吗?
0
回复
2008-04-06 14:00
@yxdz
哦,现在正遇清明小长假    可能大侠们都旅游了,希望你们回来帮我看看啊
如果你想实时控制,可以用定时中断去扫描按键.
0
回复
chirituzi
LV.1
8
2008-04-12 16:50
你可以按键用中断来实现,每一个功能模块里加几条条件转移指令
例如主程序起始(f0是51单片机里面的psw中用户可以用程序自己定义的标志位)
setb f0 ;软件标志位置1, 功能1里面在适当的位置加几条(jnb f0,功能2)判转移语句,f0为0则跳转至功能2,为1则顺序执行下一条,功能2里面在适当的位置加几条(jb f0,功能3)语句,功能3里的判转移语句和功能1里的相同,功能4里的和功能2里的判转移语句相同,依次类推,修改一下出口参数就可以了
例如按键定义为中断0 则按键按下后去执行中断0的程序
中断0的程序为:
wint0: cpl f0  ;(取反f0)
         nop
        reti
大概程序可以设计成这样:
org 0000h
ajmp:main
org 0003h  ;外中断0入口地址
ljmp wint0
  .
  .
  .
  .
org  0030h
main:
定义中断0,开中断,开中断0
gongneng1:
这里是功能1程序区
适当的位置加几条条件判转移指令可以自己随意安排
   jnb f0,gongneng2    ;自己愿意加几条就加几条
   .
    .
    .
ajmp gongneng1
gongneng2:
这里是功能2程序区
适当的位置加几条条件判转移指令可以自己随意安排
   .
   .
jb f0,gongneng3
   .
ajmp gongneng2
gongneng3:
这里是功能3程序区
适当的位置加几条条件判转移指令可以自己随意安排
   .
   .
jnb f0,gongneng4
   .  
ajmp gongneng3
gongneng4:
这里是功能4程序区
适当的位置加几条条件判转移指令可以自己随意安排
   .
jb f0,gongneng5  
   .
ajmp gongneng4

wint0:
     cpl f0
     nop
     reti

end
朋友这样应该可以了,不行的话加我qq:63892347
邮箱: chirituzi@126.com
0
回复
yxdz
LV.7
9
2008-04-12 20:57
@chirituzi
你可以按键用中断来实现,每一个功能模块里加几条条件转移指令例如主程序起始(f0是51单片机里面的psw中用户可以用程序自己定义的标志位)setbf0;软件标志位置1,功能1里面在适当的位置加几条(jnbf0,功能2)判转移语句,f0为0则跳转至功能2,为1则顺序执行下一条,功能2里面在适当的位置加几条(jbf0,功能3)语句,功能3里的判转移语句和功能1里的相同,功能4里的和功能2里的判转移语句相同,依次类推,修改一下出口参数就可以了例如按键定义为中断0则按键按下后去执行中断0的程序中断0的程序为:wint0:cplf0  ;(取反f0)        nop        reti大概程序可以设计成这样:org0000hajmp:mainorg0003h  ;外中断0入口地址ljmpwint0  .  .  .  .org  0030hmain:定义中断0,开中断,开中断0gongneng1:这里是功能1程序区适当的位置加几条条件判转移指令可以自己随意安排  jnbf0,gongneng2    ;自己愿意加几条就加几条  .    .    .ajmpgongneng1gongneng2:这里是功能2程序区适当的位置加几条条件判转移指令可以自己随意安排  .  .jbf0,gongneng3  .ajmpgongneng2gongneng3:这里是功能3程序区适当的位置加几条条件判转移指令可以自己随意安排  .  .jnbf0,gongneng4  .  ajmpgongneng3gongneng4:这里是功能4程序区适当的位置加几条条件判转移指令可以自己随意安排  .jbf0,gongneng5    .ajmpgongneng4wint0:    cplf0    nop    retiend朋友这样应该可以了,不行的话加我qq:63892347邮箱:chirituzi@126.com
首先  十分十分感谢  chirituzi  老兄不嫌麻烦而又很详细的解释!!!

  谢谢你给的邮箱号和你的QQ号.现在暂时不好意思打扰你,     我先自己按照你的方法下苦功的去练练,如果我撑不住差不多要趴下了,那就再次打扰老兄你了!

     我的一个认识的朋友他用义隆EM78PS53编灯跳    每个功能的程序跟我用51编的差不多,我看过他的成品灯,按键按下去立刻会切换  ,他说他用扫描方式,(由于商业机密,他说的是不是真的我不知道)我想,他能做,我想我是也能用扫描方式去做 由于我所有的IO口都要做输出口,留边上一个做按钮布线很方便,而用中断的话要在中间,PCB布板线条很绕弯,就想用扫描方式了.          如果扫描方式不能实时控制,那就我就改PCB  用中断了,只要功能会切换什么比什么都好.

       写了多了点,让各位老兄看晕了
0
回复
zj47988302
LV.4
10
2008-04-13 10:44
@yxdz
首先  十分十分感谢  chirituzi  老兄不嫌麻烦而又很详细的解释!!!  谢谢你给的邮箱号和你的QQ号.现在暂时不好意思打扰你,    我先自己按照你的方法下苦功的去练练,如果我撑不住差不多要趴下了,那就再次打扰老兄你了!    我的一个认识的朋友他用义隆EM78PS53编灯跳    每个功能的程序跟我用51编的差不多,我看过他的成品灯,按键按下去立刻会切换  ,他说他用扫描方式,(由于商业机密,他说的是不是真的我不知道)我想,他能做,我想我是也能用扫描方式去做由于我所有的IO口都要做输出口,留边上一个做按钮布线很方便,而用中断的话要在中间,PCB布板线条很绕弯,就想用扫描方式了.          如果扫描方式不能实时控制,那就我就改PCB  用中断了,只要功能会切换什么比什么都好.      写了多了点,让各位老兄看晕了
这还能有什么商业机密啊.

不用外中断,那就用定时中断,每10MS扫描一次.这个速度对闪灯来讲已经足够了.
0
回复
chirituzi
LV.1
11
2008-04-14 09:49
@yxdz
首先  十分十分感谢  chirituzi  老兄不嫌麻烦而又很详细的解释!!!  谢谢你给的邮箱号和你的QQ号.现在暂时不好意思打扰你,    我先自己按照你的方法下苦功的去练练,如果我撑不住差不多要趴下了,那就再次打扰老兄你了!    我的一个认识的朋友他用义隆EM78PS53编灯跳    每个功能的程序跟我用51编的差不多,我看过他的成品灯,按键按下去立刻会切换  ,他说他用扫描方式,(由于商业机密,他说的是不是真的我不知道)我想,他能做,我想我是也能用扫描方式去做由于我所有的IO口都要做输出口,留边上一个做按钮布线很方便,而用中断的话要在中间,PCB布板线条很绕弯,就想用扫描方式了.          如果扫描方式不能实时控制,那就我就改PCB  用中断了,只要功能会切换什么比什么都好.      写了多了点,让各位老兄看晕了
希望你早日把程序做好!呵呵
0
回复
njyd
LV.8
12
2008-04-19 22:01
  返回不很容易吗?
  子程序返回指令:RET就是返回到调用子程序的下面一句.前提是要用CALL调用子程序.

  CALL AAA  (如果距离远用LCALL)
  Axxx

  ....

AAA:YYY  ;子程序
   ZZZ
   ....
   RET
这RET就返回到Axxx

下一个
  LCALL AAA
  Bxxx
  ....
这一回调用AAA后就返回Bxxx
0
回复
yxdz
LV.7
13
2008-04-20 13:41
@njyd
  返回不很容易吗?  子程序返回指令:RET就是返回到调用子程序的下面一句.前提是要用CALL调用子程序.  CALLAAA  (如果距离远用LCALL)  Axxx  ....AAA:YYY  ;子程序  ZZZ  ....  RET这RET就返回到Axxx下一个  LCALLAAA  Bxxx  ....这一回调用AAA后就返回Bxxx
谢谢这位老兄的参与 ,返回我知道用那些指令,但是我们这里是讨论实时控制,我想老兄你仔细分析第一贴就明白楼主的想要解决 的问题了
0
回复
njyd
LV.8
14
2008-04-24 22:24
@yxdz
谢谢这位老兄的参与,返回我知道用那些指令,但是我们这里是讨论实时控制,我想老兄你仔细分析第一贴就明白楼主的想要解决的问题了
你图中说的是用转移指令,返回原地当然困难.

  用CALL指令调用子程序,如果无键就用RET返回,如果有键就先做两个空出栈动作:
   POP    ACC
     POP    ACC
以去掉堆栈中的返回地址(这个很重要,否则堆栈会越来越大),再用转移指令jmp转到你要去的功能N.
0
回复
yxdz
LV.7
15
2008-04-26 19:52
@njyd
你图中说的是用转移指令,返回原地当然困难.  用CALL指令调用子程序,如果无键就用RET返回,如果有键就先做两个空出栈动作:  POP    ACC    POP    ACC以去掉堆栈中的返回地址(这个很重要,否则堆栈会越来越大),再用转移指令jmp转到你要去的功能N.
谢谢老兄的指点,我去练习看看  
             谢谢
0
回复
yxdz
LV.7
16
2008-04-27 20:39
@yxdz
谢谢老兄的指点,我去练习看看              谢谢
哦,又麻烦各位老兄帮我看看.程序是这样工作的,如果不要按下按钮每个功能都是重复几下就自动转到下一个功能去,但是按下按钮后就暂停了. 我的源程序是这样的如下 ,麻烦各位老兄帮我看我哪里不对了呢, 谢谢

                   ORG         0000H  
                AJMP        AAQQ
                ORG         0030H            
AAQQ:           MOV    R1,#1
                JMP    MAINAA
    
ANA:             MOV   P3,#0FFH  ;按键扫描子程序
                 MOV   A,#0FFH
                 MOV   P3,A
         MOV   A,P3
CJNE  A,#0FFH,AWW
                 jmp     A7
AWW:             ACALL       DEL10MS
                 CJNE   A,#0FFH,AW
JMP     A7
                
AW:              POP   ACC
                 POP   ACC
                 INC   R1
A1:              CJNE  R1,#2,A3
                
                 LJMP   MAIN2       ;转功能2
A3:              CJNE  R2,#3,A4
                 LJMP   MAIN3       ;转功能3
A4:              CJNE  R2,#4,A5
                 LJMP   DISA        ;转功能4
A5:              CJNE  R2,#5,A6
            
                 LJMP    DIS11      ; 转功能5
A6:              CJNE  R2,#6,A7
                 MOV   R1,#1
                
                 LJMP    DIS1        ;转功能6
A7:              RET                
    
MAINAA:              MOV   R0,#0    
        
                                
MAINA:           MOV         P1,#7FH  ;功能一(涨潮退潮)
                ACALL       DEL
                call        ana
                MOV         P1,#3FH
              
                ACALL       DEL
                MOV         P1,#1FH
              
                ACALL       DEL
                call        ana
                MOV         P1,#0FH
                
                ACALL       DEL
                MOV         P1,#7H
              
                ACALL       DEL
                call        ana
                MOV         P1,#3H
            
                ACALL       DEL
                MOV         P1,#1H
              
                ACALL       DEL
                call        ana
                MOV         P1,#00H
              
                ACALL       DEL
                                                                                    MOV         P0,#0FEH
              
                ACALL       DEL
                call        ana
                
                MOV         P0,#0FCH
              
                ACALL       DEL
              
                MOV         P0,#0F8H
              
                ACALL       DEL
                call        ana
              
                MOV         P0,#0F0H
              
                ACALL       DEL
              
                MOV         P0,#0E0H
                
                ACALL       DEL
                call        ana
              
                MOV         P0,#0C0H
              
                ACALL       DEL
              
                MOV         P0,#80H
              
                ACALL       DEL
                call        ana
                
                MOV         P0,#00H
              
                ACALL       DEL
                                         
                MOV         P2,#7FH
              
                ACALL       DEL
                
               call        ana
                MOV         P2,#3FH
                
                ACALL       DEL
              
                MOV         P2,#1FH
                
                ACALL       DEL
                call        ana
              
                MOV         P2,#0FH
                
                ACALL       DEL
              
                MOV         P2,#7H
              
                ACALL       DEL
                call        ana
                
                MOV         P2,#3H
              
                ACALL       DEL
              
                MOV         P2,#1H
              
                ACALL       DEL
                call        ana
              
                MOV         P2,#00H
                
                ACALL       DEL;                    
              
                ACALL       DEL
                call        ana
                            
                MOV         P2,#01H
                
                ACALL       DEL
              
                MOV         P2,#3H
              
                ACALL       DEL
                call        ana
                
                MOV         P2,#7H
              
                ACALL       DEL
                
                MOV         P2,#0FH
              
                ACALL       DEL
                call        ana
                
                MOV         P2,#1FH
                
                ACALL       DEL
                
                MOV         P2,#3FH
                
                ACALL       DEL
                call        ana
                
                MOV         P2,#7FH
                
                ACALL       DEL
                
                MOV         P2,#0FFH
              
                ACALL       DEL
                call        ana
                                
              
                ACALL       DEL
              
                MOV         P0,#80H
                
                ACALL       DEL
                
                call        ana
                MOV         P0,#0C0H
                
                ACALL       DEL
              
                MOV         P0,#0E0H
                
                ACALL       DEL
                call        ana
            
                MOV         P0,#0F0H
              
                ACALL       DEL
              
                MOV         P0,#0F8H
                
                ACALL       DEL
                call        ana
              
                MOV         P0,#0FCH
                
                ACALL       DEL
                
                MOV         P0,#0FEH
              
                ACALL       DEL
                call        ana
              
              
                MOV         P0,#0FFH
                ACALL       DEL;        
                MOV         P1,#00H
              
                ACALL       DEL
                call        ana
                MOV         P1,#1H
              
                ACALL       DEL
                MOV         P1,#3H
              
                ACALL       DEL
                call        ana
                MOV         P1,#7H
                
                ACALL       DEL
                MOV         P1,#0FH
                
                ACALL       DEL
                call        ana
                MOV         P1,#1FH
                
                ACALL       DEL
                MOV         P1,#3FH
              
                ACALL       DEL
                call        ana
                MOV         P1,#7FH
                MOV         P2,#0FFH
                
                MOV         P0,#0FFH
             ACALL       DEL
                MOV         P1,#0FFH
        MOV         P2,#0FFH
            
        MOV         P0,#0FFH
                ACALL       DELA
INC      R0
call     ANA

CJNE        R1,#2,Q1
AJMP        MAINA
Q1:             CJNE        R0,#6,QQ
JMP       MAIN22
QQ:            AJMP   MAINA                

MAIN22:        MOV         R0,#0   ;第二功能(同时亮灭)
MAIN2:         MOV         P1,#00H   MOV         P2,#00H

MOV         P0,#00H
ACALL       DELA
                Lcall        ana
MOV         P1,#0FFH
MOV         P2,#0FFH

MOV         P0,#0FFH
ACALL       DELA
                Lcall        ana
              
                INC         R0
  
                CJNE        R1,#3,Q2
                JMP        MAIN2
Q2:         CJNE        R0,#26,MAIN2
            

              
                MOV         R0,#0
MAIN3: MOV         P1,#00H  ;第三功能(交替亮灭)
MOV         P2,#00H

MOV         P0,#0FFH
ACALL       DELAA

                call        ana                  


        MOV         P0,#00H
                MOV         P1,#0FFH
MOV         P2,#0FFH
ACALL       DELAA
                

                CALL       ANA
  
                CJNE       R1,#4,Q3
                JMP       MAIN3
Q3:             CJNE        R0,#16,MAIN3
              
                            
MOV         R0,#0
              
MOV         P1,#0FFH
MOV         P2,#0FFH

MOV         P0,#0FFH
                ACALL       DELA
                Lcall        ana

DISA:       MOV       P1,#6DH     ;第四功能(隔灯追逐)
          
            MOV       P2,#0DBH
            MOV       P0,#0B6H
            ACALL     DEL
            Lcall        ana
            MOV       P1,#0B6H
          
            MOV       P2,#06DH
            MOV       P0,#06DH
            ACALL     DEL
           Lcall        ana
            MOV       P1,#0DBH
          
            MOV       P2,#0B6H
            MOV       P0,#0DBH
            
    ACALL     DELA
    Lcall        ana
    MOV       P1,#0FFH
    MOV       P2,#0FFH

    INC       R0
            call        ana
            CJNE     R1,#5,Q4
            LJMP     DISA


Q4: CJNE      R0,#15,DISA
NOP

MOV       P1,#0FFH
MOV       P2,#0FFH

MOV       P0,#0FFH
                                MOV       R0,#0
DIS11:       MOV       P1,#0FEH;  第五功能(单灯绕圈----慢)
            ACALL     DEL
            MOV       P1,#0FDH
            ACALL     DEL
            Lcall        ana
            MOV       P1,#0FBH
            ACALL     DEL
            MOV       P1,#0F7H
            ACALL     DEL
            Lcall        ana
            MOV       P1,#0EFH
            ACALL     DEL
            MOV       P1,#0DFH
            ACALL     DEL
    Lcall        ana
            MOV       P1,#0BFH
            ACALL     DEL
            MOV       P1,#7FH
            ACALL     DEL
    Lcall        ana
    MOV       P1,#0FFH

DIS21:      
            MOV       P2,#0FEH
            ACALL     DEL
            MOV       P2,#0FDH
            ACALL     DEL
            Lcall        ana
            MOV       P2,#0FBH
            ACALL     DEL
            MOV       P2,#0F7H
            ACALL     DEL
Lcall        ana
            MOV       P2,#0EFH
            ACALL     DEL
            MOV       P2,#0DFH
            ACALL     DEL
Lcall        ana
            MOV       P2,#0BFH
            ACALL     DEL
            MOV       P2,#7FH
            ACALL     DEL
Lcall        ana
DIS01:       MOV       P2,#0FFH
            MOV       P0,#7FH
            ACALL     DEL
            MOV       P0,#0BFH
            ACALL     DEL
Lcall        ana
            MOV       P0,#0DFH
            ACALL     DEL
            MOV       P0,#0EFH
            ACALL     DEL
Lcall        ana
            MOV       P0,#0F7H
            ACALL     DEL
            MOV       P0,#0FBH
            ACALL     DEL
Lcall        ana
            MOV       P0,#0FDH
            ACALL     DEL
            MOV       P0,#0FEH
            ACALL     DEL
Lcall        ana
            MOV       P0,#0FFH
ACALL     DELA
INC       R0
Lcall        ana
CJNE      R1,#6,QQQ
QA: AJMP      DIS11
QQQ: CJNE      R0,#12,QA



            MOV       R0,#0
DIS1:       MOV       P1,#0FEH;   第六功能(单灯绕圈----快)
            ACALL     DELQ
            MOV       P1,#0FDH
            ACALL     DELQ

call        ana
            MOV       P1,#0FBH
            ACALL     DELQ
            MOV       P1,#0F7H
            ACALL     DELQ
call        ana
            MOV       P1,#0EFH
            ACALL     DELQ
            MOV       P1,#0DFH
            ACALL     DELQ
call        ana
            MOV       P1,#0BFH
            ACALL     DELQ
            MOV       P1,#7FH
            ACALL     DELQ
call        ana

DIS2:       MOV       P1,#0FFH
            MOV       P2,#0FEH
            ACALL     DELQ
call        ana
            MOV       P2,#0FDH
            ACALL     DELQ
            MOV       P2,#0FBH
            ACALL     DELQ
call        ana
            MOV       P2,#0F7H
            ACALL     DELQ
            MOV       P2,#0EFH
            ACALL     DELQ
call        ana
            MOV       P2,#0DFH
            ACALL     DELQ
            MOV       P2,#0BFH
            ACALL     DELQ
call        ana
            MOV       P2,#7FH
            ACALL     DELQ
call        ana
DIS0:       MOV       P2,#0FFH
            MOV       P0,#7FH
            ACALL     DELQ
            MOV       P0,#0BFH
            ACALL     DELQ
call        ana
            MOV       P0,#0DFH
            ACALL     DELQ
            MOV       P0,#0EFH
            ACALL     DELQ
call        ana
            MOV       P0,#0F7H
            ACALL     DELQ
            MOV       P0,#0FBH
            ACALL     DELQ
call        ana
            MOV       P0,#0FDH
            ACALL     DELQ
            MOV       P0,#0FEH
            ACALL     DELQ
call        ana
            MOV       P0,#0FFH
ACALL     DELA
INC       R0
call        ana
CJNE      R1,#7,QQQQQ

GD:             JMP      DIS1
            
QQQQQ:    CJNE      R0,#15,GD


             AJMP           MAINAA


DELA:           MOV         R7,#01H    ;以下是延时子程序
DELA1:          MOV         R6,#0AFH
DELA2:          MOV         R5,#0FFH
DELA3:          DJNZ        R5,DELA3
                DJNZ        R6,DELA2
             DJNZ        R7,DELA1
                
             RET
DEL:            MOV         R7,#01H
DEL1:           MOV         R6,#0AFH
DEL2:           MOV         R5,#0FFH
DEL3:           DJNZ        R5,DEL3
                DJNZ        R6,DEL2
                DJNZ        R7,DEL1
                RET            
DELAA:           MOV         R7,#02H
DELAA1:          MOV         R6,#0AFH
DELAA2:          MOV         R5,#0FFH
DELAA3:          DJNZ        R5,DELAA3
                DJNZ        R6,DELAA2
             DJNZ        R7,DELAA1
                INC         R0
             RET
DELAAA:           MOV         R7,#2FH
DELAA1A:          MOV         R6,#0FFH
DELAA2A:          MOV         R5,#0FFH
DELAA3A:          DJNZ        R5,DELAA3A
                DJNZ        R6,DELAA2A
             DJNZ        R7,DELAA1A
                INC         R0
             RET
DELQ:            MOV         R7,#01H
DEL1Q:           MOV         R6,#1FH
DEL2Q:           MOV         R5,#9FH
DEL3Q:           DJNZ        R5,DEL3Q
                DJNZ        R6,DEL2Q
                DJNZ        R7,DEL1Q
               RET
DEL10MS:        MOV         R7,#0FFH
DEL11:           MOV         R6,#0FFH
DEL22:           DJNZ         R6,DEL22

                DJNZ        R7,DEL10MS
              
                RET  

               END
0
回复
yt2005
LV.2
17
2008-04-28 16:44
@yxdz
哦,又麻烦各位老兄帮我看看.程序是这样工作的,如果不要按下按钮每个功能都是重复几下就自动转到下一个功能去,但是按下按钮后就暂停了.我的源程序是这样的如下,麻烦各位老兄帮我看我哪里不对了呢,谢谢                  ORG        0000H                  AJMP        AAQQ                ORG        0030H            AAQQ:          MOV    R1,#1                JMP    MAINAA    ANA:            MOV  P3,#0FFH  ;按键扫描子程序                MOV  A,#0FFH                MOV  P3,A        MOV  A,P3CJNE  A,#0FFH,AWW                jmp    A7AWW:            ACALL      DEL10MS                CJNE  A,#0FFH,AWJMP    A7                AW:              POP  ACC                POP  ACC                INC  R1A1:              CJNE  R1,#2,A3                                LJMP  MAIN2      ;转功能2A3:              CJNE  R2,#3,A4                LJMP  MAIN3      ;转功能3A4:              CJNE  R2,#4,A5                LJMP  DISA        ;转功能4A5:              CJNE  R2,#5,A6                            LJMP    DIS11      ;转功能5A6:              CJNE  R2,#6,A7                MOV  R1,#1                                LJMP    DIS1        ;转功能6A7:              RET                    MAINAA:              MOV  R0,#0                                            MAINA:          MOV        P1,#7FH  ;功能一(涨潮退潮)                ACALL      DEL                call        ana                MOV        P1,#3FH                              ACALL      DEL                MOV        P1,#1FH                              ACALL      DEL                call        ana                MOV        P1,#0FH                                ACALL      DEL                MOV        P1,#7H                              ACALL      DEL                call        ana                MOV        P1,#3H                            ACALL      DEL                MOV        P1,#1H                              ACALL      DEL                call        ana                MOV        P1,#00H                              ACALL      DEL                                                                                    MOV        P0,#0FEH                              ACALL      DEL                call        ana                                MOV        P0,#0FCH                              ACALL      DEL                              MOV        P0,#0F8H                              ACALL      DEL                call        ana                              MOV        P0,#0F0H                              ACALL      DEL                              MOV        P0,#0E0H                                ACALL      DEL                call        ana                              MOV        P0,#0C0H                              ACALL      DEL                              MOV        P0,#80H                              ACALL      DEL                call        ana                                MOV        P0,#00H                              ACALL      DEL                                                        MOV        P2,#7FH                              ACALL      DEL                              call        ana                MOV        P2,#3FH                                ACALL      DEL                              MOV        P2,#1FH                                ACALL      DEL                call        ana                              MOV        P2,#0FH                                ACALL      DEL                              MOV        P2,#7H                              ACALL      DEL                call        ana                                MOV        P2,#3H                              ACALL      DEL                              MOV        P2,#1H                              ACALL      DEL                call        ana                              MOV        P2,#00H                                ACALL      DEL;                                                  ACALL      DEL                call        ana                                            MOV        P2,#01H                                ACALL      DEL                              MOV        P2,#3H                              ACALL      DEL                call        ana                                MOV        P2,#7H                              ACALL      DEL                                MOV        P2,#0FH                              ACALL      DEL                call        ana                                MOV        P2,#1FH                                ACALL      DEL                                MOV        P2,#3FH                                ACALL      DEL                call        ana                                MOV        P2,#7FH                                ACALL      DEL                                MOV        P2,#0FFH                              ACALL      DEL                call        ana                                                              ACALL      DEL                              MOV        P0,#80H                                ACALL      DEL                                call        ana                MOV        P0,#0C0H                                ACALL      DEL                              MOV        P0,#0E0H                                ACALL      DEL                call        ana                            MOV        P0,#0F0H                              ACALL      DEL                              MOV        P0,#0F8H                                ACALL      DEL                call        ana                              MOV        P0,#0FCH                                ACALL      DEL                                MOV        P0,#0FEH                              ACALL      DEL                call        ana                                            MOV        P0,#0FFH                ACALL      DEL;                        MOV        P1,#00H                              ACALL      DEL                call        ana                MOV        P1,#1H                              ACALL      DEL                MOV        P1,#3H                              ACALL      DEL                call        ana                MOV        P1,#7H                                ACALL      DEL                MOV        P1,#0FH                                ACALL      DEL                call        ana                MOV        P1,#1FH                                ACALL      DEL                MOV        P1,#3FH                              ACALL      DEL                call        ana                MOV        P1,#7FH                MOV        P2,#0FFH                                MOV        P0,#0FFH            ACALL      DEL                MOV        P1,#0FFH        MOV        P2,#0FFH                    MOV        P0,#0FFH                ACALL      DELAINC      R0call    ANACJNE        R1,#2,Q1AJMP        MAINAQ1:            CJNE        R0,#6,QQJMP      MAIN22QQ:            AJMP  MAINA                MAIN22:        MOV        R0,#0  ;第二功能(同时亮灭)MAIN2:        MOV        P1,#00H  MOV        P2,#00HMOV        P0,#00HACALL      DELA                Lcall        anaMOV        P1,#0FFHMOV        P2,#0FFHMOV        P0,#0FFHACALL      DELA                Lcall        ana                              INC        R0                  CJNE        R1,#3,Q2                JMP        MAIN2Q2:        CJNE        R0,#26,MAIN2                                          MOV        R0,#0MAIN3:MOV        P1,#00H  ;第三功能(交替亮灭)MOV        P2,#00HMOV        P0,#0FFHACALL      DELAA                call        ana                          MOV        P0,#00H                MOV        P1,#0FFHMOV        P2,#0FFHACALL      DELAA                                CALL      ANA                  CJNE      R1,#4,Q3                JMP      MAIN3Q3:            CJNE        R0,#16,MAIN3                                          MOV        R0,#0              MOV        P1,#0FFHMOV        P2,#0FFHMOV        P0,#0FFH                ACALL      DELA                Lcall        anaDISA:      MOV      P1,#6DH    ;第四功能(隔灯追逐)                      MOV      P2,#0DBH            MOV      P0,#0B6H            ACALL    DEL            Lcall        ana            MOV      P1,#0B6H                      MOV      P2,#06DH            MOV      P0,#06DH            ACALL    DEL          Lcall        ana            MOV      P1,#0DBH                      MOV      P2,#0B6H            MOV      P0,#0DBH                ACALL    DELA    Lcall        ana    MOV      P1,#0FFH    MOV      P2,#0FFH    INC      R0            call        ana            CJNE    R1,#5,Q4            LJMP    DISAQ4:CJNE      R0,#15,DISANOPMOV      P1,#0FFHMOV      P2,#0FFHMOV      P0,#0FFH                                MOV      R0,#0DIS11:      MOV      P1,#0FEH;  第五功能(单灯绕圈----慢)            ACALL    DEL            MOV      P1,#0FDH            ACALL    DEL            Lcall        ana            MOV      P1,#0FBH            ACALL    DEL            MOV      P1,#0F7H            ACALL    DEL            Lcall        ana            MOV      P1,#0EFH            ACALL    DEL            MOV      P1,#0DFH            ACALL    DEL    Lcall        ana            MOV      P1,#0BFH            ACALL    DEL            MOV      P1,#7FH            ACALL    DEL    Lcall        ana    MOV      P1,#0FFHDIS21:                  MOV      P2,#0FEH            ACALL    DEL            MOV      P2,#0FDH            ACALL    DEL            Lcall        ana            MOV      P2,#0FBH            ACALL    DEL            MOV      P2,#0F7H            ACALL    DELLcall        ana            MOV      P2,#0EFH            ACALL    DEL            MOV      P2,#0DFH            ACALL    DELLcall        ana            MOV      P2,#0BFH            ACALL    DEL            MOV      P2,#7FH            ACALL    DELLcall        anaDIS01:      MOV      P2,#0FFH            MOV      P0,#7FH            ACALL    DEL            MOV      P0,#0BFH            ACALL    DELLcall        ana            MOV      P0,#0DFH            ACALL    DEL            MOV      P0,#0EFH            ACALL    DELLcall        ana            MOV      P0,#0F7H            ACALL    DEL            MOV      P0,#0FBH            ACALL    DELLcall        ana            MOV      P0,#0FDH            ACALL    DEL            MOV      P0,#0FEH            ACALL    DELLcall        ana            MOV      P0,#0FFHACALL    DELAINC      R0Lcall        anaCJNE      R1,#6,QQQQA:AJMP      DIS11QQQ:CJNE      R0,#12,QA            MOV      R0,#0DIS1:      MOV      P1,#0FEH;  第六功能(单灯绕圈----快)            ACALL    DELQ            MOV      P1,#0FDH            ACALL    DELQcall        ana            MOV      P1,#0FBH            ACALL    DELQ            MOV      P1,#0F7H            ACALL    DELQcall        ana            MOV      P1,#0EFH            ACALL    DELQ            MOV      P1,#0DFH            ACALL    DELQcall        ana            MOV      P1,#0BFH            ACALL    DELQ            MOV      P1,#7FH            ACALL    DELQcall        anaDIS2:      MOV      P1,#0FFH            MOV      P2,#0FEH            ACALL    DELQcall        ana            MOV      P2,#0FDH            ACALL    DELQ            MOV      P2,#0FBH            ACALL    DELQcall        ana            MOV      P2,#0F7H            ACALL    DELQ            MOV      P2,#0EFH            ACALL    DELQcall        ana            MOV      P2,#0DFH            ACALL    DELQ            MOV      P2,#0BFH            ACALL    DELQcall        ana            MOV      P2,#7FH            ACALL    DELQcall        anaDIS0:      MOV      P2,#0FFH            MOV      P0,#7FH            ACALL    DELQ            MOV      P0,#0BFH            ACALL    DELQcall        ana            MOV      P0,#0DFH            ACALL    DELQ            MOV      P0,#0EFH            ACALL    DELQcall        ana            MOV      P0,#0F7H            ACALL    DELQ            MOV      P0,#0FBH            ACALL    DELQcall        ana            MOV      P0,#0FDH            ACALL    DELQ            MOV      P0,#0FEH            ACALL    DELQcall        ana            MOV      P0,#0FFHACALL    DELAINC      R0call        anaCJNE      R1,#7,QQQQQGD:            JMP      DIS1            QQQQQ:  CJNE      R0,#15,GD            AJMP          MAINAADELA:          MOV        R7,#01H    ;以下是延时子程序DELA1:          MOV        R6,#0AFHDELA2:          MOV        R5,#0FFHDELA3:          DJNZ        R5,DELA3                DJNZ        R6,DELA2            DJNZ        R7,DELA1                            RETDEL:            MOV        R7,#01HDEL1:          MOV        R6,#0AFHDEL2:          MOV        R5,#0FFHDEL3:          DJNZ        R5,DEL3                DJNZ        R6,DEL2                DJNZ        R7,DEL1                RET            DELAA:          MOV        R7,#02HDELAA1:          MOV        R6,#0AFHDELAA2:          MOV        R5,#0FFHDELAA3:          DJNZ        R5,DELAA3                DJNZ        R6,DELAA2            DJNZ        R7,DELAA1                INC        R0            RETDELAAA:          MOV        R7,#2FHDELAA1A:          MOV        R6,#0FFHDELAA2A:          MOV        R5,#0FFHDELAA3A:          DJNZ        R5,DELAA3A                DJNZ        R6,DELAA2A            DJNZ        R7,DELAA1A                INC        R0            RETDELQ:            MOV        R7,#01HDEL1Q:          MOV        R6,#1FHDEL2Q:          MOV        R5,#9FHDEL3Q:          DJNZ        R5,DEL3Q                DJNZ        R6,DEL2Q                DJNZ        R7,DEL1Q              RETDEL10MS:        MOV        R7,#0FFHDEL11:          MOV        R6,#0FFHDEL22:          DJNZ        R6,DEL22                DJNZ        R7,DEL10MS                              RET                END
你的程序执行一次最少几十秒钟,这样写程序实在是太糟糕了,实时性太差.当然不能及时响应你的按键动作.写程序时要牢记不要有死循环,不要在主程序中用延时程序,你犯了这个错误.即使你用中断,也不会及时响应,因为中断过后主程序还要执行你的延时程序.键盘扫描本来就才20MS作为单位时间,你想到延时程序结束时,动作早结束了.所以好的程序,延时要用中断,中断中用标志位,当时间到了再作相应操作,而不在那里死等,浪费时间.最后提醒你一点,程序中多用标志位,变量名等要用易懂的具有实际意义的符号来代替,而不是AA,QQ等,养成良好习惯,你会事半功倍.希望我说的能给你帮助.
0
回复
yxdz
LV.7
18
2008-04-29 07:05
@yt2005
你的程序执行一次最少几十秒钟,这样写程序实在是太糟糕了,实时性太差.当然不能及时响应你的按键动作.写程序时要牢记不要有死循环,不要在主程序中用延时程序,你犯了这个错误.即使你用中断,也不会及时响应,因为中断过后主程序还要执行你的延时程序.键盘扫描本来就才20MS作为单位时间,你想到延时程序结束时,动作早结束了.所以好的程序,延时要用中断,中断中用标志位,当时间到了再作相应操作,而不在那里死等,浪费时间.最后提醒你一点,程序中多用标志位,变量名等要用易懂的具有实际意义的符号来代替,而不是AA,QQ等,养成良好习惯,你会事半功倍.希望我说的能给你帮助.
哦,谢谢老兄的指点,我今后重新规划程序.  我现在不明白的是,我16贴的源程序如果不按按键能工作正常,(每个功能重复工作规定的次数后自动转到下一个功能去)   ,但是按下按键后  ,会转到下一功能但是立即暂停了.
0
回复
yt2005
LV.2
19
2008-04-29 08:59
@yxdz
哦,谢谢老兄的指点,我今后重新规划程序.  我现在不明白的是,我16贴的源程序如果不按按键能工作正常,(每个功能重复工作规定的次数后自动转到下一个功能去)  ,但是按下按键后  ,会转到下一功能但是立即暂停了.
你的程序中调ANA这个子程序,如果按键,没有返回(没按键会返回),然后去执行主程序,主程序又调ANA这个子程序,堆栈中的指针没有恢复.你这样做就会等同于程序在程序中调自己本身,这样会造成堆栈中的程序指针错乱,当然会暂停了,因为程序不知道怎么执行了.
切记,一个程序,只有一个出口,不要跳来跳去的,养成良好习惯,不然你的程序学习之路会很漫长.
0
回复
yxdz
LV.7
20
2008-04-29 13:07
@yt2005
你的程序中调ANA这个子程序,如果按键,没有返回(没按键会返回),然后去执行主程序,主程序又调ANA这个子程序,堆栈中的指针没有恢复.你这样做就会等同于程序在程序中调自己本身,这样会造成堆栈中的程序指针错乱,当然会暂停了,因为程序不知道怎么执行了.切记,一个程序,只有一个出口,不要跳来跳去的,养成良好习惯,不然你的程序学习之路会很漫长.
哦,十分感谢!!    那我重新编写
0
回复
2008-08-07 16:34
@yxdz
哦,十分感谢!!    那我重新编写
你最后面成功了没有,将原程序发上来学习一下嘛,我刚学单片机的,做LED行业,相信你现在比我强.呵呵!
0
回复
yxdz
LV.7
22
2008-08-07 19:58
@独孤飞雪
你最后面成功了没有,将原程序发上来学习一下嘛,我刚学单片机的,做LED行业,相信你现在比我强.呵呵!
哦,我还没有啊,由于手头又忙于其他的项目,单片机一直还没有继续练习下去,我想等忙完手头的案子再继续练习下去

            谢谢各位的关心
0
回复
yxdz
LV.7
23
2008-08-16 20:29
@yxdz
哦,我还没有啊,由于手头又忙于其他的项目,单片机一直还没有继续练习下去,我想等忙完手头的案子再继续练习下去            谢谢各位的关心
现在又回来了,还是编不出来啊,有哪位大侠能指点 指点吗
0
回复
2008-08-22 14:11
@zj47988302
如果你想实时控制,可以用定时中断去扫描按键.
同意楼上的看法!
0
回复
njyd
LV.8
25
2008-09-25 21:34
不用定时器的程序框架:

设置一个变量,根据这变量的数跳到“跳法n”


START:
   根据变量的值跳转到"跳法1”--“跳法n”的分支程序.

跳法1

JMP START
;;;;;;;;;;;;;;;;;;;
跳法2

JMP START
;;;;;;;;;;;;;;;;;;;

跳法3
JMP START
;;;;;;;;;;;;;;;;;;;

跳法N

JMP START
;;;;;;;;;;;;;;;;;;;;;
  
     因为你的各种跳法中肯定要用到延时程序,可以在延时循环程序的最里圈加一小段判别键和处理程序,这样在大部分情况下响应键很快.
    假设你的键信号在p1.0, 低电平为有键;内部RAM 2FH为选择"跳法N”的变量(当然也可以选其他地址);另设一个位地址 00H作为有键跳出标志.设有N个跳法,在程序初始时要把内部RAM 2FH设为0,位地址 00H为CLR.

;延时循环
DELAY:  MOV R5,#xxH     ;最外圈循环数
DELP1:  MOV R4,#YYH     ;中圈循环数
DELP2:  MOV R3,#ZZH     ;最内圈循环数
DELP3:  JB P1.0,DELP4   ;无键按下,继续循环
        INC 2FH         ;选择"跳法N”的变量加1,转回START时依此选择什么跳法.
    ......  ;如果2FH=N,则清为#00H
    SETB 00H
        JMP DELEND      ;退出循环.  
DELP4:  DJNZ R3,DELP3
        DJNZ R4,DELP2
        DJNZ R5,DELP1
DELEND: RET

    位地址 00H作为有键跳出标志的作用是,在每个调用延时循环程序后,加一段判别是否有键退出,如果是,则直接转START  .
    如果在2FH加1后直接跳到START ,多次后堆栈将会溢出,为什么自己想一想.

       CALL  DELAY
       JNB  00H,AAAA
       CLR 00H         ;清标志,以免下次误转
       LJMP  START     ;用此较法,可以转的较远,如果直接用JB 00H,START 多数情况下转不到那么远
AAAA:  无键时正常往下运行
0
回复
2008-09-26 00:03
@njyd
不用定时器的程序框架:设置一个变量,根据这变量的数跳到“跳法n”START:  根据变量的值跳转到"跳法1”--“跳法n”的分支程序.跳法1JMPSTART;;;;;;;;;;;;;;;;;;;跳法2JMPSTART;;;;;;;;;;;;;;;;;;;跳法3JMPSTART;;;;;;;;;;;;;;;;;;;跳法NJMPSTART;;;;;;;;;;;;;;;;;;;;;      因为你的各种跳法中肯定要用到延时程序,可以在延时循环程序的最里圈加一小段判别键和处理程序,这样在大部分情况下响应键很快.    假设你的键信号在p1.0,低电平为有键;内部RAM2FH为选择"跳法N”的变量(当然也可以选其他地址);另设一个位地址00H作为有键跳出标志.设有N个跳法,在程序初始时要把内部RAM2FH设为0,位地址00H为CLR.;延时循环DELAY:  MOVR5,#xxH    ;最外圈循环数DELP1:  MOVR4,#YYH    ;中圈循环数DELP2:  MOVR3,#ZZH    ;最内圈循环数DELP3:  JBP1.0,DELP4  ;无键按下,继续循环        INC2FH        ;选择"跳法N”的变量加1,转回START时依此选择什么跳法.    ......  ;如果2FH=N,则清为#00H    SETB00H        JMPDELEND      ;退出循环.  DELP4:  DJNZR3,DELP3        DJNZR4,DELP2        DJNZR5,DELP1DELEND:RET    位地址00H作为有键跳出标志的作用是,在每个调用延时循环程序后,加一段判别是否有键退出,如果是,则直接转START  .    如果在2FH加1后直接跳到START,多次后堆栈将会溢出,为什么自己想一想.      CALL  DELAY      JNB  00H,AAAA      CLR00H        ;清标志,以免下次误转      LJMP  START    ;用此较法,可以转的较远,如果直接用JB00H,START多数情况下转不到那么远AAAA:  无键时正常往下运行
这个程序应该不难!你的这种写法不错,不过我觉的按键程序最好写在定时器的中断程序里比较好一些,这样效率高些,主程序里只对键值进行判断,然后进散转执相应的程序就可以了!按键的处理可以做成每按下一次键值加1,这样循环下去!
0
回复
yxdz
LV.7
27
2008-09-26 16:31
@njyd
不用定时器的程序框架:设置一个变量,根据这变量的数跳到“跳法n”START:  根据变量的值跳转到"跳法1”--“跳法n”的分支程序.跳法1JMPSTART;;;;;;;;;;;;;;;;;;;跳法2JMPSTART;;;;;;;;;;;;;;;;;;;跳法3JMPSTART;;;;;;;;;;;;;;;;;;;跳法NJMPSTART;;;;;;;;;;;;;;;;;;;;;      因为你的各种跳法中肯定要用到延时程序,可以在延时循环程序的最里圈加一小段判别键和处理程序,这样在大部分情况下响应键很快.    假设你的键信号在p1.0,低电平为有键;内部RAM2FH为选择"跳法N”的变量(当然也可以选其他地址);另设一个位地址00H作为有键跳出标志.设有N个跳法,在程序初始时要把内部RAM2FH设为0,位地址00H为CLR.;延时循环DELAY:  MOVR5,#xxH    ;最外圈循环数DELP1:  MOVR4,#YYH    ;中圈循环数DELP2:  MOVR3,#ZZH    ;最内圈循环数DELP3:  JBP1.0,DELP4  ;无键按下,继续循环        INC2FH        ;选择"跳法N”的变量加1,转回START时依此选择什么跳法.    ......  ;如果2FH=N,则清为#00H    SETB00H        JMPDELEND      ;退出循环.  DELP4:  DJNZR3,DELP3        DJNZR4,DELP2        DJNZR5,DELP1DELEND:RET    位地址00H作为有键跳出标志的作用是,在每个调用延时循环程序后,加一段判别是否有键退出,如果是,则直接转START  .    如果在2FH加1后直接跳到START,多次后堆栈将会溢出,为什么自己想一想.      CALL  DELAY      JNB  00H,AAAA      CLR00H        ;清标志,以免下次误转      LJMP  START    ;用此较法,可以转的较远,如果直接用JB00H,START多数情况下转不到那么远AAAA:  无键时正常往下运行
谢谢这位老兄详细的解释!!!!!    也许是我基础和理解能力太差,我还是很模糊,我再按照你的方法再去练习.  

                                     谢谢了!!!!
0
回复
yxdz
LV.7
28
2008-09-26 16:34
@yxdz
谢谢这位老兄详细的解释!!!!!    也许是我基础和理解能力太差,我还是很模糊,我再按照你的方法再去练习.                                      谢谢了!!!!
首先njyd谢谢这位老兄详细的解释!!!!!    也许是我基础和理解能力太差,我看还是很模糊,我得先再按照你的方法再去练习.  

                                     谢谢了!!!!
0
回复
zl_123
LV.1
29
2008-09-30 06:44
@yxdz
首先njyd谢谢这位老兄详细的解释!!!!!    也许是我基础和理解能力太差,我看还是很模糊,我得先再按照你的方法再去练习.                                      谢谢了!!!!
兄弟,建议你用C来写,并且我认为你要学会熟练使用定时器和状态机,不要再用软件延时了,我也是从你这样的时候走过来的,非常理解你的感受.
0
回复
stiven_01
LV.3
30
2008-10-09 11:54
@zl_123
兄弟,建议你用C来写,并且我认为你要学会熟练使用定时器和状态机,不要再用软件延时了,我也是从你这样的时候走过来的,非常理解你的感受.
汗.很麻烦啊.

用这个标准触摸感应IC吧.

还不错. 1556011223524453.pdf
0
回复