
/*16*16點陣屏的顯示*/       
/*******************
PIN  --  点阵 
-------------------
DATA  --  Ser
SCLH  --  Srck
SCLT  --  rck
AB  --  ab
SC  --  ck
*******************/

int DATA=3;                //列數據輸出位        
int SCLH=4;                //列掃描時觸發位
int SCLT=5;                //列數據鎖存位
int AB  =6;                //行數據輸出位
int SC=7;                  //行掃描時觸發位
unsigned char i=0,j=0;
unsigned char date[32];                //32字節RAM做為16*16點陣屏顯示緩存

void setup() {                
  // initialize the digital pin as an output.
  pinMode(DATA, OUTPUT);   
  pinMode(SCLH, OUTPUT); 
  pinMode(SCLT, OUTPUT); 
  pinMode(AB, OUTPUT); 
  pinMode(SC, OUTPUT);   
}

int table1[32]={
0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x3C,0x00,0xE4,0x03,0xC4,0x0E,0x40,0x18,0x40,
0x1C,0x40,0x1F,0x40,0x07,0xE4,0x01,0xFC,0x00,0x7C,0x00,0x1C,0x00,0x04,0x00,0x04};/*"A"*/
int table2[32]={
0x00,0x04,0x10,0x04,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x11,0x84,0x11,0x84,0x11,0x84,
0x11,0x84,0x11,0x84,0x11,0x84,0x1F,0x8C,0x1F,0xFC,0x0E,0x78,0x00,0x30,0x00,0x00};/*"B"*/
int table3[32]={
0x00,0x00,0x03,0xE0,0x07,0xF0,0x0F,0xF8,0x0C,0x1C,0x18,0x0C,0x10,0x04,0x10,0x04,
0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x18,0x08,0x0C,0x30,0x00,0x00};/*"C"*/
int table4[32]={
0x00,0x00,0x10,0x04,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,
0x10,0x04,0x10,0x0C,0x18,0x0C,0x0C,0x18,0x0F,0xF8,0x07,0xF0,0x03,0xE0,0x00,0x00};/*"D"*/

/* 顯示函數 */
void display()
{        
        unsigned char i,ia,j,tmp;  //定義變量
        digitalWrite(AB,LOW);            //將行數據位清0，準備移位
        for(i=0;i<=16;i++)           //循環輸出16行數據
        {                
                digitalWrite(SC,LOW);        //為行移位做準備
                digitalWrite(SCLT,LOW);        //為列鎖存做準備
                for(ia=2;ia>0;)                //每行16個點，循環位移兩個字節,循環兩次
                {        
                        ia--;                
                        tmp=date[i*2+ia];  //讀取點陣數據做輸出                           
                        shiftOut(DATA,SCLH,LSBFIRST,tmp);  //將DATA上的數據移入寄存器                                              
                }        
                 PORTD |= 0xa0;                //移入两个字节结束,SCK\SCLT拉高.
                digitalWrite(AB,HIGH);        //行数据位只在第一行时为0，其它时候都为1
                                                         //移位的过程，AB就必需是1
        }                                                                        
        j=64;
        while(j--);               //移入兩個字節結束,SCK\SCLT拉高
        digitalWrite(SC,LOW);                        
        digitalWrite(SC,HIGH);       //行數據位只在第一行時為0，其它時候都為1
                                    //移位的過程，AB就必需是1
}

/* timer=1時，為1s左右的延時 */
void display_time(unsigned int timer)      //指定時間掃描顯示
{
        unsigned char i;        
        while(timer--)
        {                
                i=50;                
                while(i--)
                        display();
        }
}

void disp()
{
    for(i=0;i<32;i++)
        date[i]=table1[i];//將"A"字數據複製到顯示緩存
        display_time(2);        //顯示約2秒
    
    for(i=0;i<32;i++)
        date[i]=table2[i];//將"B"字數據複製到顯示緩存
        display_time(2);         //顯示約2秒

    for(i=0;i<32;i++)
        date[i]=table3[i];//將"C"字數據複製到顯示緩存
        display_time(2);         //顯示約2秒
    for(i=0;i<32;i++)
        date[i]=table4[i];//將"D"字數據複製到顯示緩存
        display_time(2);         //顯示約2秒
}
void loop() 
{        
    disp();                
}
