;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;本实验是脉冲上升沿,下降沿捕捉实验,脉冲从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
一周热门 更多>