;*************************************** ;遙控4按鍵模擬 15F104E ;內部振蕩11.0592M ;按1就P3.0低電平,按2就P3.1低電平 按3就P3.2低電平 按4就P3.3低電平 ;蜂嗚器提示, ;自學習功能,按住要學習的鍵2秒,;蜂嗚器長響,學習成功停止響 ;*************************** YHM EQU 2fh;用戶碼 SET0 EQU 30H; SET1 EQU 31H; SET2 EQU 32H; SET3 EQU 33H; ;;;;;;;;;;;;;;;;;;;;;;;;; IAP_DATA EQU 0C2H IAP_ADDRH EQU 0C3H IAP_ADDRL EQU 0C4H IAP_CMD EQU 0C5H IAP_TRIG EQU 0C6H IAP_CONTR EQU 0C7H ENABLE_IAP EQU 83H ;系統工作時鐘<12MHZ時 ;************************ IR_KEY BIT P3.5;紅外 beep bit p3.3 MA1 EQU 7BH ; MA2 EQU 7CH ; MA3 EQU 7DH MA4 EQU 7EH ; RED_32 EQU 7FH; ;************ ORG 0H ;程序開始 AJMP START ORG 30H ;************* ; 單片機初始化 START: mov p3,#0ffh MOV DPTR, #0 call EEPROMR mov 30h,a inc dptr call EEPROMR mov 31h,a inc dptr call EEPROMR mov 32h,a inc dptr call EEPROMR mov 33h,a MOV DPTR, #200h call EEPROMR mov 2fh,a ;******************************** MAIN: orl p3,#17h mov a,p3 anl a,#17h cjne a,#17h,d2 jmp d4 d2: call delay2S orl p3,#17h mov a,p3 anl a,#17h cjne a,#17h,d3 jmp d4 d3: cpl a anl a,#17h mov 20h,a clr beep d4: jb IR_KEY,MAIN ACALL IR mov a,20h jnz d4 AJMP MAIN ;返回 ;*************************** IR: PUSH ACC PUSH PSW LCALL DELAY1MS LCALL DELAY1MS LCALL DELAY1MS LCALL DELAY1MS JB IR_KEY,IR_OUT;;高電平退出 JNB IR_KEY,$;等 IR 變為高電平 LCALL DELAY2MS380US LCALL DELAY2MS380US JB IR_KEY,IR_OUT;是否低電平 MOV R0,#MA1;起始內存為7CH,共4個內存 JJJ:MOV R3,#8 ;8位 BBB:JNB IR_KEY,$;等 IR 變為高電平 ;高電平后開始計數,計數值1 高電平1 MOV R2,#0 ;1MS計數 CCC: LCALL DELAY1MS JNB IR_KEY,DDD ;低電平跳出計數 INC R2;;高電平繼續計數 CJNE R2,#3,CCC;防止計數超時 AJMP IR_OUT DDD: CLR A CLR C SUBB A,R2 ; MOV A,@R0 RRC A MOV @R0,A ;處理完一位 DJNZ R3,BBB;8位數據 INC R0;換下一個內存 CJNE R0,#RED_32,JJJ ;寫完個4內存 ;4個8位碼存入MA1~MA4中 ;------------------------------------- MOV A,MA4 CPL A CJNE A,MA3,IR_OUT jbc 0,s30 jbc 1,s31 jbc 2,s32 jbc 4,s33 MOV A,MA2; CJNE A,YHM,IR_OUT; CALL IR_GOTO IR_OUT: POP PSW POP ACC RET s30:mov set0,MA3 call bao0 call bao1 setb beep jmp IR_OUT s31:mov set1,MA3 call bao0 call bao1 setb beep jmp IR_OUT s32:mov set2,MA3 call bao0 call bao1 setb beep jmp IR_OUT s33:mov set3,MA3 call bao0 call bao1 setb beep jmp IR_OUT ;---------------- IR_GOTO:mov a,ma3 CJNE A,SET0,E11 clr beep clr p3.0 LCALL DELAY2MS380US LCALL DELAY2MS380US LCALL DELAY2MS380US setb p3.0 setb beep RET E11: CJNE A,SET1,E12 clr beep clr p3.1 LCALL DELAY2MS380US LCALL DELAY2MS380US LCALL DELAY2MS380US setb p3.1 setb beep ret E12: CJNE A,SET2,E13 clr beep clr p3.2 LCALL DELAY2MS380US LCALL DELAY2MS380US LCALL DELAY2MS380US setb p3.2 setb beep RET E13: CJNE A,SET3,E14 clr beep clr p3.4 LCALL DELAY2MS380US LCALL DELAY2MS380US LCALL DELAY2MS380US setb p3.4 setb beep RET E14:; RET ;--------延時------ DELAY2MS380US: ;1T 11.0592M MOV R6,#0DFH DL0: MOV R5,#1CH DJNZ R5,$ DJNZ R6,DL0 RET DELAY1MS: ;1T 11.0592M MOV R6,#12H DL05: MOV R5,#98H DJNZ R5,$ DJNZ R6,DL05 NOP RET DELAY255MS: ; MOV R7,#255 DL045: call DELAY1MS DJNZ R7,DL045 NOP RET DELAY2S: ; MOV R4,#7 DL1s: call DELAY255MS DJNZ R4,DL1s RET ;************************ ERASE:;擦除 MOV IAP_CONTR,#83h;允許IAP/IAP操作 MOV IAP_CMD,#03H ;扇區擦除 MOV IAP_ADDRH,DPH ;送高地址 MOV IAP_ADDRL,DPL ;送低地址 ACALL IAPXX ;觸發 RET ;************************ EEPROMW:;寫 MOV IAP_CONTR,#83h;允許IAP/IAP操作 MOV IAP_CMD,#02H ;送寫命令 MOV IAP_ADDRH,DPH ;送高地址 MOV IAP_ADDRL,DPL ;送低地址 MOV IAP_DATA,A ;A是要寫入的數據 ACALL IAPXX ;觸發 RET ;************************ EEPROMR:;讀 MOV IAP_CONTR,#83h;允許IAP/IAP操作 MOV IAP_CMD,#01H ;送讀命令 MOV IAP_ADDRH,DPH ;送高地址 MOV IAP_ADDRL,DPL ;送低地址 ACALL IAPXX ;觸發 MOV A,IAP_DATA ;讀出的數據放到A RET ;---------- IAPXX:;觸發 MOV IAP_TRIG, #5AH MOV IAP_TRIG, #0A5H ; NOP NOP ret ;--------------------- IAP_Disable:;禁止IAP/IAP操作 MOV IAP_CONTR,#0 MOV IAP_CMD,#0 MOV IAP_TRIG,#0 MOV IAP_ADDRH,#0FFH MOV IAP_ADDRL,#0FFH RET bao0: MOV DPTR, #0;保存 call ERASE mov a,30h call EEPROMW inc dptr mov a,31h call EEPROMW inc dptr mov a,32h call EEPROMW inc dptr mov a,33h call EEPROMW call IAP_Disable ret bao1: MOV DPTR,#200h;保存 call ERASE MOV A,MA2 mov 2fh,a call EEPROMW call IAP_Disable ret END