程序如下 #include <msp430g2231.h> // MSP430G2xx1 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK // // Description: Toggle P1.0 using software and TA_0 ISR. Toggles every // 50000 SMCLK cycles. SMCLK provides clock source for TACLK. // During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to // CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and // used only during TA_ISR. // ACLK = n/a, MCLK = SMCLK = TACLK = default DCO unsigned char k1,k2,k3,k4,k5,k6; unsigned int cnt=0; #define set_Max7129_DIN P1OUT |= 0x08 #define set_Max7129_LOAD P1OUT |= 0x10 #define set_Max7129_CLK P1OUT |= 0x20 #define clr_Max7129_DIN P1OUT &= 0xf7 #define clr_Max7129_LOAD P1OUT &= 0xef #define clr_Max7129_CLK P1OUT &= 0xdf // max7129 暫存器說明 #define DECODE_MODE 0x09 // 解碼方式 #define INTENSITY 0x0A // 顯示亮度 #define SCAN_LIMIT 0x0B // 掃描位數 #define SHUT_DOWN 0x0C // 掉電模式 #define DISPLAY_TEST 0x0F // 顯示測試 // x是後 y是前 const unsigned char buf_x[10][8]={ {0x00,0x83,0x03,0x03,0x03,0x03,0x03,0x83},//0 {0x00,0x83,0x80,0x80,0x80,0x80,0x82,0x80},//1 {0x00,0x83,0x02,0x02,0x83,0x01,0x01,0x83},//2 {0x00,0x83,0x01,0x01,0x83,0x01,0x01,0x83},//3 {0x00,0x01,0x01,0x01,0x83,0x03,0x03,0x03},//4 {0x00,0x83,0x01,0x01,0x83,0x02,0x02,0x83},//5 {0x00,0x83,0x03,0x03,0x83,0x02,0x02,0x83},//6 {0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x83},//7 {0x00,0x83,0x03,0x03,0x83,0x03,0x03,0x83},//8 {0x00,0x83,0x01,0x01,0x83,0x03,0x03,0x83} //9 }; const unsigned char buf_y[10][8]={ {0x00,0x2c,0x0c,0x0c,0x0c,0x0c,0x0c,0x2c},//0- {0x00,0x2c,0x20,0x20,0x20,0x20,0x24,0x20},//1- {0x00,0x2c,0x04,0x04,0x2c,0x08,0x08,0x2c},//2- {0x00,0x2c,0x08,0x08,0x2c,0x08,0x08,0x2c},//3- {0x00,0x08,0x08,0x08,0x2c,0x0c,0x0c,0x0c},//4- {0x00,0x2c,0x08,0x08,0x2c,0x04,0x04,0x2c},//5- {0x00,0x2c,0x0c,0x0c,0x2c,0x04,0x04,0x2c},//6- {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x2c},//7- {0x00,0x2c,0x0c,0x0c,0x2c,0x0c,0x0c,0x2c},//8- {0x00,0x2c,0x08,0x08,0x2c,0x0c,0x0c,0x2c} //9- }; // void Max7219_WriteByte(unsigned char byte); void Max7219_WriteData_01(unsigned char addr, unsigned char dat0,unsigned char dat1); void Max7219_Init(void); void Max7219_WriteByte(unsigned char byte) { unsigned char i; for (i=0; i<8; i++) { clr_Max7129_CLK; // Max7129_DIN = (bit)(byte & MSB);//運算結果=0即輸出0,不是0即輸出1 if ( (byte&0x80) == 0x80 ) set_Max7129_DIN ; else clr_Max7129_DIN ; byte <<= 1; set_Max7129_CLK ; } } // write a byte to register // 先address 後data void Max7219_WriteData_01(unsigned char addr, unsigned char dat0,unsigned char dat1) { set_Max7129_LOAD ; clr_Max7129_LOAD ; Max7219_WriteByte(addr); Max7219_WriteByte(dat0); Max7219_WriteByte(addr); Max7219_WriteByte(dat1); set_Max7129_LOAD ; } void OUT_0(void) { Max7219_WriteData_01(1, buf_x[k1][0]|buf_y[k2][0],buf_x[k3][0]|buf_y[k4][0]); Max7219_WriteData_01(2, buf_x[k1][1]|buf_y[k2][1],buf_x[k3][1]|buf_y[k4][1]); Max7219_WriteData_01(3, buf_x[k1][2]|buf_y[k2][2],buf_x[k3][2]|buf_y[k4][2]); Max7219_WriteData_01(4, buf_x[k1][3]|buf_y[k2][3],buf_x[k3][3]|buf_y[k4][3]); Max7219_WriteData_01(5, buf_x[k1][4]|buf_y[k2][4],buf_x[k3][4]|buf_y[k4][4]); Max7219_WriteData_01(6, buf_x[k1][5]|buf_y[k2][5],buf_x[k3][5]|buf_y[k4][5]); Max7219_WriteData_01(7, buf_x[k1][6]|buf_y[k2][6],buf_x[k3][6]|buf_y[k4][6]); Max7219_WriteData_01(8, buf_x[k1][7]|buf_y[k2][7],buf_x[k3][7]|buf_y[k4][7]); } void Max7219_Init(void) { Max7219_WriteData_01(SHUT_DOWN, 0x01,0X01); // 掉電模式 : 1, 正常操作; 0, 睡眠模式 Max7219_WriteData_01(DISPLAY_TEST, 0x00,0X00); // 顯示測試 : 0, 正常模式; 1, 測試模式 Max7219_WriteData_01(DECODE_MODE, 0x00,0X00); // 解碼方式:0, 不解碼; 1, BCD解碼 Max7219_WriteData_01(SCAN_LIMIT, 0x07,0X07); // 掃描位數 : 0 ~ 7 最多支援8位數字 Max7219_WriteData_01(INTENSITY, 0x01,0X01); // 顯示亮度: 0 ~ F F最亮 } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { cnt++; CCR0 += 50000; // Add Offset to CCR0 } void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 50000; TACTL = TASSEL_2 + MC_2; // SMCLK, contmode _BIS_SR(GIE); // interrupt ENABLE P1DIR |= 0x38; //P1.3 P1.4 P1.5 all are set output mode set_Max7129_LOAD ; set_Max7129_CLK ; Max7219_Init(); while(1) { k1 = cnt % 10 ; k2 = (cnt/10)%10 ; k3 = (cnt/100)%10 ; k4 = (cnt/1000)%10 ; // k5 = (cnt/10000)%10 ; // k6 = (cnt/100000)%10 ; OUT_0(); } }