📄 av.asm
字号:
;;;;;;;;;;;;;;;;;;;6CH AMPLIFIER;;;;;;;;;;;;;;;;
;----脚位定义-----
;;;;;;;;;;;;;;;;;;;6CH AMPLIFIER;;;;;;;;;;;;;;;;
;----脚位定义-----
PT6311_CLK EQU P3.4
PT6311_STB EQU P3.5
PT6311_DATA EQU P3.3
UP EQU P3.1
DOEN EQU P3.0
PT2313_DATA EQU P0.7
PT2313_CLK EQU P2.7
AC3 EQU P2.6 ;(控制4053的信号)
M62429_DA EQU P2.3 ;(SURL/R)
M62429_CK EQU P2.4
M62429_CK1 EQU P2.5 ;(C/BW)
M62429_CK3 EQU P0.0 ;(ECHO,MVOL)
M62429_DA3 EQU P1.7
M_DELAY1 EQU P0.1
M_DELAY2 EQU P0.2
AD_OUT BIT P0.5
AD_IN BIT P0.6
;----片内RAM定义--------
GIF_SIGN EQU 40H ; 动画进程标记(=1,走过场字幕 )
GIF_TIME1 EQU 41H ; 动画跑字的时间间隔速度
GIF_LONG EQU 42H ; 动画字幕的长度
DISP_BUFFER EQU 43H ; 显示缓冲区地址指针
DISP_INDEX EQU 44H ; PT6311片内地址指针
INPUT_DATA EQU 60H ;(CD/VCD=1,TUNER=2,AC3=3)
BASS_DATA EQU 45H
TR_DATA EQU 46H
MAIN_DATA EQU 47H
BAL_DATA EQU 48H
MVOL_DATA EQU 49H
ECHO_DATA EQU 4AH
SURL_DATA EQU 4BH
SURR_DATA EQU 4CH
CEN_DATA EQU 4EH
BW_DATA EQU 4FH
DELAY_DATA EQU 50H
DSP_DATA EQU 51H
CH_DATA EQU 52H ;CH_DATA=#0,5.1CH CH_DATA=#1,3.1CH CH_DATA=#2,2.1CH CH_DATA=#3,2.0CH
KEY_NUM EQU 53H ;按键编号,INPUT=2,MAIN=3,OK=4,V-=5,V+=1
KEYNUM_SAVE EQU 54H ;按键过去式记录
SYS_SIGN EQU 55H ;真值表
KEY_DELAY EQU 56H ;每执行一次按键处理所间隔的时间
DIV_16 EQU 57H
DP_NUM EQU 58H ;自动电平当前进度的格数
DP_MODE EQU 59H ;电平显示模式,分单针显示,双针显示等多种多样
REM_SIGN EQU 5AH ;
REM_FIX EQU 5BH ;
REM_KEY EQU 5DH ;
REM_KEY1 EQU 5EH ;
REM_TIME EQU 5FH ;
AD_SIGN EQU 61H ;AD进程标记 (=0则把电容放电,=1则进行数据检测,=2则表示检测完成,存入数据到AD_DATA)
AD_CLR EQU 62H ;AD放电时间记忆单元
AD_CYC EQU 6AH ;AD判断周期记忆单元
AD_TEM EQU 63H ;AD数据临时保存单元
AD_DATA1 EQU 64H ;AD转换最终存放数据
AD_TIME EQU 65H ;AD模拟运算速度调节
AD_SIM1 EQU 66H ;AD模拟运算结果保存单元1
AD_SIM2 EQU 67H ;AD模拟运算结果保存单元2
AD_SIM3 EQU 68H ;AD模拟运算结果保存单元3
AD_SIM4 EQU 69H ;AD模拟运算结果保存单元4
AD_TIME2 EQU 21H ;AD自动电平上升时间
AD_DATA2 EQU 6BH ;AD转换最终存放数据2
AD_DATA3 EQU 6CH ;AD转换最终存放数据3
AD_DATA4 EQU 6DH ;AD转换最终存放数据4
AUTO_NUM EQU 6EH ;AD_DATA1连续为0的数量统计标记
AUTO_TIME EQU 6FH
DP_SAVE EQU 70H ;显示模式记忆单元
TIME1 EQU 71H ;主循环执行时间
TIME2 EQU 72H ;显示缓冲区数据处理间隔时间
DISP_H EQU 73H
DISP_L EQU 74H
MTD5 EQU 75H
MTD4 EQU 76H
MTD3 EQU 77H
MTD2 EQU 78H
MTD1 EQU 79H
KEY_CELL EQU 7AH ;(7FH-7AH为6个键值保存单元)
POWER EQU 20H.4 ;开关机标记,POWER=0,开机 POWER=1,关机
BOOT_STR EQU 20H.5 ;开机初始化标记,首次开机时候置0,读完预置后置1
MUTE_DATA EQU 20H.0 ;MUTE=1,开 MUTE=0,关
LOUND_DATA EQU 20H.1 ;LOUND_DATA=1,开等响,LOUND=0,关等响
STA_DATA EQU 20H.2 ;STA_DATA=0,表示第一次开机 STA_DATA=1,表示开机初始化结束
AUTO_SIGN EQU 20H.3 ;AUTO=0,频谱自走 AUTO=1,显示AD转换结果
;;;;;;;资源占用情况;;;;;;;;
;R7: DISP子程序占用,可通用
;R4,R5 复位占用,独立
;R0,R1,R2 I2C协议占用,可通用
;R3 NC
;R6 通用
;-------------------
ORG 00H
JMP MAIN
ORG 0003H ;EX0中断程序入口,遥控占用
JMP INT
ORG 000BH ;T0溢出中断入口,遥控接收码时间脉宽测量
JMP TIME
ORG 001BH ;T1中断入口
JMP AD_GO
;显示中断入口
MAIN: SETB P2.0
JNB P2.0,$
MOV R0,#95 ;把所有单元数据清0
MOV R1,#20H
FRIST1: MOV @R1,#0
INC R1
DJNZ R0,FRIST1
MOV P3,#0FFH
CALL DESTINE ;调用预设,并把显示缓冲区清0,把动画进程置1
MOV TL1,#06H ;T1中断时间:250ns
MOV TH1,#06H
MOV SP,#10H ;10H-24H共20个单元作为堆栈
MOV IE,#138 ;开中断总开关、允许EX0、T0,T1中断
MOV TMOD,#33 ;设T0为16位定时器,软启动,T1为自动重装8位计数器
MOV IP,#195 ;设定T0,EX0为高级中断,T1为低级中断(设定后遥控不受T1工作干扰)
CALL START_VFD ;设置PT6311显示段数 (13位15段)
CALL BRIGHT ;设置PT6311亮度子程序14/16
SETB IT0 ;外部中断0为边沿触发方式
SETB TR1 ;T1是显示中断入口
;------------------------------主循环-------------------------------------------
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
RUN_STA : JNB P2.0,$
MOV A,TIME1
CJNE A, #1,RUN2
JMP GIF_1 ;
DISP_B: INC TIME1
JMP RUN_END
;xxxxxxxxxxxxxxXXXXXXXXXXXXXXXXXXXXX
RUN2: MOV A,TIME1
CJNE A,#3,RUN3
JB STA_DATA,RUN2_01 ;
MOV A,GIF_SIGN
CJNE A,#1,RUN2_3 ;
JMP RUN2_4
RUN2_3: CALL STA ;调用开机自走子程序
RUN2_4: JMP RUN2_1
RUN2_01: JMP KEY_GO ;
RUN2_02: JMP KEY_REST ;
RUN2_1: INC TIME1
JMP RUN_END
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RUN3: MOV A,TIME1
CJNE A,#5,RUN4
JMP AUTO ;调用无信号自动频谱设定子程序(改变AUTO_SIGN值)
RUN3_1: JMP AD_INTO ;调用AD模拟值运算
RUN3_2: INC TIME1
JMP RUN_END
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RUN4: MOV A,TIME1
CJNE A,#7,RUN5
CLR TR1
JMP WR_VFD ;写入PT6311数据
RUN4_1: SETB TR1
INC TIME1
JMP RUN_END
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RUN5: MOV A,TIME1
CJNE A,#21,RUN_END
JMP RD_KEY ;读如按键值并把他分析结果存放到KEY_NUM中
RUN5_1: MOV TIME1,#0
;xxxxxxxxxxxxxx
RUN_END: JMP RUN_STA
;;;;;;;;;;;;;;;;;;;开机自走程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
STA: INC DELAY_DATA ;借用DELAY_DATA
MOV A,DELAY_DATA
CJNE A,#45,SAT_RET
MOV DELAY_DATA,#0
CALL RM1 ;每调用一次音量+1
CALL DATA_IN ;初始化结束,调用一次芯片输入程序
MOV A,MAIN_DATA
CJNE A,#20,SAT_RET
MOV SYS_SIGN,#17 ;自跑字幕结束后显示INPUT选项
SETB EX0 ;音量提升完后才开启EX0遥控接口
SETB STA_DATA ;开始程序结束,STA_DATA置1
SETB AUTO_SIGN
SAT_RET: RET
;;;;;;;;;;;;;;;;;;无信号自动频谱设定子程序;;;;;;;;;;;;;;;;;;;;;;;;;;
AUTO: JNB STA_DATA,AUTO_RET ;开机状态下无需改变AUTO_SIGN值,直接退出
MOV A,AD_DATA1
JZ AUTO1 ;检测到没信号转无信号处理
SETB AUTO_SIGN ;只要一检测到AD_CYCA有信号,马上把AUTO_SIGN=1,使自走程序停止
MOV AUTO_NUM,#0 ;AD转换值连续=0的计数器
MOV DP_MODE,DP_SAVE ;恢复自走前设定的频谱模式
MOV AD_TIME2,#0
MOV AUTO_NUM,#0
JMP AUTO_RET ;检测到有信号则跳过自动频谱处理
;---------------------------------
AUTO1: JNB AUTO_SIGN,AUTO2 ;产生自跑信号自跑程序(令AUTO_SIGN=0)
INC AD_TIME2
MOV A,AD_TIME2
CJNE A,#20,AUTO_RET
MOV AD_TIME2,#0
INC AUTO_NUM ;AUTO_NUM产生自动电平的时间值
MOV A,AUTO_NUM
CJNE A,#100,AUTO_RET
MOV AUTO_NUM,#0
CLR AUTO_SIGN ;检测到200次AD_DATA为0,即100次无信号,SIGN置0
MOV DP_MODE,#0
MOV DP_NUM,#0
JMP AUTO_RET
;----------------------------------- ;自动频谱处理
AUTO2 : INC AD_TIME2 ;AD自动电平上升进程
MOV A,AD_TIME2
CJNE A,#80,AUTO_RET
MOV AD_TIME2,#0
INC DP_NUM
MOV A,DP_NUM
CJNE A,#13,AUTO_RET ;自动电平上升极限是不是14格(0也算1格)
MOV DP_NUM,#0
BB0: MOV A,DP_MODE ;每隔14个步长自动转换一次频谱
CJNE A,#0,BB1
MOV DP_MODE,#1
JMP AUTO_RET
BB1: CJNE A,#1,BB2
MOV DP_MODE,#2
JMP AUTO_RET
BB2: CJNE A,#2,BB3
MOV DP_MODE,#3
JMP AUTO_RET
BB3: MOV DP_MODE,#0
AUTO_RET: JMP RUN3_1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AD模拟值运算;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AD_INTO: INC AD_TIME
MOV A,AD_TIME
CJNE A,#10,IN02 ;------------------------------------------模拟比较1
MOV A,AD_SIM1
CJNE A,AD_DATA1,INTO_01
JMP IN02 ;如果前后电平没变化,则AD_SIM1保持不变
INTO_01: SUBB A,AD_DATA1
JNC AD_SUB ;AD_SIM1大于当前AD_DATA值,转AD_SUB减处理
AD_UP: MOV A,AD_SIM1 ;AD_SIM1小于当前AD_DATA值,转AD_CYC减处理
INC A
MOV AD_SIM1,A
JMP IN02
AD_SUB: MOV A,AD_SIM1
DEC A
MOV AD_SIM1,A
JMP INTO_RET
IN02: MOV A,AD_TIME ;------------------------------------------模拟比较2
CJNE A,#20,IN03
MOV A,AD_SIM2
CJNE A,AD_DATA1,INTO_02
JMP IN03 ;如果前后电平没变化,则AD_SIM2保持不变
INTO_02: SUBB A,AD_DATA1
JNC AD_SUB2 ;AD_SIM2大于当前AD_DATA2值,转AD_SUB减处理
AD_UP2: MOV A,AD_SIM2 ;AD_SIM2小于当前AD_DATA2值,转AD_CYC减处理
INC A
MOV AD_SIM2,A
JMP IN03
AD_SUB2: MOV A,AD_SIM2
DEC A
MOV AD_SIM2,A
JMP INTO_RET
IN03: MOV A,AD_TIME ;;------------------------------------------模拟比较3
CJNE A,#30,IN04
MOV A,AD_SIM3
CJNE A,AD_DATA1,INTO_03
JMP IN04 ;如果前后电平没变化,则AD_SIM2保持不变
INTO_03: SUBB A,AD_DATA1
JNC AD_SUB3 ;AD_SIM2大于当前AD_DATA2值,转AD_SUB减处理
AD_UP3: MOV A,AD_SIM3 ;AD_SIM2小于当前AD_DATA2值,转AD_CYC减处理
INC A
MOV AD_SIM3,A
JMP IN04
AD_SUB3: MOV A,AD_SIM3
DEC A
MOV AD_SIM3,A
JMP INTO_RET
IN04: MOV A,AD_TIME ;------------------------------------------模拟比较4
CJNE A,#40,INTO_RET
MOV AD_TIME,#0
MOV A,AD_SIM4
CJNE A,AD_DATA1,INTO_04
JMP INTO_RET ;如果前后电平没变化,则AD_SIM2保持不变
INTO_04: SUBB A,AD_DATA1
JNC AD_SUB4 ;AD_SIM2大于当前AD_DATA2值,转AD_SUB减处理
AD_UP4: MOV A,AD_SIM4 ;AD_SIM2小于当前AD_DATA2值,转AD_CYC减处理
INC A
MOV AD_SIM4,A
JMP INTO_RET
AD_SUB4: MOV A,AD_SIM4
DEC A
MOV AD_SIM4,A
INTO_RET: JMP RUN3_2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示数据的处理;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
GIF_1: JNB POWER,GIF_V1
JMP GIF_V2
GIF_V1: CALL CLR_ALL ;查看是否有关机标记,有则把显示缓冲区清0
JMP RET1
GIF_V2: MOV 3AH,#0CH ;G13的数据数据输入(点亮装析图标)
MOV 3BH,#111111B
JNB STA_DATA,GIF_V9 ;开机初始化时候不显示频谱
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;频谱输入;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R0,#22H ;显示频谱时先把旧显示数据清空
MOV R1,#8
GIF_V3: MOV @R0,#0
INC R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -