切换到宽版
  • 4730阅读
  • 18回复

EC11旋转编码开关的汇编程序已经编写测试成功,即将开源 [复制链接]

上一主题 下一主题
离线飞向狙沙

发帖
12762
M币
3435
专家
42
粉丝
10334
只看该作者 10楼 发表于: 2017-01-22
黑猫白猫,捉到老鼠就是好猫
本帖最近打赏记录:共1条打赏M币+3
离线jpdd521

发帖
25679
M币
8582
专家
15
粉丝
340
只看该作者 11楼 发表于: 2017-01-24
今天就五分了,给你了。。明天给汇编达人楼主。
离线jpdd521

发帖
25679
M币
8582
专家
15
粉丝
340
只看该作者 12楼 发表于: 2017-01-24
回 金向维 的帖子
金向维:心疼楼主 c语言用外部中断或者定时器中断 不算中断的代码的话 也就几行搞定 (2017-01-22 17:49) 回 金向维 的帖子

+1+1+1加一加一加一。。。
离线仁杰

发帖
450
M币
121
专家
1
粉丝
14
只看该作者 13楼 发表于: 2017-02-04
優秀文章  希望能用

发帖
522
M币
908
专家
11
粉丝
16
只看该作者 14楼 发表于: 01-13
曾经打算开源,后来发现有问题,旋钮停在两个步中间的时候会引起不断查询。暂时还未修改
离线lxa0

发帖
1128
M币
352
专家
10
粉丝
44
只看该作者 15楼 发表于: 01-13
回 广东梁百万 的帖子
广东梁百万:曾经打算开源,后来发现有问题,旋钮停在两个步中间的时候会引起不断查询。暂时还未修改 (2018-01-13 17:21) 回 广东梁百万 的帖子

上你的汇编代码看看?

发帖
522
M币
908
专家
11
粉丝
16
只看该作者 16楼 发表于: 01-14
回 lxa0 的帖子
lxa0:
上你的汇编代码看看? 回 lxa0 的帖子



下面程序是在自制的STC15W408AS试验板上运行,有缺陷还没完善

;下面是寄存器的分配使用


     EC11_A EQU P1.1
     EC11_B EQU P1.2
     EC11_SW EQU P1.3
     EC11JSRAM EQU 32H   ;延时次数计数

     TSRAM0 EQU 27H         ;定时器计数用的寄存器0
     TSRAM1 EQU 28H         ;定时器计数用的寄存器1
     TSRAM2 EQU 29H         ;定时器计数用的寄存器1
     TSRAM3 EQU 2AH          ;定时器计数用的寄存器1
     TSRAM4 EQU 2BH          ;定时器计数用的寄存器1

    YSRAM1 EQU 30H       ;延时用寄存器1
    YSRAM2 EQU 31H      ;延时用寄存器2


    S1X EQU 7FH   ;个位显示数
    S10X EQU 7EH  ;十位显示数
    S100X EQU 7DH  ;百位显示数
    S1000X EQU 7CH  ;千位显示数



    SW2RAM EQU 76H  ;SW2按键计数







           ORG 0000H
           LJMP AA1

           ORG 0063H;T2中断入口
           LJMP T2INT
           ORG 0100H


;数值初始化

          AA1:MOV SP,#60H;设定堆栈底在RAM的60H
           ORL AUXR,#04H;定时器1T模式
           MOV T2L,#080H;2MS定时值
           MOV T2H,#044H
           ORL AUXR,#10H;T2开始计时

           ORL IE2,#04H;允许T2中断
           SETB EA

           MOV TSRAM0,#00H
           MOV TSRAM1,#00H
           MOV TSRAM2,#00H
           MOV TSRAM3,#00H

           MOV S1X,#00    ;四个显示数初始置零
           MOV S10X,#00
           MOV S100X,#00
           MOV S1000X,#00



           MOV SW2RAM,#00    ;清SW2按键计数


           MOV R1,#S1X


;运行主程序

       AA2:
           NOP
           LCALL SET_SC1
           NOP

           NOP
           LCALL EC11PMAB
           NOP
           LJMP AA2


;T2定时器中断处理程序

     T2INT:MOV F0,C;保护C位到标志位地址FO--T2中断处理程序开始
           PUSH A
           INC TSRAM0;计数,12MHZ,每2ms加一次
           NOP
           INC TSRAM1;时钟计数  12MHZ,每2ms加一次
           NOP
           INC TSRAM2;*******备用****12MHZ,每2ms加一次
           NOP

          MOV A,TSRAM1

          CJNE A,#050,AA3;  RAM的TSRAM1加到100MS就清空
          MOV TSRAM1,#00H
          INC TSRAM3;   每100ms就加1
          NOP


      AA3:MOV A,TSRAM0
          CJNE A,#050,AA4;TSRAM0加到100MS就清空
          MOV TSRAM0,#000
          INC TSRAM4;每100ms就加1
          MOV A,TSRAM4
          CJNE A,#10,AA4
          MOV TSRAM4,#00

          INC SS10    ;十秒计时器加1

          NOP

     AA4:MOV C,F0;恢复C位,****标志位地址FO用来做中断现场保护
         POP A
         RETI





;带设置闪烁的显示程序

    SET_SC1:MOV S1X,MM1       ;把数值送到显示寄存器上
            MOV S10X,MM10
            MOV S100X,HH1
            MOV S1000X,HH10
            LCALL SC1
            RET





;显示程序SC1

     SC1:MOV R0,#7FH
         SETB P2.0 ;**********显示子程序************
         SETB P2.1
         SETB P2.2
         SETB P2.3
         SETB P2.4


         LCALL SS1;调用显示段转换数
         MOV P3,A
         CLR P2.0;           显示个位
         NOP;延长显示时间
         NOP
         NOP
         SETB P2.0;关闭个位显示
         MOV P3,#0FFH

         NOP
         NOP
         NOP


         LCALL SS1;调用显示段转换数
         MOV P3,A

         CLR P2.3;           显示十位
         NOP;延长显示时间
         NOP
         NOP
         SETB P2.3;关闭十位显示
         MOV P3,#0FFH

         NOP
         NOP
         NOP


         LCALL SS1;调用显示段转换数
         MOV P3,A

         CLR P2.2;           显示百位
         NOP;延长显示时间
         NOP
         NOP
         SETB P2.2;关闭百位显示
         MOV P3,#0FFH


         NOP
         NOP
         NOP


         LCALL SS1;调用显示段转换数
         MOV P3,A

         CLR P2.1;           显示千位
         NOP;延长显示时间
         NOP
         NOP
         SETB P2.1;关闭千位显示
         MOV P3,#0FFH

         NOP
         NOP
         NOP

         CLR P2.2  ;显示时钟点
         CLR P3.7
         NOP
         NOP
         SETB P2.2
         SETB P3.7

         RET


SS1:MOV A,@R0;显示数码管数据转换       ;15W408AS试验板显示码
          MOV DPTR,#SQR
          MOVC A,@A+DPTR
          DEC R0
          CJNE R0,#7BH,SS2
          MOV R0,#7FH
          SS2:RET

         SQR:DB 088H  ;数字0的段数据
             DB 0EEH  ;数字1的段数据
             DB 092H   ;2
             DB 0C2H   ;3
             DB 0E4H   ;4
             DB 0C1H   ;5
             DB 081H   ;6
             DB 0EAH   ;7
             DB 080H   ;8
             DB 0C0H   ;9
             DB 0A0H   ;A
             DB 085H   ;B
             DB 099H   ;C
             DB 086H   ;D
             DB 091H   ;E
             DB 0B1H   ;F
             DB 0F7H   ;中-
             DB 0A8H   ;下_
             DB 08CH    ;n
             DB 0DFH    ;U
             DB 0FFH   ;灭零无显示,数值是#20







;EC11编码器进入程序

     EC11PMAB:PUSH A
              MOV F0,C;保护C位到标志位地址FO
              LCALL EC11PM1   ;先检查A端是否先变0
              NOP
              LCALL EC11PM1B;先检查B端是否先变0
              MOV C,F0;恢复C位
              POP A
              RET


;EC11编码器程序A端

    EC11PM1:JNB EC11_A,EC11PM2       ;A端先变0的程序
            RET;没有转动就返回

    EC11PM2:LCALL DELAY100USB;延时0.1毫秒用以消除干扰
            JNB EC11_A,EC11PM3
            RET;确定是干扰就返回

    EC11PM3:JB EC11_B,EC11PM4
            LCALL DELAY20MSB;0.1毫秒后如果B端不是1那就是误动作,延时20毫秒再返回
            LCALL SET_SC1  ;*****试验发现,如果旋转不到位那会不断到此段死循环

            RET
    EC11PM4:LCALL DELAY100USB;延时0.1毫秒用以消除干扰
            JNB EC11_A,EC11PM5;再次查看A端是否为0
            LCALL DELAY100USB  ;如果A端不是0那就延时0.5毫秒再返回
            LCALL DELAY100USB
            LCALL DELAY100USB
            LCALL DELAY100USB
            LCALL DELAY100USB

            RET

    EC11PM5:MOV EC11JSRAM,#00;清空延时次数计数器
            CPL P5.5
    EC11PM6:JNB EC11_B,EC11PM7;等待B端变0
            LCALL DELAY100USB;延时1次0.1毫秒
            INC EC11JSRAM;延时次数加1
            MOV A,EC11JSRAM
            CJNE A,#200,EC11PM6;如果未到200次那就再次等待
            MOV EC11JSRAM,#00
            RET      ;20毫秒后B端还是为1那就是误动作了

    EC11PM7:INC MM1   ;确定B端变0了,那计数加1
            MOV A,MM1
            CJNE A,#10,EC11PM9
            MOV MM1,#00   ;个位到十那进位
            INC MM10  ;十位加1
            MOV A,MM10
            CJNE A,#6,EC11PM9
            MOV MM10,#00  ;十位到6那清空



    EC11PM9:LCALL DELAY100US  ;两端都为1了那延时0.1毫秒再返回

            RET

;EC11编码器程序B端
    EC11PM1B:JNB EC11_B,EC11PM2B       ;B端先变0的程序
            RET;没有转动就返回

    EC11PM2B:LCALL DELAY100USB;延时0.1毫秒用以消除干扰
            JNB EC11_B,EC11PM3B
            RET;确定是干扰就返回

    EC11PM3B:JB EC11_A,EC11PM4B
            LCALL DELAY20MS;0.1毫秒后如果B端不是1那就是误动作,延时20毫秒再返回
            RET
    EC11PM4B:LCALL DELAY100USB;延时0.1毫秒用以消除干扰
            JNB EC11_B,EC11PM5B;再次查看B端是否为0
            LCALL DELAY100USB  ;如果B端不是0那就延时0.5毫秒再返回
            LCALL DELAY100USB
            LCALL DELAY100USB
            LCALL DELAY100USB
            LCALL DELAY100USB
            RET

    EC11PM5B:MOV EC11JSRAM,#00;清空延时次数计数器
    EC11PM6B:JNB EC11_A,EC11PM7B;等待A端变0
            LCALL DELAY100USB;延时1次0.1毫秒
            INC EC11JSRAM;延时次数加1
            MOV A,EC11JSRAM
            CJNE A,#200,EC11PM6B;如果未到200次那就再次等待
            MOV EC11JSRAM,#00
            RET      ;20毫秒后A端还是为1那就是误动作了

    EC11PM7B:DEC MM1         ;分位减1
             MOV A,MM1
             CJNE A,#255,EC11PM9B    ;比较是否小于0
             MOV MM1,#09        ;如果分个位对比小于0那就置9
             DEC MM10            ;分十位减1
             MOV A,MM10
             CJNE A,#255,EC11PM9B   ;比较是否小于0
             MOV MM10,#05        ;如果分十位对比小于0那就置5



    EC11PM9B:LCALL DELAY100US  ;两端都为1了那延时0.1毫秒再返回




;10MS软件延时程序,@12MHZ

DELAY10MS:            ;@12.000MHz,10MS软件延时程序
    NOP

    MOV YSRAM1,#94
    MOV YSRAM2,#93
NEXT1:
    DJNZ YSRAM2,NEXT1
    DJNZ YSRAM1,NEXT1

    RET


;0.1毫秒延时程序

DELAY100US:            ;@11.0592MHz

    MOV YSRAM1,#218
NEXT2:
    DJNZ YSRAM1,NEXT2

    RET


;20毫秒延时程序

DELAY20MS:            ;@11.0592MHz

    MOV YSRAM1,#173
    MOV YSRAM2,#27
NEXT3:
    DJNZ YSRAM2,NEXT3
    DJNZ YSRAM1,NEXT3

    RET


;调用显示程序作延时20MS


DELAY20MSB:MOV YSRAM1,#190

NEXT4:LCALL SET_SC1
      DJNZ YSRAM1,NEXT4

      RET


;调用显示程序作延时0.1MS


DELAY100USB:MOV YSRAM1,#9

NEXT5:LCALL SET_SC1
      DJNZ YSRAM1,NEXT5

      RET



[ 此帖被广东梁百万在2018-01-15 22:37重新编辑 ]
离线一域之地

发帖
66
M币
-476
专家
0
粉丝
2
只看该作者 17楼 发表于: 01-14
汇编不错,
给个思路,明白好中间状态,设置好,就成了。
离线一域之地

发帖
66
M币
-476
专家
0
粉丝
2
只看该作者 18楼 发表于: 01-14
不管是调中断还是主程序中大循环来进行工作,编码开关工作前来个判断,工作过程中进行累加或累减,中间过程不为有效值,这样比较清楚。
程序再简单些,能不用中断就不用中断。