- /***********************************************************************************************************
- 實現(xiàn)漢字向上滾動顯示
- P5用于譯碼器LM138實現(xiàn)靜態(tài)掃描(低四位驅動),P4用于LM595串行轉并行。
- LM595采用級聯(lián),可輸入多個字節(jié)。DS為LM595的數(shù)據(jù)口,SH上升沿保存串口數(shù)據(jù)
- ,ST上升沿推DS數(shù)據(jù)到LM595輸出端,ST下降沿將輸出端鎖存。
- 運行時顯示小組標志和“黑客電子小組”向上滾動輸出。
- 硬件資源:
- MSP430F155、LM595(兩個)、LM138(兩個)、8*8LED點陣(四個)
- ************************************************************************************************************/
- #include "msp430x15x.h"
- #define DATADIR P5DIR // 譯碼器控制設定輸出
- #define CTLDIR P4DIR // 串行轉并行芯片控制設定輸出
- #define DATAOUT P5OUT
- #define CTLOUT P4OUT
- #define SH_L CTLOUT &= ~BIT0; // SH為低電位
- #define ST_L CTLOUT &= ~BIT1; // ST為低電位
- #define DS_L CTLOUT &= ~BIT2; // DS為低電位
- #define SH_H CTLOUT |= BIT0; // SH為高電位
- #define ST_H CTLOUT |= BIT1; // ST為高電位
- #define DS_H CTLOUT |= BIT2; // DS為高電位
- typedef unsigned int uint16;
- char table[64]; //用于存放其它數(shù)組
- char tab_0[]={0x00,0x00,0xE0,0x07,0x38,0x1E,0x20,0x04,0x38,0x1C,0x20,0x04,0x38,0x1C,0x20,0x04,
- 0x38,0x1C,0x20,0x04,0x38,0x1C,0x20,0x04,0x38,0x1C,0xE0,0x07,0x00,0x00,0x00,0x00};
- // 小組標志
- char tab_1[]={0x08,0x00,0xFC,0x3F,0x08,0x21,0x28,0x31,0x38,0x2D,0x48,0x25,0x08,0x21,0xF8,0x3F,
- 0x00,0x01,0xFC,0x7F,0x00,0x01,0xFE,0xFF,0x00,0x00,0x90,0x28,0x4C,0x24,0x44,0x44};
- // *黑*
- char tab_2[]={0x00,0x02,0x00,0x01,0xFE,0x7F,0x02,0x48,0xF4,0x8F,0x20,0x08,0x40,0x14,0x80,0x23,
- 0x60,0x0C,0x1E,0x30,0xE4,0xCF,0x20,0x08,0x20,0x08,0x20,0x08,0xE0,0x0F,0x20,0x08};
- // *客*
- char tab_3[]={0x00,0x02,0x00,0x02,0x10,0x02,0xF8,0x7F,0x10,0x42,0x10,0x42,0xF0,0x7F,0x10,0x42,
- 0x10,0x42,0xF0,0x7F,0x10,0x42,0x00,0x02,0x04,0x02,0x04,0x02,0xFC,0x01,0x00,0x00};
- // *電*
- char tab_4[]={0x00,0x00,0xF0,0x3F,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x04,0x01,0xFE,0xFF,
- 0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02};
- // *子*
- char tab_5[]={0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x40,0x05,0x20,0x05,0x10,0x09,
- 0x08,0x09,0x04,0x11,0x04,0x21,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02};
- // *小*
- char tab_6[]={0x00,0x10,0x08,0x10,0xFC,0x21,0x08,0x21,0x08,0x45,0x08,0xF9,0xF8,0x11,0x08,0x21,
- 0x08,0x41,0x08,0xFD,0xF8,0x41,0x08,0x01,0x08,0x1D,0x08,0xE1,0xFE,0x47,0x00,0x00};
- // *組*
- void WriteByte(char send) // 發(fā)送一個字節(jié)
- {
- char temp_wb,i_wb;
- SH_L;
- for(i_wb=0;i_wb<8;i_wb++)
- {
- temp_wb = send & 0X80;
- if(temp_wb==0) DS_L;
- if(temp_wb!=0) DS_H;
- SH_H;
- send <<= 1;
- _NOP(); // 延時一個機器周期
- SH_L;
- }
- }
- void WriteLine(char *data_wl)
- {
- char i_wl;
- ST_L;
- for(i_wl=16;i_wl>0;i_wl--) // 由于兩個595級聯(lián),故一次寫入兩個字節(jié)
- {
- WriteByte(*data_wl++);
- WriteByte(*data_wl++);
- ST_H; // ST上升沿推送數(shù)據(jù)
- DATAOUT = i_wl-1; // 掃描第幾行
- ST_L; // ST下降沿鎖存
- }
- }
- void arrcpy(char *arr1,char *arr2) // 將數(shù)組arr2復制到arr1
- {
- char i;
- for(i=0;i<32;i++)
- *arr1++ = *arr2++;
- }
- void arrcat(char *arr1,char *arr2) // 將數(shù)組arr2連接到arr1后面
- {
- char i;
- for(arr1+=32,i=0;i<32;i++)
- *arr1++ = *arr2++;
- }
- void dis_move(char *p_dis) // 移動掃描
- {
- char i1,i2;
- for(i1=0;i1<17;i1++)
- {
- p_dis = &table[i1*2];
- for(i2=0;i2<10;i2++)
- WriteLine(p_dis);
- }
- }
- void display() // 移動顯示
- {
- arrcpy(table,tab_0); // 將tab_0復制到table
- arrcat(table,tab_1); // 將tab_1連接到table
- dis_move(table); // 將table移動顯示
- arrcpy(table,tab_1);
- arrcat(table,tab_2);
- dis_move(table);
- arrcpy(table,tab_2);
- arrcat(table,tab_3);
- dis_move(table);
- arrcpy(table,tab_3);
- arrcat(table,tab_4);
- dis_move(table);
- arrcpy(table,tab_4);
- arrcat(table,tab_5);
- dis_move(table);
- arrcpy(table,tab_5);
- arrcat(table,tab_6);
- dis_move(table);
- arrcpy(table,tab_6);
- arrcat(table,tab_0);
- dis_move(table);
- }
- void main( void )
- {
- // Stop watchdog timer to prevent time out reset
- WDTCTL = WDTPW + WDTHOLD;
- DATADIR = 0X0F; // 設定數(shù)據(jù)為低四位輸出
- CTLDIR = 0X07; // 設定控制為低三位輸出
- while(1)
- {
- display();
- }
-
- }
復制代碼
|