- DQ EQU P3.3 ;P3.3定義接口,參考STC89C51數據手冊
- EX2 EQU P3.2 ;外部中斷0,參考STC89C51數據手冊
- SEG1 EQU 0ffech ;數碼管1(最右)
- SEG2 EQU 0ffedh ;數碼管2
- SEG3 EQU 0ffeeh ;數碼管3
- SEG4 EQU 0ffefh ;數碼管4(最左)
- BYT_DLY EQU 5FH ;延時函數參數變量
- DA_BUF EQU 40H ;解碼出的數據緩沖區,包括41H
- ORG 0000h
- LJMP MAIN
- ORG 003H ;外部中斷0入口地址,參考STC89C51數據手冊
- LJMP EINT3
- ORG 40H
- MAIN: MOV SP,#60H
- SETB EA
- SETB EX0
- SJMP $; ;原地踏步,等中斷解碼
- ;//中斷接收解碼模塊
- EINT3: CLR EA;//關閉
- MOV R6,#10
- SB: MOV BYT_DLY,#13 ;834uS
- LCALL DELAY ;調用834微秒延時子程序
- JB DQ,EXIT ;延時834微秒后判斷DQ腳是否出現高電平如果有就退出解碼程序
- DJNZ R6, SB ;重復 10 次,目的是檢測在 9000 微秒內如果出現高電平就退出解碼程序
- ;-------------------------------;以上完成對遙控信號 起始碼 的 9000 微秒的初始低電平信號的識別!!!!!
- JNB DQ, $; ;等待,避開 起始碼 低電平
- JB DQ,$; ;避開結果碼
- ;/*;測試按鍵一次有多少位低電平,不同遙控器不一樣*/
- ;/*;電工電子中心投影遙控器只有32位,這對后邊程序參數設置關系重大
- ; CLR A
- ;ADDLOOP: JNB DQ,$
- ; ADD A,#1
- ; MOV P1,A
- ; JB DQ,cADD
- ; sjmp $
- ;*/
- MOV R7,#16 ;忽略前16位系統識別碼 (即地址碼)
- AAQQ: JNB DQ,$; ;通過低電平段
- ;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代碼可以用本行替換,但這樣容易出現死機。
- MOV R6,#255
- CTN2: JNB DQ,DER7 ;等待有效低電平到來,避開 結果碼 高電平
- MOV BYT_DLY,#3 ;42uS
- ACALL DELAY ;調用42微秒延時子程序,延時太短,計數器R6不夠大,延時太長,會錯過最佳檢測點
- DJNZ R6,CTN2
- LJMP EXIT ;防止死機
- DER7: DJNZ R7,AAQQ
- MOV R1,#DA_BUF ;設定1AH為起始RAM區
- MOV R2,#2 ;接收從DA_BUF到DA_BUF+1的2個內存,用于存放操作碼 (即數據碼) 和操作反碼
- PP: MOV R3,#8 ;每組數據為8位
- JJJJ: JNB DQ,[ DISCUZ_CODE_0 ]nbsp; ;等待通過數據碼的低電平信號,等高電平到來后出去;
- MOV BYT_DLY,#13 ;834uS
- ACALL DELAY ;高電平開始后用840(560<t<1125,)微秒的時間尺去判斷信號此時的高低電平狀態
- MOV C,DQ ;將DQ引腳此時的電平狀態0或1存入C中
- JNC UUU ;如果為0就跳轉到UUU
- ;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代碼可以用本行替換,但這樣容易出現死機。
- MOV R6,#255
- CTN3: JNB DQ,UUU ;等待有效低電平到來,避開 結果碼 高電平
- MOV BYT_DLY,#3 ;42uS
- ACALL DELAY ;調用840微秒延時子程序
- DJNZ R6,CTN3
- LJMP EXIT ;防止死機
- 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中
- MOV A,DA_BUF
- CPL A ;對1AH取反后和1BH比較
- CJNE A,DA_BUF+1,EXIT ;如果不等表示接收數據發生錯誤,放棄
- MOV R7,DA_BUF ;將按鍵的鍵值通過數碼管顯示出來!
- ACALL DISP
- ; CLR P1.0 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
- ; MOV BYT_DLY,#50
- ; ACALL DELAY
- ; SETB P1.0 ;蜂鳴器停止
- EXIT: SETB EA
- RETI
- ;-------------------------延時子程序---------------------------------
- ;晶振22.1184M
- DELAY: ;誤差 0us
- MOV R6,#03H
- DL0:
- MOV R5,#89H
- DJNZ R5,$
- DJNZ R6,DL0
- RET
- ;//數碼管顯示,數據由R7傳入
- DISP: MOV DPTR #LEDMAP
- MOV A,R7
- ANL A,#0FH
- MOVC A,@A+DPTR
- MOV DPTR,#SEG1
- CPL A
- MOVX @DPTR,A
- MOV DPTR,#LEDMAP
- mov a,r7
- swap a
- anl a,#0fh
- movc a,@a+dptr
- mov dptr,#SEG2
- cpl a
- movx @dptr,a
- mov dptr,#SEG3
- mov a,#0ffh
- movx @dptr,a
- mov dptr,#SEG4
- movx @dptr,a
- ret
- ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,
- END
復制代碼
|