list p=16f877
include <p16f877.inc>
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF
c1 equ 0x21; Timer counter
c2 equ 0x22;
ANTI equ 0x23;
CLCK equ 0x24;
org 0x00;
goto start; // skip over interrupt vector
org 0x04;
goto serviceinterrupts;
start
call clearall;
call initport;
call inittimer;
call ini_adc;
bsf INTCON, GIE;
bsf INTCON, T0IE;
Get_Input
call ADC;
call stay_stuck;
goto Get_Input;
ADC
bsf ADCON0, 0; ADON: A/D On bit. 1 = 0n, 0 = OFF
bsf ADCON0, 2; GO/DONE: A/D Conversion Status bit. 1 = conversion in progress, 0 = conversion not in progress
; CHS2:CHS0: Analog Channel Select bits [111 = Channel 7 (AN7)]
bsf ADCON0, 3; CHS0 = 1
bsf ADCON0, 4; CHS1 = 1
; bsf ADCON0, 5; CHS2 = 1
polling
btfsc ADCON0,2; Checking for A/D Conversion Status bit. If ADCON0 = 1, loop continues. If ADCON0 = 0, skips "goto polling"
goto polling;
movf ADRESH,0;
movwf c2;
return;
clearall
clrf c1;
clrf c2;
clrf ANTI;
clrf CLCK;
return;
initport
bsf STATUS, RP0;
movlw b'00000000'; Make all pins of port B as output
movwf TRISB;
bcf STATUS, RP0;
return;
inittimer
clrf TMR0;
bsf STATUS, RP0;
movlw b'00000011';
movwf OPTION_REG;
bcf STATUS, RP0;
return;
ini_adc;
bsf STATUS,RP0;
movlw 0x00;
movwf ADCON1;
bcf STATUS,RP0;
return;
serviceinterrupts
bcf INTCON, T0IF;
movlw .5;
movwf TMR0;
incf c1,1;
retfie;
rotate_antclck
;dcba
movlw b'00000010'; b'00000001';
movwf PORTB;
; call delay;
movlw b'00000001'; b'00000010'
movwf PORTB
; call delay;
movlw b'00001000'; b'00000100'
movwf PORTB
; call delay;
movlw b'00000100'; b'00001000'
movwf PORTB
; call delay;
movlw b'00000010'; b'00001000'
movwf PORTB
; call delay;
movlw .1;
movwf ANTI;
movlw .0;
movwf CLCK;
call Get_Input;
return;
rotate_clck
;dcba
movlw b'00000100'; b'00001000'
movwf PORTB
; call delay;
movlw b'00001000'; b'00000100'
movwf PORTB
; call delay;
movlw b'00000001'; b'00000010'
movwf PORTB
; call delay;
movlw b'00000010'; b'00000001';
movwf PORTB;
; call delay;
movlw b'00000100'; b'00001000'
movwf PORTB
; call delay;
movlw .0;
movwf ANTI;
movlw .1;
movwf CLCK;
call Get_Input;
return;
stay_stuck
call delay;
call Checking_for_IR;
goto stay_stuck;
Checking_for_IR
movlw c2;
sublw .5; //Giving the ON value, if both are same
btfss STATUS, C; BTFSS f,b ...testing for IR.If bit ‘b’ in register ‘f’ is ‘0’, the next
;instruction is executed.If bit ‘b’ is ‘1’, then the next instruction
;is discarded and a NOP is executed instead.
call IR_1; if IR = 1, then C = 0, this line is executed.
call IR_0; if IR = 0, then C = 1, this line is executed.
return;
IR_1
movlw ANTI;
xorlw .0;
btfss STATUS, Z;
call rotate_antclck; As IR = 1, if Z = 0, this line is executed.
call delay; As IR = 1, if Z = 1, this line is executed.
return;
IR_0
movlw CLCK;
xorlw .0;
btfss STATUS, Z; if CLCK = 0, then Z = 0
;if CLCK = 1, then Z = 1
;BTFSS f,b ...testing for IR.If bit ‘b’ in register ‘f’ is ‘0’, the next
;instruction is executed.If bit ‘b’ is ‘1’, then the next instruction
;is discarded and a NOP is executed instead.
call rotate_clck; As IR = 0, if Z = 0, this line is executed.
call delay; As IR = 0, if Z = 1, this line is executed.
return;
delay ;delay after light off is 2-times(repeat1+repeat2)
clrf c1;
repeat ;delay 1sec
movf c1,0;
xorlw .250;
btfss STATUS,Z;
goto repeat;
return;
end