×
单片机 > 单片机程序设计 > 详情

pic16f876a红外接收及ERROR程序

发布时间:2020-05-16 发布时间:
|

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 




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容