;----------------功---------能--------------------------------------
;功放前級三路音源選擇,P2.0~2.2為控制輸出高電平
;主音量/低音/高音/話筒音量,四組控制,P3.4~3.7為控制輸出高電平及指示
;P0口為主音量/低音/高音/話筒音量控制的級數(shù)顯示
;P1.0~P1.5的輸出為主音量/低音/高音/話筒音量63級控制,由電阻組成的D/A轉(zhuǎn)換
;P1.6,P1.7分別為顯示管的控制位
;P3.2接遙控接收頭
;P3.3為靜音指示
;P2.3為3D控制輸出高電平及指示
;P2.4為等響度控制輸出高電平及指示
;P2.5為電源控制輸出及指示
;P2.6為外接按制加
;P2.7為外接按制減
;P3.0為外接按制選擇主音量/低音/高音/話筒音量
;P3.1為外接按制選擇音源
;---------------------------------------------------------------------
Counter EQU 59H ;計數(shù)器,顯示程序通過它得知現(xiàn)正顯示哪個數(shù)碼管
FIRST EQU P1.7 ;第一位數(shù)碼管的位控制
SECOND EQU P1.6 ;第二位數(shù)碼管的位控制
DISPBUFF EQU 5AH ;顯示緩沖區(qū)為5AH和5BH
IN_SET EQU 21H ;輸入選擇緩沖
MUTE EQU 22H ;靜音選擇緩沖
POWER EQU 23H ;電源開關(guān)選擇緩沖
VOL EQU 24H ;主音量選擇緩沖
BASS EQU 25H ;低音選擇緩沖
TRS EQU 26H ;高音選擇緩沖
MIC EQU 27H ;話筒音量選擇緩沖
LUO EQU 28H ;等響度選擇緩沖
D3D EQU 29H ;3D選擇緩沖
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中斷INT0入口地址
AJMP INT ;轉(zhuǎn)中斷服務(wù)子程序
ORG 001BH ;定時器T1的入口
AJMP DISP ;顯示程序
ORG 30H
MAIN: ;初始化
MOV P3,#00001111B
MOV P2,#11100100B ;
MOV P0,#0FFH ;
MOV MUTE,#0 ;
MOV POWER,#0 ;
MOV R4,#0 ;
MOV VOL,#10 ;預(yù)設(shè)音量等級為10
MOV BASS,#30 ;預(yù)設(shè)低音等級為30
MOV TRS,#35 ;預(yù)設(shè)高音等級為35
MOV mic,#0 ;預(yù)設(shè)話筒音量等級為0
MOV LUO,#0 ;
MOV D3D,#0 ;
MOV IN_SET,#0 ;
MOV SP,#5FH ;設(shè)置堆棧
MOV TMOD,#00010000B ;定時器T1工作于模式1(16位定時/計數(shù)模式)
MOV TH1,#HIGH(65536-20000)
MOV TL1,#LOW(65536-20000)
SETB TR1 ;定時器T1開始運行
SETB EA ;打開CPU總中斷請求
SETB ET1 ;定時器T1允許
SETB IT0 ;設(shè)定INT0的觸發(fā)方式為脈沖負邊沿觸發(fā)
SETB EX0 ;打開INT0中斷請求
MOV Counter,#0 ;計數(shù)器初始化
CLR P3.5 ;開機初始為音量狀態(tài)
CLR P3.4 ;
CLR P3.6 ;
SETB P3.7 ;
MOV P1,VOL ;
MOV R7,VOL ;
MOV A,R7 ;將R7中的十六進制數(shù)轉(zhuǎn)換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB ;
MOV DISPBUFF+1,A ;十位在a
MOV DISPBUFF,B ;個位在b
DSP:
MOV R2,#9 ;將遙控器鍵值轉(zhuǎn)化成0~9
MOV DPTR,#TAB1 ;調(diào)用遙控鍵值表
VV: ;
MOV A,R2 ;
MOVC A,@A+DPTR ;
XRL A,1CH ;
JZ ABC ;
DJNZ R2,VV ;
ABC: ;
MOV A,R2 ;
AJMP DSP
INT: ;
CLR EX0 ;暫時關(guān)閉INT0中斷請求
MOV R6,#10
SB: ;
ACALL YS1 ;調(diào)用882微秒延時子程序
JB P3.2,EXIT ;延時882微秒后判斷P3.2腳是否出現(xiàn)高電平如果有就退出解碼程序
DJNZ R6, SB ;重復(fù)10次,目的是檢測在8820微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
JNB P3.2, $ ;等待高電平避開9毫秒低電平引導(dǎo)脈沖
ACALL YS2 ;延時4.74毫秒判斷是否連發(fā)
JB P3.2,EXIT ;
MOV R1,#1AH ;設(shè)定1AH為起始RAM區(qū)
MOV R2,#4 ;接收從1AH到1DH的4個內(nèi)存,用于存放操作碼和操作反碼
PP: ;
MOV R3,#8 ;每組數(shù)據(jù)為8位
JJJJ: ;
JNB P3.2,$ ;等待地址碼第一位的高電平信號
LCALL YS1 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態(tài)
MOV C,P3.2 ;將P3.2引腳此時的電平狀態(tài)0或1存入C中
JNC UUU ;如果為0就跳轉(zhuǎn)到UUU
JB P3.2,$ ;檢測到高電平1的話延時882微秒等待脈沖高電平結(jié)束
UUU: ;
MOV A,@R1 ;將R1中地址的給A
RRC A ;將C中的值0或1移入A中的最低位
MOV @R1,A ;將A中的數(shù)暫時存放在R1數(shù)值的內(nèi)存中
DJNZ R3,JJJJ ;接收滿8位換一個內(nèi)存
INC R1 ;對R1中的值加1,換下一個RAM
DJNZ R2,PP ;接收完8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH/1CH/1DH中
MOV A,1CH ;A的數(shù)就是解碼數(shù)
MOV A,1AH ;進行代碼識別
XRL A,#0 ;判斷1AH的值是否等于00000000
JNZ EXI ;如果不同則無效將1CH清零
MOV A,1BH ;比較低8位地址
XRL A,#11110111B ;再判斷高8位地址是否正確
JNZ EXI ;如果不相等說明解碼失敗退出解碼程序
MOV A,1CH ;比較數(shù)據(jù)碼和數(shù)據(jù)反碼是否正確?
CPL A ;
XRL A,1DH ;將1CH的值取反后和1DH比較 不同則無效丟棄核對數(shù)據(jù)是否準確
JNZ EXI ;如果不同則無效將1CH清零
AJMP BIJIAO ;如果相等說明解碼正確
AJMP EXIT ;如果不相等說明解碼失敗退出解碼程序
EXI: ;
MOV 1CH,#0 ;
EXIT: ;
JB P2.6,QQ1 ;手動主計數(shù)加
LCALL YS3 ;
MOV A,#03 ;
LCALL YS3 ;
AJMP KD ;
QQ1:
JB P2.7,QQ2 ;手動主計數(shù)減
LCALL YS3 ;
MOV A,#02 ;
LCALL YS3 ;
AJMP KD ;
QQ2: ;
JNB P3.0,QQ3 ;手動選擇控制:主音量/低音/高音/話筒音量
JNB P3.1,QQ4 ;手動選擇音源:1/2/3
SETB EX0 ;中斷
SETB P3.2 ;
RETI
QQ3: ;
MOV A,#27 ;
LCALL YS4 ;
LCALL YS4 ;
AJMP TT2 ;選擇控制:主音量/低音/高音/話筒音量
SETB EX0 ;允許中斷
SETB P3.2 ;
RETI
QQ4: ;
LCALL YS4 ;
LCALL YS4 ;
AJMP IN_KEY ;選擇音源1/2/3
SETB EX0 ;允許中斷
SETB P3.2 ;
RETI
BIJIAO:
MOV A,1CH ;按鍵數(shù)值判斷執(zhí)行
;------------------------------------------------------------
;以下為加主音量/低音/高音/話筒級數(shù)
;------------------------------------------------------------
KD:
CJNE A,#03,TT0 ;遙控鍵值等3時,執(zhí)行主計數(shù)器加
cjne r4,#0,dd1 ;如果R4的值等0,主計數(shù)器為主音量控制
MOV R7,VOL ;
CJNE R7,#63,VOL_UP ;預(yù)設(shè)音量控制為64級(0-63)
AJMP EXIT
TT0: ;跳轉(zhuǎn)超范圍,不得不加
AJMP TT1 ;轉(zhuǎn)到主計數(shù)器減
VOL_UP:
INC VOL ;主音量加1
MOV P1,VOL ;把主音量的數(shù)送到P1口進行D/A轉(zhuǎn)換
MOV R7,VOL ;顯示當前的調(diào)節(jié)級數(shù)
MOV A,R7 ;將R7中的十六進制數(shù)轉(zhuǎn)換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB ;
MOV DISPBUFF+1,A ;十位在a
MOV DISPBUFF,B ;個位在b
AJMP EXIT
dd1:
cjne r4,#1,dd2 ;如果R4的值等1,主計數(shù)器為低音控制
MOV R7,BASS ;
CJNE R7,#63,BASS_UP ;預(yù)設(shè)低音控制為64級(0-63)
AJMP EXIT
BASS_UP:
INC BASS ;低音加1
MOV P1,BASS ;把低音控制的數(shù)送到P1口進行D/A轉(zhuǎn)換
MOV R7,BASS ;
MOV A,R7 ;將R7中的十六進制數(shù)轉(zhuǎn)換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB ;
MOV DISPBUFF+1,A ;十位在a
MOV DISPBUFF,B ;個位在b
AJMP EXIT
dd2:
cjne r4,#2,dd3 ;如果R4的值等2,主計數(shù)器為高音控制
MOV R7,TRS ;
CJNE R7,#63,TRS_UP ;預(yù)設(shè)高音控制為64級(0-63)
AJMP EXIT
TRS_UP:
INC TRS ;高音加1
MOV P1,TRS ;把高音控制的數(shù)送到P1口進行D/A轉(zhuǎn)換
MOV R7,TRS ;
MOV A,R7 ;將R7中的十六進制數(shù)轉(zhuǎn)換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB ;
MOV DISPBUFF+1,A ;十位在a
MOV DISPBUFF,B ;個位在b
AJMP EXIT
dd3:
cjne r4,#3,dd4 ;如果R4的值等3,主計數(shù)器為話筒音量控制
MOV R7,MIC;
CJNE R7,#63,MIC_UP ;預(yù)設(shè)話筒音量控制為64級(0-63)
AJMP EXIT
MIC_UP:
INC MIC ;話筒音量加1
MOV P1,MIC ;把話筒音量控制的數(shù)送到P1口進行D/A轉(zhuǎn)換
MOV R7,MIC ;
MOV A,R7 ;將R7中的十六進制數(shù)轉(zhuǎn)換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB ;
MOV DISPBUFF+1,A ;十位在a
MOV DISPBUFF,B ;個位在b
AJMP EXIT
dd4:
MOV R4,#0 ;只有4組,R4清0,返回主音量控制
MOV P1,VOL
MOV R7,VOL ;
MOV A,R7 ;將R7中的十六進制數(shù)轉(zhuǎn)換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB ;
MOV DISPBUFF+1,A ;十位在a
MOV DISPBUFF,B ;個位在b
AJMP EXIT
;----------------------------------------------------------------
;以上為加主音量/低音/高音/話筒級數(shù)
參考鏈接:http://www.picavr.com/news/2008-07/7165.htm





