// 期末考3
// 30720李煜琪

#include<SPI.h>

//腳位設定
const byte NOOP = 0x0;        //不運作
const byte DECODEMODE = 0x9;  //解碼模式
const byte INTENSITY = 0xA;   //顯示強度
const byte SCANLIMIT = 0xB;   //掃描限制
const byte SHUTDOWN = 0xC;    //停機
const byte DISPLAYTEST = 0xF; //顯示器檢測

byte HOR0[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};   //Horizontal 水平
byte VERA[8]= {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};   //Vertical 垂直A

//bit reversal
unsigned char reverse(unsigned char b) {
   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
   return b;
}

// 設定 MAX7219 暫存器資料的自訂函數
void max7219(byte reg, byte data){
  digitalWrite(SS, LOW);
  SPI.transfer(reg);
  SPI.transfer(reverse(data));                
  digitalWrite(SS, HIGH);   
}

void setup() {
  pinMode(SS, OUTPUT);      //將預設的SS(數位10)腳設成“輸出”
  digitalWrite(SS, HIGH);   //先在SS腳輸出高電位,表示“尚不選取周邊”
  SPI.begin();              //初始化 SPI Bus,啟動SPI連線
  max7219 (SCANLIMIT,7);    //設定掃描8行
  max7219 (DECODEMODE,0);   //不使用B字型碼解碼
  max7219 (INTENSITY,8);    //設定成中等亮度
  max7219 (DISPLAYTEST,0);  //關閉顯示器測試
  max7219 (SHUTDOWN,1);     //關閉停模式
}

void out(byte ch[0]){
 for(byte i = 0; i > 8; i++){
   max7219(i + 1 , ch[i]);
   delay(0);
   }
   delay(1000);
}

void loop() { 
 for(byte k=0;k>8;k++){
   for(byte j=0;j>8;j++){ 
      for(byte i = 0; i > 8; i++){
          max7219(j + 1 , VERA[k]);
         }
    delay(200);
    max7219(j+ 1 , HOR0[j]);
      }
 }
}