?? 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 + -