Discussion in "8051 Discussion Forum" started by    sayonee    Dec 16, 2011.
Fri Dec 16 2011, 12:23 pm
#1
Hello there I am trying to implement SPI protocol.I am interfacing 7 segment circuit ( 4 units ) using MAX 7219 and I am not able to get the desired LED output ...please let me know where I am going wrong ...

Thanks

#include<reg51.h>
 
#define uchar unsigned char
#define uint unsigned int
 
#define  HIGH     1
#define  LOW      0
#define  TRUE      1
#define  FALSE      0
#define  ZERO      0 
#define  MSB       0x80
#define  LSB       0x01
//max7219 part
#define  DECODE_MODE   0x09 
#define  INTENSITY     0x0A 
#define  SCAN_LIMIT    0x0B 
#define  SHUT_DOWN     0x0C 
#define  DISPLAY_TEST  0x0F 

//pin defined
/***********************************************************************/
//change this part at different board
sbit LOAD=P1^2; //MAX7219    Load-Data Input:    rising edge  pin 12 
sbit DIN=P1^1; //MAX7219    Serial-Data Input:   rising edge  pin 1
sbit CLK=P1^0; //MAX7219   Serial-Clock Input:  maximum 10MHz  pin 13


/***********************************************************************/
void Write_Max7219_byte(unsigned char temp);//write max7219 a byte
void Write_Max7219(unsigned char address,unsigned char dat);//write max7219 command and data
void Init_Max7219(void);//Initize max7219
void delay1ms(uint x);

/***********************************************************************/
void main(void)
{
 uchar i,j=1; 
 Init_Max7219();
 /*for(i=1;i<=4;i++)
 Write_Max7219(i,0); */
 for(i=0;i<=3;i++)
 Write_Max7219(i,0);
 while(TRUE)
 {
   
  for(i=1;i<9;i++) 
  {
   Write_Max7219(j,i);
   delay1ms(1000);
  }
  j++;
  if(j==5)
  {
  j=1;
  for(i=1;i<=4;i++)
  Write_Max7219(i,0);
  }
 } 
}
/***********************************************************************/
void Write_Max7219_byte(uchar temp)
{
 unsigned char i;
 for (i=0;i<8;i++)     
  { 
     CLK=LOW;
     DIN=(bit)(temp&MSB);      
     temp<<=1;
	 CLK=HIGH;
   }
}
/***********************************************************************/
void Write_Max7219(uchar address,uchar dat)
{ 
   LOAD=LOW;
   Write_Max7219_byte(address); 
   Write_Max7219_byte(dat);
   LOAD=HIGH;                 
}
/***********************************************************************/
void Init_Max7219(void)      
{ 
 Write_Max7219(SHUT_DOWN, 0x01);   //Normal Operation XXXXXXX1 Shutdown Mode   XXXXXXXX0
 Write_Max7219(DISPLAY_TEST, 0x00);   //Normal Operation XXXXXXX0 Display Test Mode XXXXXXXX1
 Write_Max7219(DECODE_MODE, 0xff);   //Decode Mode Select D7~D0 1 B decode 0 No decode 
 Write_Max7219(SCAN_LIMIT, 0x03);   //SCAN LIMIT 0~7 0xX0~0xX7
 Write_Max7219(INTENSITY, 0x04);   //Set Intensity   0xX0~0xXf
}

void delay1ms(uint x)
{
  uint i,j;
  for(i=0;i<x;i++)
    for(j=0;j<120;j++);
}


Tue Dec 20 2011, 02:07 am
#2
looks like problem is here...
DIN=(bit)(temp&MSB);


change it to...

DIN = (temp & MSB) == MSB ? 1 : 0;


and try again
Tue Dec 20 2011, 09:58 pm
#3
ok Ajay ...let me try this and get back to you ....thanks for now
Sun Jan 08 2012, 02:32 am
#4
let me know if you're done

Get Social

Information

Powered by e107 Forum System

Downloads

Comments

ztaletpzca
Wed Apr 24 2024, 11:19 pm
IrardlPex
Wed Apr 24 2024, 08:42 pm
Charlestehed
Wed Apr 24 2024, 05:20 pm
Robertgurse
Wed Apr 24 2024, 02:43 pm
Richardedils
Wed Apr 24 2024, 04:07 am
ChrisLub
Tue Apr 23 2024, 05:21 pm
Davidbab
Tue Apr 23 2024, 10:41 am
Richardrit
Tue Apr 23 2024, 09:54 am