联級四個max7219程序

naga568   2012-2-20 12:55 楼主
// 2012-2  by naga lee

#include <reg51.h>
#include <intrins.h> //_nop_();


sbit Max7129_DIN  = P1^3;     // Serial-Data Input: rising edge
sbit Max7129_LOAD = P1^5;     // Load-Data Input: rising edge
sbit Max7129_CLK  = P1^4;     // Serial-Clock Input: maximum 10MHz
unsigned char k1,k2,k3,k4,k5,k6,k7=0x00,k8=0x00;
unsigned int cnt=0;

#define MSB     0x80
#define LSB     0x01
#define HIGH    1
#define LOW     0       
// max7129 暫存器說明
#define DECODE_MODE     0x09    // 解碼方式  
#define INTENSITY       0x0A    // 顯示亮度  
#define SCAN_LIMIT      0x0B    // 掃描位數
#define SHUT_DOWN       0x0C    // 掉電模式
#define DISPLAY_TEST    0x0F    // 顯示測試  

// x是後 y是前
unsigned char code 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
                                 };
                                
unsigned char code 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,unsigned char dat2,unsigned char dat3);
void Max7219_Init(void);
void Init_IRQ(void);
    
void Init_IRQ()
{

        ET1     =   0x01; //Enable Timer Interrupt 1

        TMOD    =  0X10 ;
        TH1     =  0X00 ;    
        TL1     =  0XA0 ;
    
        EA      =  0x01 ; //Enable All Interrupt                    
        TR1     =  0X01 ; //START TIMER1

}    
    
     // 送出1byte:
     // 上升沿發送數據
     // MSB first
    
void Max7219_WriteByte(unsigned char byte)
{

unsigned char i;

          for (i=0; i<8; i++)      
       {  

           _nop_();
           Max7129_CLK = LOW;
           Max7129_DIN = (bit)(byte & MSB);//運算結果=0即輸出0,不是0即輸出1     
       byte <<= 1;   
       Max7129_CLK = HIGH;
               
           }

}      
    
     // write a byte to register
     // 先address 後data
    
void Max7219_WriteData_01(unsigned char addr, unsigned char dat0,unsigned char dat1,unsigned char dat2,unsigned char dat3)
{  
        Max7129_LOAD = HIGH;                // 使Max7129_LOAD HI  
        _nop_();        
        Max7129_LOAD = LOW;                 // 使Max7129_LOAD LOW 串列資料傳送ENABLE
        _nop_();
                                           
        Max7219_WriteByte(addr);
        Max7219_WriteByte(dat0);

        Max7219_WriteByte(addr);
        Max7219_WriteByte(dat1);

        Max7219_WriteByte(addr);
        Max7219_WriteByte(dat2);

        Max7219_WriteByte(addr);
        Max7219_WriteByte(dat3);
         _nop_();
        Max7129_LOAD = HIGH;                // 使Max7129_LOAD HI 串列資料傳送DISABLE
        _nop_();
        _nop_();
        _nop_();
                                                       
}

void OUT_0(void)
           
{    
            Max7219_WriteData_01(1, buf_x[k1][0]|buf_y[k2][0],buf_x[k3][0]|buf_y[k4][0],buf_x[k5][0]|buf_y[k6][0],buf_x[k7][0]|buf_y[k8][0]);
            Max7219_WriteData_01(2, buf_x[k1][1]|buf_y[k2][1],buf_x[k3][1]|buf_y[k4][1],buf_x[k5][1]|buf_y[k6][1],buf_x[k7][1]|buf_y[k8][1]);
            Max7219_WriteData_01(3, buf_x[k1][2]|buf_y[k2][2],buf_x[k3][2]|buf_y[k4][2],buf_x[k5][2]|buf_y[k6][2],buf_x[k7][2]|buf_y[k8][2]);
            Max7219_WriteData_01(4, buf_x[k1][3]|buf_y[k2][3],buf_x[k3][3]|buf_y[k4][3],buf_x[k5][3]|buf_y[k6][3],buf_x[k7][3]|buf_y[k8][3]);

            Max7219_WriteData_01(5, buf_x[k1][4]|buf_y[k2][4],buf_x[k3][4]|buf_y[k4][4],buf_x[k5][4]|buf_y[k6][4],buf_x[k7][4]|buf_y[k8][4]);
            Max7219_WriteData_01(6, buf_x[k1][5]|buf_y[k2][5],buf_x[k3][5]|buf_y[k4][5],buf_x[k5][5]|buf_y[k6][5],buf_x[k7][5]|buf_y[k8][5]);
            Max7219_WriteData_01(7, buf_x[k1][6]|buf_y[k2][6],buf_x[k3][6]|buf_y[k4][6],buf_x[k5][6]|buf_y[k6][6],buf_x[k7][6]|buf_y[k8][6]);
            Max7219_WriteData_01(8, buf_x[k1][7]|buf_y[k2][7],buf_x[k3][7]|buf_y[k4][7],buf_x[k5][7]|buf_y[k6][7],buf_x[k7][7]|buf_y[k8][7]);
}     

       
void Max7219_Init(void)       
{              
       Max7219_WriteData_01(SHUT_DOWN,    0x01,0X01,0X01,0X01);   // 掉電模式 : 1, 正常操作; 0, 睡眠模式

       Max7219_WriteData_01(DISPLAY_TEST, 0x00,0X00,0X00,0X00);   // 顯示測試 : 0, 正常模式; 1, 測試模式

       Max7219_WriteData_01(DECODE_MODE,  0x00,0X00,0X00,0X00);   // 解碼方式:0, 不解碼; 1, BCD解碼

       Max7219_WriteData_01(SCAN_LIMIT,   0x07,0X07,0x07,0X07);   // 掃描位數 : 0 ~ 7 最多支援8位數字

        Max7219_WriteData_01(INTENSITY,    0x01,0X01,0X01,0X01);   // 顯示亮度: 0 ~ F  F最亮
}

void Timer_Interrupt_1() interrupt 3
{
    cnt++;


        TH1    =  0X01 ; //a8 ;     
        TL1    =  0X88 ;
 
}

void main(void)
 {
       Max7129_LOAD = HIGH;      // 使Max7129_LOAD HI  
       Max7129_CLK = HIGH;       // 使Max7129_CLK  HI           
               
       Max7219_Init();  
       _nop_();
       Init_IRQ();
          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();
              }
          
 }

回复评论 (1)

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复