 
- UID
- 872238
|

遥控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 |
|