|
我采用普诚PT2257电子音量芯片,89S51单片机,用两个按键控制音量加和减。但我写的程序在音量加减是会跳跃,还会有杂音。程序如下,请那位熟悉的朋友告知原因,谢谢!
我得email:youliang.chen@163.com
SCL BIT P1.0
SDA BIT P1.1
DB1 EQU R1
DB10 EQU R2
ORG 0000H
MOV DB1, 00H
MOV DB10,00H
LJMP MAIN
MAIN:
LJMP VOLINC
VOLINC:
JB P3.0,VOLDEC; (判断音量+是否按下)
ACALL VOL_DELAY20MS
JB P3.0,VOLDEC
MOV A,DB1;(将音量个位数放入寄存器A中)
CJNE A,#0D,VOLINC1;(判断音量个位是否最大)
MOV A,DB10;(将音量十位放入寄存器A中)
CJNE A,#0D,VOLINC2;(判断音量十位是否最大)
LJMP MAIN;(是最大就返回)
VOLINC1:
DEC A;(音量个位减1)
MOV DB1,A;(放入DB1中保存)
ACALL VOL;(调用音量处理子程序)
LJMP MAIN
VOLINC2:
DEC A;(音量十位减1)
MOV DB10,A;(放入DB10中保存)
ACALL VOL;(调用音量处理程序)
MOV DB1,#10D
LJMP MAIN;(返回)
RET
VOLDEC:
JB P3.1,MAIN;(判断音量-是否按下)
ACALL VOL_DELAY20MS
JB P3.1,MAIN
MOV A,DB1;(将音量个位数放入寄存器A中)
CJNE A,#10D,VOLDEC1;(判断音量个位是否最小)
MOV A,DB10;(将音量十位放入寄存器A中)
CJNE A,#8D,VOLDEC2;(判断音量十位是否最小)
LJMP MAIN
VOLDEC1:
INC A;(音量个位加1)
MOV DB1,A;(放入DB1中保存)
ACALL VOL;(调用音量处理子程序)
LJMP MAIN
VOLDEC2:
INC A;(音量十位加1)
MOV DB10,A;(放入DB10中保存)
MOV DB1,#0D
ACALL VOL;(调用音量处理程序)
LJMP MAIN
RET;(返回)
VOL:
MOV R6,#88H;(将PT2257地址码放入R6中)
NOP
CLR SDA
ACALL VOL_DELAY
CLR SCL
ACALL VOL_DELAY
ACALL VOL_DATA
MOV DPTR,#TAB1
MOV A,DB10
MOVC A,@A+DPTR
MOV R6,A
ACALL VOL_DATA
MOV DPTR,#TAB2
MOV A,DB1
MOVC A,@A+DPTR
MOV R6,A
ACALL VOL_DATA
SETB SCL
ACALL VOL_DELAY
ACALL VOL_DELAY20MS
RET
VOL_DATA:
MOV A,R6
MOV R5,#8
VOL_DATA1:
RLC A
MOV SDA,C
ACALL VOL_DELAY
SETB SCL
ACALL VOL_DELAY
CLR SCL
ACALL VOL_DELAY
DJNZ R5,VOL_DATA1
SETB SCL
ACALL VOL_DELAY
CLR SCL
RET
VOL_DELAY:
MOV R7,#4
DJNZ R7,$
RET
VOL_DELAY20MS:
MOV R1,#40
VOL_DELAY20MS1:
MOV R2,#250
DJNZ R2,$
DJNZ R1,VOL_DELAY20MS1
RET
TAB1:
DB 11100000B,11100001B,11100010B,11100011B,11100100B
DB 11100101B,11100110B,11100111B
TAB2:
DB 11010000B,11010001B,11010010B,11010011B,11010100B
DB 11010101B,11010110B,11010111B,11011000B,11011001B
END |
|