ATC12C2052AD做的旋转编码器4倍频演示程序。同时可以参考TM1638的显示程序

2020-01-30 14:11发布

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;本实验是脉冲上升沿,下降沿捕捉实验,脉冲从P3.5,P3.7
;;;输入,用中断捕捉两路脉动的上升沿和下降沿,从P1.5输出
;;;P1.6,P1.7串行输出到TM1638显示。即旋转编码器4倍频。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    din       equ     p1.5   ;定义TM1638通信管脚
    clk       equ     p1.6
    stb       equ     p1.7  

EPCAI  BIT IE.6
CCON   EQU 0D8H
CMOD   EQU 0D9H
CL     EQU 0E9H
CH     EQU 0F9H
CCAPM0 EQU 0DAH
CCAPM1 EQU 0DBH
CCF0   BIT CCON.0
CCF1   BIT CCON.1
CR     BIT CCON.6
ORG 000H
LJMP start
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 0033H
LJMP PCA_ISR
start:
       MOV 56H,#00H
       MOV 57H,#00H
       MOV 50H,#00H
       MOV 51H,#00H

MAIN:
     
     MOV CCON,#0
     CLR A
     MOV CL,A
     MOV CH,A
     MOV CMOD,#00H
     MOV CCAPM0,#31H     ;#11H只捕捉下降沿,#21H捕捉上升沿,#31H上升沿,下降沿都捕捉。
     MOV CCAPM1,#31H
     SETB CR
     SETB EPCAI
     SETB EA
     MOV 56H,51H
     MOV 57H,50H
     lcall HB2
     lcall LOOP
     LCALL DISPAY
     SJMP MAIN
     
PCA_ISR:
     CLR EA
     PUSH ACC
     PUSH PSW
     MOV C,CCF0
     JNC TD2             ;判断CCF0值为0,是有CCF1引起的中断,转B相处理程序
     CLR CCF0            ;以下是A相中断处理程序
     CLR CCF1
     mov c,p3.5          ;以下是判断P3.5与P3.7是否相同,相同加一,不同减一
     mov 20h.1,c
     mov c,p3.7
     mov 21h.1,c
     mov a,20h
     xrl a,21h           ;异或运算,判断P3.5与P3.7是否相同
     mov c,acc.1
     mov p1.4,c
     jc decout
     MOV A,50H
     clr c
     add A,#01H
     MOV 50H,A
     MOV A,51H
     ADDC A,#00H
     MOV 51H,A
     jmp out
     
decout:
     MOV A,50H
     clr c
     SUBB A,#01H
     MOV 50H,A
     MOV A,51H
     SUBB A,#00H
     MOV 51H,A   
       JMP OUT
      
TD2:                         ;B相中断处理程序
     CLR CCF0
     CLR CCF1
     mov c,p3.7              ;以下判断P3.5与P3.7是否相同,相同减一,不同加一
     mov 20h.1,c
     mov c,p3.5
     mov 21h.1,c
     mov a,20h
     xrl a,21h               ;异或运算,判断P3.5与P3.7是否相同
     mov c,acc.1
;     mov p1.4,c
     jc decout2
     MOV A,50H
     clr c
     SUBB A,#01H
     MOV 50H,A
     MOV A,51H
     SUBB A,#00H
     MOV 51H,A
     jmp out
     
decout2:
     MOV A,50H
     clr c
     add A,#01H
     MOV 50H,A
     MOV A,51H
     ADDC A,#00H
     MOV 51H,A   
        
      
      
OUT:
     
     POP PSW
     POP ACC
     SETB EA
     RETI   
     
;;以下只是把四倍频的结果送到TM1638组成是六位数码管显示,真正应用的时候就不要用了。     
     
;入口条件:待转换的双字节十六进制整数在56H、57H中。
;出口信息:转换后的三字节BCD码整数在53H、54H、55H中。
;影响资源:PSW、A、52H~57H 堆栈需求: 2字节

HB2: CLR A ;BCD码初始化
MOV 53H,A
MOV 54H,A
MOV 55H,A
MOV 52H,#10H ;转换双字节十六进制整数
HB3: MOV A,57H ;从高端移出待转换数的一位到CY中
RLC A
MOV 57H,A
MOV A,56H
RLC A
MOV 56H,A
MOV A,55H ;BCD码带进位自身相加,相当于乘2
ADDC A,55H
DA A ;十进制调整
MOV 55H,A
MOV A,54H
ADDC A,54H
DA A
MOV 54H,A
MOV A,53H
ADDC A,53H
MOV 53H,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ 52H,HB3 ;处理完16bit
RET

LOOP:

       MOV A,53H
       ANL A,#0FH
       MOV 75H,A
       MOV A,53H
       SWAP A
       ANL A,#0FH
       MOV 76H,A
       MOV A,54H
       ANL A,#0FH
       MOV 73H,A
       MOV A,54H
       SWAP A
       ANL A,#0FH
       MOV 74H,A
       MOV A,55H
       ANL A,#0FH
       MOV 71H,A
       MOV A,55H
       SWAP A
       ANL A,#0FH
       MOV 72H,A      
       RET
     
     
;---------TM1616写程序-------------------     
      
PUT:  mov    R2,#8          ;设定发送数据为8位
      clr    stb            ;拉底STB
      clr    c              ;清C
put1: rrc    a              ;带进位右移,D0移到C
      clr    clk            ;拉低CLK时钟线
      nop
      nop
      nop
      nop
      mov    din,c          ;把C中数移动到DIN
      nop
      nop
      nop
      nop
      setb   clk            ;把时钟clk拉高
      nop
      nop
      nop
      nop
      djnz  R2,put1
      ret
;-------TM1616显示子程序----------               

dispay: mov a,#00h             ;设TM1616芯片为4位7段显示方式
       lcall put               ;调用写入子程序
       setb  stb               ;拉高stb,写入生效
       mov a,#44h              ;设定TM1616芯片为绝对地址方式
       lcall put
       setb stb
       mov  a,#0c0h            ;左起第一位显示地址
       lcall put
       mov  a,76h              ;把显示储存地址72h取到A
       mov  dptr,#tab          ;取段码表地址
       movc  a,@a+dptr         ;查表
       lcall put
       setb stb
       mov a,#0c2h             ;左起第二位显示地址
       lcall put
       mov  a,75h
       mov  dptr,#tab
       movc  a,@a+dptr
       lcall put
       setb  stb
       mov a,#0c4h             ;左起第三为显示地址
       lcall put
       mov  a,74h

       mov  dptr,#tab
       movc  a,@a+dptr
       lcall put
       setb  stb
       mov a,#0c6h              ;左起第四位显示地址。
       lcall put
       mov  a,73h

       mov  dptr,#tab
       movc  a,@a+dptr
       lcall put
       setb  stb
      
       mov a,#0c8h             ;左起第五位显示地址
       lcall put
       mov  a,72h

       mov  dptr,#tab
       movc  a,@a+dptr
       lcall put
       setb  stb
      
       mov a,#0cAh             ;左起第六为显示地址
       lcall put
       mov  a,71h

       mov  dptr,#tab
       movc  a,@a+dptr
       lcall put
       setb  stb
  
       mov  a,#08fh             ;写入10001111,后三位是亮度级别,倒数第四位是开关显示器。前面两位10代表显示控制命令。
       lcall put
       setb stb         
       ret  
      
TAB:  DB 03fh,06h,05bh,04fh,066h,06dh,07dh,07h,07fh,06fh        ;共阴极编码
     
      
     
     END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。