📄 test.asm
字号:
;* 标题: 5.1 PT2258功放程序
;* 硬件: 配原程序的5.1功放单面PCB板DIY套件
;* 文件: MA035.ASM
;* 日期: 2002-1-2
;* 版本: 1.0
;* 作者: 单片机音响技术网 - ZHANGSHAOBIN
;* 邮箱: SHAOBINZ@163.COM
;* 描述: ;* PT2258+SEG2+12M+89C2051+TDA7377 功放程序
;* 设置: ;* DIY套件,按清单DIY焊接和指导文件即可成功
;* 【版权】 COPYRIGHT(C)单片机音响技术网 WWW.MCU51AV.COM ALL RIGHTS RESERVED
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!
COUNTER EQU 35H ;显示计数
REMVOL EQU 36H ;音量连续控制
DISPBUFF1 EQU 37H ;个位暂存
DISPBUFF2 EQU 38H ;十位暂存
DISPBUFF3 EQU 39H ;指示灯暂存
DISPBUFF EQU 3AH ;显示缓冲区
;-----------------------------------------------------------
MTD EQU 30H ;PT2258数据首址(30H-31H,16字节)
NUMBYT EQU 3BH ;PT2258数据位数
;-----------------------------------------------------------
CS_X1 EQU 3CH ;遥控
CS0_X1 EQU 3DH
U0_X1 EQU 3EH ;遥控数据暂存区
NO_M EQU 40H ;遥控按键数据码
;-----------------------------------------------------------
FRONT EQU 41H ;前置音量缓存
REAR EQU 42H ;环绕音量缓存
CEN EQU 43H ;中置音量缓存
S_UB EQU 44H ;重低音音量缓存
RVER EQU 45H ;环绕微调音量缓存
CVER EQU 46H ;中置微调音量缓存
SVER EQU 47H ;重低音微调音量缓存
FVER EQU 48H ;前置微调音量缓存
PHONE EQU 49H
NO_N EQU 51H
;-----------------------------------------------------------
ORG 0000H
AJMP START
ORG 000BH ;定时器T0入口
AJMP ITT0
ORG 0013H ;外部中断INT1入口地址
AJMP INO1 ;
ORG 001BH ;
AJMP DISP ;定时器T1入口显示程序
;-----------------------------------------------------------
START: ;初始化
MOV SP,#60H ;指针指向60H
MOV PSW,#00H
MOV IE,#00H
MOV IP,#00H
CLR P3.1 ;刚开机时7370STANDBY待机
CLR EA ;关总中断
CLR P3.5 ;开LED显示(PNP的管子)
SETB P3.7 ;数码管不显示
MOV P1,#7FH ;电源灯亮(P1.7=0),数码管十位也关了
SETB P3.2 ;
SETB P3.4 ;让SDA,SLK保持高电平
CLR P3.0 ;AC-3输入状态
SETB P3.3 ;外中断1为脉冲下降沿触发
MOV TMOD,#00010001B ;定时器0-1工作在方式1
MOV TH1,#0F0H ;定时器1预置
MOV TL1,#60H ;(65536-#FO60H)
MOV TH0,#00H ;定时器0预置
MOV TL0,#00H ;(65536-0)65MS够按键按下的时间即可
SETB TR0 ;开定时器0中断
SETB ET0 ;开定时器0中断允许
SETB EA ;中断总开关开
SETB EX1 ;外中断1中断允许
SETB IT1 ;外中断1INT1为负跳变触发方式
CLR EX0 ;外中断0中断不允许
CLR TR1 ;定时器1暂不允许
CLR (29H).0 ;遥控识别位
MOV REMVOL,#02H ;音量连续控制赋值02H
MOV COUNTER,#0H ;记数器清0
MOV FRONT,#34H ;总音量默认级数34
MOV REAR,#34H
MOV CEN,#34H
MOV S_UB,#34H
MOV RVER,#5H ;各声道微跳起始显示5级
MOV CVER,#5H
MOV SVER,#5H
MOV FVER,#5H
MOV DISPBUFF,#40H ;数码管准备显示40
ACALL DELAY ;刚开机时不能马上给PT2258送数
NOP ;延时250MS左右,PT2258要求300MS
ACALL DELAY
NOP
ACALL DELAY
NOP
ACALL DELAY
NOP
ACALL DELAY
NOP
MOV 30H,#0C0H ;PT2258默认1100 0000,CLEAR REGIST
MOV NUMBYT,#01H ;PT2258数据位数赋值01只传8位
ACALL WRNBYT ;I2C数据总线
NOP
NOP
MOV 30H,#0D3H ;1101 0011(6CH 10DB/STEP,-30DB)
MOV 31H,#0E4H ;1110 0100(6CH 1DB/STEP,-4DB)
MOV NUMBYT,#02H ;PT2258数据位数赋值02
ACALL WRNBYT
NOP
MOV NO_M,#00H ;遥控按键数据码为0,无键按下状态
MOV NO_N,#00H
MOV DISPBUFF3,#0DFH ;指示灯暂存1101 1111(还未到P1口)
;============================主程序=========================
MAIN: SETB EA ;允许中断总开关开
CLR TR1 ;定时器1暂不允许
CLR ET1 ;关定时器1中断允许
SETB P3.7 ;关数码管个位
MOV P1,#7FH ;电源灯可亮,数码管十位也关了
CLR P3.5 ;开指示灯,电源灯就亮了
CLR P3.1 ;TDA7370低电平静音
SETB P3.2
SETB P3.4
MOV 30H,#0F9H ;1111 1001(2258静音OF8就不静)
MOV NUMBYT,#01H ;PT2258数据位数赋值01
ACALL WRNBYT ;写入2258 ;2258就静掉了
NOP
PW_1: SETB P3.2 ;I2C终止
SETB P3.4
MOV A,NO_M ;调按键标准数(0~10)
JZ PW_1 ;无键按下就在此处循环
MOV NO_M,#00H
XRL A,#01H ;
JNZ PW_1 ;按MUTE键也在此处循环
SETB P3.1 ;打开功放,NO STANDBY状态
SETB TR1 ;开定时器1 ;否则数码管有显示
SETB ET1 ;开中断1
CLR (29H).1 ;清静音标志位
ACALL CLMUT ;2258 NO MUTE
NOP
MOV R2,#00H
MOV R3,#0FH
LOOP: SETB P3.2
SETB P3.4
MOV A,R3
XRL A,#0FH ;R3=0FH,则A=0
JNZ KEY ;A不为0则转到KEY
MOV R3,#00H
MOV A,DISPBUFF3
ORL A,#01010110B ;(1101 1111 ORL 0101 0110)
MOV DISPBUFF3,A ;(ORL后A=1101 1111,AC-3灯亮)
CLR (29H).2
CLR (29H).3
CLR (29H).4
CLR (29H).5
MOV R5,DISPBUFF ;(#40H放入R5)
ACALL DISP_VOL ;调显示音量
NOP
KEY: ;遥控散转
MOV A,NO_M ;键盘转换值0~11,0,1,2,3...
JZ LOOP ;键值=0转LOOP
MOV NO_M,#00H ;并将键转换值清0
RL A ;实现(0-0,1-2,2-4,3-6,4-8倍乘)
MOV DPTR,#TAB_KEY
NOP
JMP @A+DPTR
AJMP LOOP ;入口地址: TAB_KEY
AJMP MAIN ;TAB_KEY+2
AJMP MUTE ;TAB_KEY+4
AJMP AC_3_IN ;TAB_KEY+6
AJMP RESET ;TAB_KEY+8
AJMP AUX_IN ;TAB_KEY+10
AJMP FRONT_V ;TAB_KEY+12
AJMP CEN_V ;TAB_KEY+14
AJMP REAR_V ;TAB_KEY+16
AJMP SUB_V ;TAB_KEY+18
AJMP VOLDN ;TAB_KEY+20
AJMP VOLUP ;TAB_KEY+22
AJMP LOOP ;
AJMP LOOP
;===========================================================
RESET: ;复位状态
CLR P3.0 ;AC-3状态
MOV FRONT,#34H ;#34H
MOV REAR,#34H
MOV CEN,#34H
MOV S_UB,#34H
MOV RVER,#5H
MOV CVER,#5H
MOV SVER,#5H
MOV FVER,#5H
MOV DISPBUFF,#40H ;数码管显示40
MOV DISPBUFF3,#0DFH ;(1101 1111转AC-3指示)
MOV 30H,#0D3H ;(1101 0011 6CH -10DB/STEP -30DB)
MOV 31H,#0E4H ;(1110 0100 6CH -1DB/STEP -4DB)
MOV NUMBYT,#02H ;2258传16位数
ACALL WRNBYT
NOP
AJMP INPUT_A ;跳转
;-----------------------------------------------------------
AC_3_IN: ;5.1CH输入状态
MOV 30H,#0F9H ;(1111 1001,2258静音)
MOV NUMBYT,#01H
ACALL WRNBYT
NOP
ACALL DELAY ;(延时50MS)
NOP
MOV DISPBUFF3,#0DFH ;(AC-3灯状态缓存起来TI到时就亮)
CLR P3.0 ;AC-3输入
NOP
AJMP INPUT_A ;跳转
;-----------------------------------------------------------
AUX_IN: ;2CH输入状态
MOV 30H,#0F9H ;(2258静音)
MOV NUMBYT,#01H
ACALL WRNBYT
NOP
ACALL DELAY
NOP
MOV DISPBUFF3,#0F7H ;(AUX灯状态缓存起来)
SETB P3.0 ;AUX输入
INPUT_A: SETB (29H).1 ;保证2258不会静音
ACALL DELAY ;延时50MS
NOP
MOV 30H,#0F8H ;(1111 1000 2258 NO MUTE)
MOV NUMBYT,#01H ;(2258传8位数)
ACALL WRNBYT
NOP
MOV R3,#0FH ;
MOV R2,#00H
NOP
AJMP LOOP ;循环
;-----------------------------------------------------------
MUTE: CPL (29H).1 ;(29H).1先取反,保证2258 MUTE ON
JB (29H).1,MUT_1 ;如果=1,跳转
CLR P3.1
MOV 30H,#0F9H ;(1111 1001,2258 MUTE ON)
WRN_1: MOV NUMBYT,#1H
LCALL WRNBYT ;静音数据写入2258
NOP
MOV R2,#00H
MOV R3,#0FH
NOP
AJMP LOOP ;循环
MUT_1: SETB P3.1
MOV 30H,#0F8H ;(1111 1000,2258 MUTE)
MOV A,DISPBUFF3
ORL A,#10000000B ;(原来亮的仍亮,静音灯要熄)
MOV DISPBUFF3,A ;(ORL是有1出1,全0出0)
NOP
AJMP WRN_1 ;跳转
;-----------------------------------------------------------
FRONT_V: SETB (29H).2 ;为FRONT VOLUP准备条件
CLR (29H).3
CLR (29H).4
CLR (29H).5
MOV R5,FVER ;(FEVER=48H,R5=#5H)
MOV A,DISPBUFF3
ANL A,#11101111B ;先保证前置灯亮,有0出0,全1出1
ORL A,#01000110B ;有1出1,全0出0,第4,5位必须为0在或
NOP
AJMP LOOP_D ;跳转
;-----------------------------------------------------------
REAR_V: CLR (29H).2
SETB (29H).3 ;为REAR VOLUP准备条件
CLR (29H).4
CLR (29H).5
MOV R5,RVER
MOV A,DISPBUFF3
ANL A,#10111111B ;保证环绕灯亮
ORL A,#00010110B
NOP
AJMP LOOP_D
;-----------------------------------------------------------
CEN_V: CLR (29H).2
CLR (29H).3
SETB (29H).4 ;为CEN VOLUP准备条件
CLR (29H).5
MOV R5,CVER
MOV A,DISPBUFF3
ANL A,#11111101B ;保证中置灯亮
ORL A,#01010100B
NOP
AJMP LOOP_D
;-----------------------------------------------------------
SUB_V: CLR (29H).2
CLR (29H).3
CLR (29H).4
SETB (29H).5 ;为SW VOLUP准备条件
MOV R5,SVER
MOV A,DISPBUFF3
ANL A,#11111011B ;保证重低音灯亮
ORL A,#01010010B
;-----------------------------------------------------------
LOOP_D: MOV DISPBUFF3,A
ACALL DISP_VOL ;调用音量显示
NOP
ACALL CLMUT ;2258要静音
NOP
MOV R2,#00H
MOV R3,#00H
LOOP_A: NOP
AJMP LOOP
;/////////////////////////////////////////////////////////
CN_VOLUP_1: NOP
AJMP CN_VOLUP
SB_VOLUP_1: NOP
AJMP SB_VOLUP
VOLUP: ;实现2258衰减数减,即音量变大,PHONE是-,反过来理解
MOV 30H,#0C0H ;(1100 0000,2258CLEAR REGISTER)
MOV NUMBYT,#01H
ACALL WRNBYT ;调用I2C
NOP
ACALL CLMUT ;2258静音
NOP
MOV R3,#0
JB (29H).2,FR_VOLUP
JB (29H).3,RR_VOLUP
JB (29H).4,CN_VOLUP_1
JB (29H).5,SB_VOLUP_1
MOV A,DISPBUFF
XRL A,#69H ;最高级别69H
JZ LOOP_A ;到69级就跳回去LOOP
MOV PHONE,FRONT
ACALL DAA
NOP
MOV FRONT,PHONE ;FRONT+1(递加)
MOV PHONE,REAR
ACALL DAA
NOP
MOV REAR,PHONE ;REAR+1
MOV PHONE,CEN
ACALL DAA
NOP
MOV CEN,PHONE ;CENT+1
MOV PHONE,S_UB
ACALL DAA
NOP
MOV S_UB,PHONE ;SW+1
MOV PHONE,DISPBUFF
ACALL UAA
NOP
MOV DISPBUFF,PHONE ;DISPBUFF+1
ACALL FRDATA ;调前置2258调节
NOP
ACALL RRDATA ;调环绕2258调节
NOP
ACALL CNDATA ;调中置2258调节
NOP
ACALL SBDATA ;调低音2258调节
NOP
MOV R5,DISPBUFF ;该显示的级数
NOP
AJMP TT_VOLUP ;到音量显示
FR_VOLUP: ;前置音量递加处理
MOV A,FVER
XRL A,#10H ;到10级吗
JZ LOOP_B ;到了就跳转
MOV PHONE,FVER
ACALL UAA
NOP
MOV FVER,PHONE ;级数加1
MOV PHONE,FRONT
ACALL DAA ;使2258衰减数变小,即音量增加
NOP
MOV FRONT,PHONE
ACALL FRDATA ;调2258数据处理
NOP
MOV R5,FVER ;要显示的级数
NOP
AJMP TT_VOLUP ;到音量级数显示
LOOP_B: NOP
AJMP LOOP
RR_VOLUP: ;环绕音量递加处理
MOV A,RVER
XRL A,#10H
JZ LOOP_B
MOV PHONE,RVER
ACALL UAA
NOP
MOV RVER,PHONE
MOV PHONE,REAR
ACALL DAA
NOP
MOV REAR,PHONE
ACALL RRDATA
NOP
MOV R5,RVER
NOP
AJMP TT_VOLUP
CN_VOLUP: ;中置递加处理
MOV A,CVER
XRL A,#10H
JZ LOOP_B
MOV PHONE,CVER
ACALL UAA
NOP
MOV CVER,PHONE
MOV PHONE,CEN
ACALL DAA
NOP
MOV CEN,PHONE
ACALL CNDATA
NOP
MOV R5,CVER
NOP
AJMP TT_VOLUP
SB_VOLUP: ;重低音递加处理
MOV A,SVER
XRL A,#10H
JZ LOOP_C
MOV PHONE,SVER
ACALL UAA
NOP
MOV SVER,PHONE
MOV PHONE,S_UB
ACALL DAA
NOP
MOV S_UB,PHONE
ACALL SBDATA
NOP
MOV R5,SVER
TT_VOLUP: ACALL DISP_VOL
NOP
LOOP_C: NOP
AJMP LOOP
CN_VOLDN_1: NOP
AJMP CN_VOLDN
SB_VOLDN_1: NOP
AJMP SB_VOLDN
;-----------------------------------------------------------
VOLDN: ;实现2258衰减数加,即音量变小,PHONE是+,反过来理解
ACALL CLMUT
NOP
MOV R3,#0
JB (29H).2,FR_VOLDN
JB (29H).3,RR_VOLDN
JB (29H).4,CN_VOLDN_1
JB (29H).5,SB_VOLDN_1
MOV A,DISPBUFF
JZ LOOP_C
;以下音量加其实是2258写入数据减,衰减少一些,前置,环绕
;中置,重低音都要让衰减数变小,及衰减DB少
MOV PHONE,FRONT
ACALL UAA
NOP
MOV FRONT,PHONE
MOV PHONE,REAR
ACALL UAA
NOP
MOV REAR,PHONE
MOV PHONE,CEN
ACALL UAA
NOP
MOV CEN,PHONE
MOV PHONE,S_UB
ACALL UAA
NOP
MOV S_UB,PHONE
MOV PHONE,DISPBUFF
ACALL DAA ;但是显示的数却是递加,故调用DAA
NOP
MOV DISPBUFF,PHONE
ACALL FRDATA ;调前置2258调节
NOP
ACALL RRDATA ;调环绕2258调节
NOP
ACALL CNDATA ;调中置2258调节
NOP
ACALL SBDATA ;调低音2258调节
NOP
MOV R5,DISPBUFF ;该显示的级数
NOP
AJMP TT_VOLUP ;到音量显示
FR_VOLDN: ;前置音量递减
MOV A,FVER
JZ LOOP_C
MOV PHONE,FVER
ACALL DAA
NOP
MOV FVER,PHONE
MOV PHONE,FRONT
ACALL UAA
NOP
MOV FRONT,PHONE
ACALL FRDATA
NOP
MOV R5,FVER
NOP
AJMP TT_VOLUP
RR_VOLDN: ;环绕音量递减
MOV A,RVER
JZ LOOP_E
MOV PHONE,RVER
ACALL DAA
NOP
MOV RVER,PHONE
MOV PHONE,REAR
ACALL UAA
NOP
MOV REAR,PHONE
ACALL RRDATA
NOP
MOV R5,RVER
NOP
AJMP TT_VOLUP
LOOP_E: NOP
AJMP LOOP
CN_VOLDN: ;中置音量递减
MOV A,CVER
JZ LOOP_E
MOV PHONE,CVER
ACALL DAA
NOP
MOV CVER,PHONE
MOV PHONE,CEN
ACALL UAA
NOP
MOV CEN,PHONE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -