#include <16F887.h>
#USE DELAY(clock=400000000)
#FUSES INTRC,NOWDT,NOPUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,NOIESO,NOFCMEN,NOLVP
#byte porta=0x07
#byte portb=0x06
#byte portd=0x08
void main()
{
int val,timing;
set_tris_a(0xff); //porta all input
set_tris_b(0xff); //portb all input
set_tris_d(0x00); //portd all output
setup_adc_ports(0xE); //porta,0 analog
setup_adc(adc_clock_div_8); //클럭을 8분주 해서 사용
set_adc_channel(0); //()번 채널 선택
val=1;
portd=0;
goto sequential;
sequential: //LED 순차진행
for(;;){
delay_us(timing);delay_us(timing);delay_us(timing);delay_us(timing);
portd=val;
val=val*2;
if(val==0b100000000){
val=1;
}
if(bit_test(portb,0)==0){
goto reverse;
}
timing=2*read_adc();
}
reverse: //LED 역진행
for(;;){
delay_us(timing);delay_us(timing);delay_us(timing);delay_us(timing);
if(val==0b00000001){
val=0b10000000;
}
portd=val;
val=val/2;
if(val==1){
val=0b10000000;
}
if(bit_test(portb,0)==0){
goto sequential;
}
timing=2*read_adc();
}
}
//스위치를 누르고 있으면 sequential과 reverse가 왔다 갔다 하는 현상
//원래는 스위치를 누르고 있어도 led는 한 번 눌린 후의 방향으로 진행해야함