#include<LedControl.h>
#include <TimerOne.h>
#include "pitch.h"
#define VERT_PIN A0
#define HORZ_PIN A1
#define SEL_PIN 2
#define device_num 3
#define module_num 3
#define Speaker_PIN 6
LedControl lc[module_num] = {
LedControl(12, 11, 10, device_num),
LedControl(12, 11, 9, device_num),
LedControl(12, 11, 8, device_num)
};//宣告 LedControl物件 1組3串 3組能控制9個
volatile int x = 1;//col初始位置
volatile int mis[22][2] = {};//飛彈儲存陣列
volatile int num = 0;//飛彈彈夾數量
bool move = false;
bool right = false;
bool left = false;
volatile uint8_t symbol[] = {
0b00000001,
0b00000011,
0b00000001,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
};//飛機朝上
volatile uint8_t tamp[] = {
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
};//暫存飛機圖形器
void setup() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
{
lc[i].shutdown(j, false); // 關閉省電模式
lc[i].setIntensity(j, 0); // 設定亮度為 0 (介於0~15之間)
lc[i].clearDisplay(j); // 清除螢幕
}
}
for (int i = 0; i < 22; i++) {
mis[i][0] = -1;
}
pinMode(VERT_PIN, INPUT);
pinMode(HORZ_PIN, INPUT);
pinMode(SEL_PIN, INPUT_PULLUP);//設置上拉電阻
Serial.begin(9600);
Serial.print(" ");
Timer1.initialize(50000);//0.05秒進入Timer1次
Timer1.attachInterrupt(missle);
triangle();
attachInterrupt(digitalPinToInterrupt(SEL_PIN), fire, FALLING);//外部中斷
}
void loop() {
}
void planemove() {
int vert = analogRead(VERT_PIN);
int horz = analogRead(HORZ_PIN);
/*Serial.print("x: ");
Serial.println(x);*/
if (horz > 700) {//定義向左
x++;
left = true;
if (x >= 23) {
x = 22;
left = false;
}
if (left == true) {
move = true;
tamp[1] = symbol[23];
for (int i = 22; i >= 0 ; i--) {
symbol[i + 1] = symbol[i];
}
symbol[0] = tamp[1];
left = false;
}
}
if (horz < 300) {//定義向右
x--;
right = true;
if (x <= 0) {
x = 1;
right = false;
}
if (right == true) {
move = true;
tamp[0] = symbol[0];
for (int i = 0; i <= 22 ; i++) {
symbol[i] = symbol[i + 1];
}
symbol[23] = tamp[0];
right = false;
}
}
if (move == true) {
triangle();
move = false;
}
}
void missle() {
planemove();
for (int i = 0; i < 22; i++) {
lc[mis[i][0] / 8].setLed(mis[i][1] / 8, mis[i][0] % 8, mis[i][1] % 8, 0);
if (mis[i][0] > -1) {
mis[i][0]--;//讓飛彈的row顯示位置改變
}
lc[mis[i][0] / 8].setLed(mis[i][1] / 8, mis[i][0] % 8, mis[i][1] % 8, 1);
}
}
void fire() {
if (num < 21) {
num++;//飛彈發射數量累加
}
else {
num = 0;//超過彈夾可容納數量 重製為0
}
mis[num][0] = 21; //設定飛彈發射時row位置
mis[num][1] = x; //設定該飛彈發射時col位置
tone(Speaker_PIN, c6, 30);
delay(50);
tone(Speaker_PIN, 1046, 30);//發聲裝置
lc[2].setLed(mis[num][1] / 8, mis[num][0] % 8, mis[num][1] % 8, 1);
}
void triangle() {//顯示飛機圖形
for (int j = 0; j < 8; j++) {
lc[2].setColumn(0, j, symbol[j]);
}
for (int j = 8; j < 16; j++) {
lc[2].setColumn(1, j - 8, symbol[j]);
}
for (int j = 16; j < 24; j++) {
lc[2].setColumn(2, j - 16, symbol[j]);
}
}