pIC16f876a红外ERROR程序
include
status equ 03h
rp0 equ 05h
z equ 02h
c equ 00h
pcl equ 02h
porta equ 05h
trISA equ 85h
portc equ 07h
trisc equ 87h
portb equ 06h
trisb equ 86h
;--------tmr0--------------
tmr0 equ 01h ; 4Mt=256(256-tmr0b)=50ms
option_reg equ 81h
iNTCon equ 0bh
t0if equ 02h
wtemp equ 19h
;-----------------------
ADDR EQU 20H ;写入地址寄存器
NUM EQU 21H ;写入值
REC EQU 22H ;读计数
WRC EQU 24H ;写计数
rec1 EQU 25H
count EQU 26H
;-------------------------
count1 EQU 27H
count2 EQU 28H
flag equ 30h
flag1 equ 31h
flag2 equ 32h
flag3 equ 33h
;
flag4 equ 34h
;===============================
org 00h
nop
goto start
org 04h
;
;=========中断服务子服务=======
serv
MOVwf wtemp
bcf intcon,t0if
btfsc flag4,0
goto delay3ms7
;
btfss flag4,3
goto www
decfsz count1
goto www ;250uS未到继续计脉冲数goto www
MOVlw 0x03
MOVwf count1
bsf flag4,2
goto www
;
delay3ms7
btfss flag4,4
goto www
decfsz count2
goto www ;3.7mS未到继续计脉冲数goto www
bsf flag4,1
MOVlw 0x0f
MOVwf count2
;
www MOVlw 0x0e ;250us
MOVwf tmr0
MOVf wtemp,0
retfie
;==================================
start
nop
bsf status,rp0
clrf trisc
MOVlw b’00000000’
MOVwf trisa
MOVlw b’00000101’
MOVwf trisb
MOVlw b’00000000’ ;1:1
MOVwf option_reg
bcf status,rp0
clrf flag4
;-----------
MOVlw 00h ;写入EEPROM初始地址从0开始
MOVwf ADDR
MOVwf rec1
MOVlw 0 ;//初始写入值
MOVwf NUM
MOVlw 30h ;间接寻址,读出值初始存放地址
MOVwf FSR
MOVlw 0100h ;//写入次数
MOVwf WRC
;
;============ 复位时将EEPROM全清除掉 ==============
clrf count
CC bsf STATUS,RP1
bsf STATUS,RP0
btfsc EECON1,WR
goto $-1
bcf STATUS,RP0
bcf STATUS,RP1
MOVf count,0
bsf STATUS,RP1
MOVwf EEADR
bcf STATUS,RP1
MOVlw 0x00
bsf STATUS,RP1
MOVwf EEDATA
bsf STATUS,RP0
bcf EECON1,EEPGD
bsf EECON1,WREN
bcf INTCON,GIE
MOVlw 55h
MOVwf EECON2
MOVlw 0aah
MOVwf EECON2
bsf EECON1,WR
btfsc EECON1,WR
goto $-1
bsf INTCON,GIE
bcf EECON1,WREN
bcf STATUS,RP0
bcf STATUS,RP1
incf count,1
decfsz WRC
goto cc
;
MOVlw 8Fh ;//重新写入次数值
MOVwf WRC
MOVwf REC
;\\\\\\\\\\\\\
;
MOVlw 0x03
MOVwf count1 ;3*250us=750us
MOVlw 0x0f
MOVwf count2 ;15*250us=3.7ms
;
MOVlw 0xa0
MOVwf intcon
bcf intcon,t0if ;TMR0设置
MOVlw 0x0e
MOVwf tmr0
;
MOVlw 0x0f
MOVwf PORTC ;初始亮PORTC,判断程序运行是否正常
clrf flag
clrf flag1
clrf flag2
clrf flag3
;
clrf flag4 ;标志寄存器
;==============NUM===============
main
MOVlw 0x0f
MOVwf portc
MOVlw 0x0f
MOVwf count2
clrf flag4
btfsc portb,2
goto main
bsf flag4,0
bcf flag4,4
;
btfss portb,2 ;3.7ms内有高电平?
goto $-1 ;有
;
out MOVlw 0x0f
MOVwf count2
;------------------------------
;d7
bcf flag4,0 ;d0=1在3。7定时
bcf flag4,2 ;d2=1脉冲低电平在750US内,代表0
bcf flag4,3 ;750US不进行计时
btfss portb,2
goto $-1
dd7 bsf flag4,3 ;开始计时
btfss portb,2 ;测脉冲高电平宽度
goto ss7 ;脉冲高电平《750US
btfss flag4,2
goto dd7
bsf flag,7 ;》750US;FLAG,D7=1
goto out7
ss7 bcf flag,7
out7 MOVlw 0x03
MOVwf count1
;d6
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd6 bsf flag4,3
btfss portb,2
goto ss6
btfss flag4,2
goto dd6
bsf flag,6
goto out6
ss6 bcf flag,6
out6 MOVlw 0x03
MOVwf count1
;d5
bcf flag4,0
bcf flag4,2 ;d2=1脉冲低电平在750US内,代表0
bcf flag4,3 ;750US不进行计时
btfss portb,2
goto $-1
dd5 bsf flag4,3 ;开始计时
btfss portb,2 ;测脉冲高电平宽度
goto ss5 ;脉冲高电平《750US
btfss flag4,2
goto dd5
bsf flag,5 ;》750US;FLAG,D7=1
goto out5
ss5 bcf flag,5
out5 MOVlw 0x03
MOVwf count1
;d4
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd4 bsf flag4,3
btfss portb,2
goto ss4
btfss flag4,2
goto dd4
bsf flag,4
goto out4
ss4 bcf flag,4
out4 MOVlw 0x03
MOVwf count1
;d3
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd3 bsf flag4,3
btfss portb,2
goto ss3
btfss flag4,2
goto dd3
bsf flag,3
goto out3
ss3 bcf flag,3
out3 MOVlw 0x03
MOVwf count1
;d2
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd2 bsf flag4,3
btfss portb,2
goto ss2
btfss flag4,2
goto dd2
bsf flag,2
goto out2
ss2 bcf flag,2
out2 MOVlw 0x03
MOVwf count1
;d1
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd1 bsf flag4,3
btfss portb,2
goto ss1
btfss flag4,2
goto dd1
bsf flag,1
goto out1
ss1 bcf flag,1
out1 MOVlw 0x03
MOVwf count1
;d0
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd0 bsf flag4,3
btfss portb,2
goto ss0
btfss flag4,2
goto dd0
bsf flag,0
goto out6
ss0 bcf flag,0
out0 MOVlw 0x03
MOVwf count1
;------------------------
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
btfss portb,2
goto $-1
btfsc portb,2
goto $-1
;==========================
;d7a
bcf flag4,0 ;d0=1在3。7定时
bcf flag4,2 ;d2=1脉冲低电平在750US内,代表0
bcf flag4,3 ;750US不进行计时
btfss portb,2
goto $-1
dd7a bsf flag4,3 ;开始计时
btfss portb,2 ;测脉冲高电平宽度
goto ss7a ;脉冲高电平《750US
btfss flag4,2
goto dd7a
bsf flag1,7 ;》750US;FLAG,D7=1
goto out7a
ss7a bcf flag1,7
out7a MOVlw 0x03
MOVwf count1
;d6a
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd6a bsf flag4,3
btfss portb,2
goto ss6a
btfss flag4,2
goto dd6a
bsf flag1,6
goto out6a
ss6a bcf flag1,6
out6a MOVlw 0x03
MOVwf count1
;d5a
bcf flag4,0
bcf flag4,2 ;d2=1脉冲低电平在750US内,代表0
bcf flag4,3 ;750US不进行计时
btfss portb,2
goto $-1
dd5a bsf flag4,3 ;开始计时
btfss portb,2 ;测脉冲高电平宽度
goto ss5a ;脉冲高电平《750US
btfss flag4,2
goto dd5a
bsf flag1,5 ;》750US;FLAG,D7=1
goto out5a
ss5a bcf flag1,5
out5a MOVlw 0x03
MOVwf count1
;d4a
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd4a bsf flag4,3
btfss portb,2
goto ss4a
btfss flag4,2
goto dd4a
bsf flag1,4
goto out4a
ss4a bcf flag1,4
out4a MOVlw 0x03
MOVwf count1
;d3a
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd3a bsf flag4,3
btfss portb,2
goto ss3a
btfss flag4,2
goto dd3a
bsf flag1,3
goto out3a
ss3a bcf flag1,3
out3a MOVlw 0x03
MOVwf count1
;d2a
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd2a bsf flag4,3
btfss portb,2
goto ss2a
btfss flag4,2
goto dd2a
bsf flag1,2
goto out2a
ss2a bcf flag1,2
out2a MOVlw 0x03
MOVwf count1
;d1a
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd1a bsf flag4,3
btfss portb,2
goto ss1a
btfss flag4,2
goto dd1a
bsf flag1,1
goto out1a
ss1a bcf flag1,1
out1a MOVlw 0x03
MOVwf count1
;d0a
bcf flag4,0
bcf flag4,2
bcf flag4,3
btfss portb,2
goto $-1
dd0a bsf flag4,3
btfss portb,2
goto ss0a
btfss flag4,2
goto dd0a
bsf flag1,0
goto out6a
ss0a bcf flag1,0
out0a MOVlw 0x03
MOVwf count1
;---------------------------
MOVf flag,0
MOVwf NUM
call write
MOVf flag1,0
MOVwf NUM
call write
jjj btfss PORTB,0
goto back1
clrf flag4
MOVlw b’01010101’
MOVwf portc
goto jjj
;
back1 goto main
;=========== 写子程序 ============
write
clrf PORTC ;//////表示进入写状态
;
bsf STATUS,RP1
bsf STATUS,RP0 ;/bank4
btfsc EECON1,WR ;WR=0上一次写完成
goto $-1
bcf STATUS,RP0
bcf STATUS,RP1 ;/bank0
MOVf ADDR,W
bsf STATUS,RP1 ;/bank2
MOVwf EEADR ;ADDR-->EEADR
bcf STATUS,RP1 ;/bank0
MOVf NUM,W
bsf STATUS,RP1 ;/bank2
MOVwf EEDATA ;VALU-->EEDATA
bsf STATUS,RP0 ;/bank3
bcf EECON1,EEPGD ;选定EEPROM为访问对象
bsf EECON1,WREN ;开放写操作使能控制位
bcf INTCON,GIE ;
;
MOVlw 55h ;“5指令序列”
MOVwf EECON2
MOVlw 0aah
MOVwf EECON2
bsf EECON1,WR ;启动写操作
;
btfsc EECON1,WR
goto $-1 ;等待写操作成
bsf INTCON,GIE
bcf EECON1,WREN
bcf STATUS,RP0
bcf STATUS,RP1 ;bank0
incf ADDR,1
;
MOVlw 0x0f ;////
MOVwf PORTC
return
;================================
end
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』