#include <avr/io.h>
#include <util/delay.h>
#include<avr/interrupt.h>//中斷函式
//定義8*8控制腳位
#define datapin1 PB5
#define clkpin PB4
#define latchpin PB3
//定義LED燈的顯示變數
uint8_t count = 1;
//定義中斷變數
bool go = true;
//定義避免重複觸發變數
unsigned long n, pre = 0;
//定義readADC變數
int X, Y;
//定義方向變數
int dir = 0;//定義方向變數
int c_dir = 0;//定義避免重複觸發變數
//定義顯示LED的函數
void putdata(uint8_t);
void setup() {
DDRB |= (1<<PB5)|(1<<PB3)|(1<<PB4);
DDRD &= ~(1<<PD2);
PORTD |= (1<<PD2);
EIMSK = 0;
EICRA = 0;
EIMSK |= (1 << INT0);
EICRA |= (1 << ISC01);//下緣觸發
ADCSRA |= (1 << ADEN);
ADCSRA |= (1 << ADPS2)|(1<< ADPS1)|(1 << ADPS0);
ADMUX |= (1 << REFS0);
sei();
Serial.begin(9600);
}
void loop() {
X = readADC(0);
Y = readADC(1);
//顯示資料
putdata(count);
//判斷方向
if(X<300 )
{
dir = 0;//向右
}
else if(X>700)
{
dir = 1; //向左
}
//SHIFT
if(go)
{
if(dir==0){
if(count == 0b00000001 ){
count = count << 7;
dir = 0;
}
else
count = count >> 1;
}
else
{
if(count == 0b10000000){
count = count >> 7;
dir = 1;
}
else
count = count << 1;
}
}
Serial.print("X :");
Serial.print(X);
Serial.print(" Y :");
Serial.print(Y);
Serial.print(" GO :");
Serial.println(go);
_delay_ms(200);
}
//中斷函式
ISR(INT0_vect){
n=millis();
if(n-pre<200)
{
pre=n;
return;
}
else
{
go=!go;
pre=n;
}
}
//顯示資料在LED燈上
void putdata(uint8_t c){
uint8_t save = c;
for(int j=0; j<8;j++){
if(save & 0b00000001){
PORTB |= (1 << datapin1);
Serial.print(1);
}
else{
PORTB &= ~(1 << datapin1);
Serial.print(0);
}
PORTB &= ~(1 << clkpin);
PORTB |= (1 << clkpin);
save = (save >> 1);
}
PORTB &= ~(1 << latchpin);
PORTB |= (1 << latchpin);
}
//readADC函式
int readADC(uint8_t ch)
{
unsigned char low;
ADMUX &= 0b11110000;
ADMUX |= ch;
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC));
low=ADCL;
return (ADCH << 8) | low;
}