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