;----------------功---------能--------------------------------------
;功放前級三路音源選擇,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 ;顯示緩沖區為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的觸發方式為脈沖負邊沿觸發
SETB EX0 ;打開INT0中斷請求
MOV Counter,#0 ;計數器初始化
CLR P3.5 ;開機初始為音量狀態
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毫秒判斷是否連發
JB P3.2,EXIT ;
MOV R1,#1AH ;設定1AH為起始RAM區
MOV R2,#4 ;接收從1AH到1DH的4個內存,用于存放操作碼和操作反碼
PP: ;
MOV R3,#8 ;每組數據為8位
JJJJ: ;
JNB P3.2,$ ;等待地址碼第一位的高電平信號
LCALL YS1 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P3.2 ;將P3.2引腳此時的電平狀態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 ;按鍵數值判斷執行
;------------------------------------------------------------
;以下為加主音量/低音/高音/話筒級數
;------------------------------------------------------------
KD:
CJNE A,#03,TT0 ;遙控鍵值等3時,執行主計數器加
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 ;顯示當前的調節級數
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
;----------------------------------------------------------------
;以上為加主音量/低音/高音/話筒級數
參考鏈接:http://www.picavr.com/news/2008-07/7165.htm





