Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Arduino.h>
- //IO設定
- #define LEDARRAY_D 2
- #define LEDARRAY_C 3
- #define LEDARRAY_B 4
- #define LEDARRAY_A 5
- #define LEDARRAY_G 6
- #define LEDARRAY_DI 7
- #define LEDARRAY_CLK 8
- #define LEDARRAY_LAT 9
- #define led 13
- #define Num_Word 1 //顯示字數
- unsigned char Display_Buffer[2];
- unsigned char Display_Swap_Buffer[Num_Word][32]={0};
- bool Shift_Bit = 0;
- bool Flag_Shift = 0;
- unsigned char Timer0_Count = 0;
- unsigned char temp = 0x80;
- unsigned char Shift_Count = 0;
- unsigned char Display_Word_Count = 0;
- //**************************************************************************************
- #define Num_Of_Word 8 //顯示字數
- //**************************************************************************************
- //字的HEX
- const unsigned char Word[Num_Of_Word][32] =
- {
- 0xFF,0xFF,0x11,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xD7,0xD7,0xD7,0xD7,0xFF,0xFF,/*"W",0*/
- 0xFF,0xFF,0x11,0xBB,0xBB,0xBB,0xBB,0x83,0xBB,0xBB,0xBB,0xBB,0xBB,0x11,0xFF,0xFF,/*"H",1*/
- 0xFF,0xFF,0xEF,0xEF,0xEF,0xD7,0xD7,0xD7,0xD7,0xC7,0xBB,0xBB,0xBB,0x11,0xFF,0xFF,/*"A",2*/
- 0xFF,0xFF,0x01,0x6D,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xC7,0xFF,0xFF,/*"T",3*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",4*/
- 0xFF,0xFF,0x01,0x6D,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xC7,0xFF,0xFF,/*"T",5*/
- 0xFF,0xFF,0x11,0xBB,0xBB,0xBB,0xBB,0x83,0xBB,0xBB,0xBB,0xBB,0xBB,0x11,0xFF,0xFF,/*"H",6*/
- 0xFF,0xFF,0x01,0xBD,0xBD,0xBF,0xBB,0x83,0xBB,0xBF,0xBF,0xBD,0xBD,0x01,0xFF,0xFF,/*"E",7*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",8*/
- 0xFF,0xFF,0x01,0xBD,0xBD,0xBF,0xBB,0x83,0xBB,0xBF,0xBF,0xBF,0xBF,0x1F,0xFF,0xFF,/*"F",9*/
- 0xFF,0xFF,0x11,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xC7,0xFF,0xFF,/*"U",10*/
- 0xFF,0xFF,0xC5,0xB9,0x7D,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xBD,0xC3,0xFF,0xFF,/*"C",11*/
- 0xFF,0xFF,0x11,0xBB,0xB7,0xAF,0x9F,0x9F,0xAF,0xAF,0xB7,0xB7,0xBB,0x11,0xFF,0xFF,/*"K",12*/
- 0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,/*"!",13*/
- 0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,/*"!",14*/
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- };
- //**************************************************************************************
- //設定輸出
- void setup()
- {
- pinMode(LEDARRAY_D, OUTPUT);
- pinMode(LEDARRAY_C, OUTPUT);
- pinMode(LEDARRAY_B, OUTPUT);
- pinMode(LEDARRAY_A, OUTPUT);
- pinMode(LEDARRAY_G, OUTPUT);
- pinMode(LEDARRAY_DI, OUTPUT);
- pinMode(LEDARRAY_CLK, OUTPUT);
- pinMode(LEDARRAY_LAT, OUTPUT);
- Clear_Display();
- }
- void loop()
- {
- unsigned int i;
- //**************************************************************************************
- for(i = 0 ; i < 5; i ++) //設定速度
- //**************************************************************************************
- {
- Display(Display_Swap_Buffer);
- }
- Display_Word_Count = Shift_Count/16; //目前顯示第幾個字
- Calc_Shift();
- Shift_Count++;
- if(Shift_Count == (Num_Of_Word+1)*16 ) //移動次數
- {
- Shift_Count = 0;
- }
- }
- //清除緩衝區
- void Clear_Display()
- {
- unsigned char i,j;
- for(j = 0 ; j < Num_Word; j++)
- {
- for(i = 0 ; i < 32 ;i++)
- {
- Display_Swap_Buffer[j][i] = 0xff; //0=顯示 1=不顯示
- }
- }
- }
- void Calc_Shift()
- {
- unsigned char i;
- for(i = 0;i < 16;i++)
- {
- if((Display_Swap_Buffer[0][16+i]&0x80) == 0) //前8位 移位
- {
- Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe;
- //最低歸0
- }
- else
- {
- Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01; //最低位置1
- }
- if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
- {
- Shift_Bit = Word[Display_Word_Count][i]&temp;
- }
- else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
- {
- Shift_Bit = Word[Display_Word_Count][16+i]&temp;
- }
- else
- {
- Shift_Bit = 1; //移出緩衝區
- }
- if( Shift_Bit == 0) //後8位移位
- {
- Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe; //最低位清零
- }
- else
- {
- Shift_Bit = 1;
- Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01; //最低位置一
- }
- }
- temp = (temp>>1)&0x7f;
- if(temp == 0x00)
- {
- temp = 0x80;
- }
- }
- //num是字數 dat[][32]是字模的名稱
- void Display(unsigned char dat[][32])
- {
- unsigned char i;
- for( i = 0 ; i < 16 ; i++ )
- {
- digitalWrite(LEDARRAY_G, HIGH);
- Display_Buffer[0] = dat[0][i];
- Display_Buffer[1] = dat[0][i+16];
- Send(Display_Buffer[1]);
- Send(Display_Buffer[0]);
- digitalWrite(LEDARRAY_LAT, HIGH); //佔存數據
- delayMicroseconds(1);
- digitalWrite(LEDARRAY_LAT, LOW);
- delayMicroseconds(1);
- Scan_Line(i); //选择第i行
- digitalWrite(LEDARRAY_G, LOW);
- delayMicroseconds(300);; //延遲一段時間。
- }
- }
- //掃描某行
- void Scan_Line( unsigned char m)
- {
- switch(m)
- {
- case 0:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 1:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);
- break;
- case 2:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 3:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);
- break;
- case 4:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 5:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);
- break;
- case 6:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 7:
- digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);
- break;
- case 8:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 9:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);
- break;
- case 10:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 11:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);
- break;
- case 12:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 13:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);
- break;
- case 14:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);
- break;
- case 15:
- digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);
- break;
- default : break;
- }
- }
- //發送數據
- void Send( unsigned char dat)
- {
- unsigned char i;
- digitalWrite(LEDARRAY_CLK, LOW);
- delayMicroseconds(1);;
- digitalWrite(LEDARRAY_LAT, LOW);
- delayMicroseconds(1);;
- for( i = 0 ; i < 8 ; i++ )
- {
- if( dat&0x01 )
- {
- digitalWrite(LEDARRAY_DI, HIGH);
- }
- else
- {
- digitalWrite(LEDARRAY_DI, LOW);
- }
- digitalWrite(LEDARRAY_CLK, HIGH); //上升數據
- delayMicroseconds(1);;
- digitalWrite(LEDARRAY_CLK, LOW);
- delayMicroseconds(1);;
- dat >>= 1; //移位
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement