  | 
	  | 
		 
	 
	
		| View previous topic :: View next topic   | 
	 
	
	
		| Author | 
		Message | 
	 
	
		
			StuH_CC
 
 
  Joined: 07 May 2004 Posts: 16 Location: Shropshire, UK 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| MAX6953 5x7 LED matrix driver functions | 
			 
			
				 Posted: Tue Aug 10, 2004 6:23 pm     | 
				     | 
			 
			
				
  | 
			 
			
				I hope this isn't too messy! It works, anyway (if I haven't left something out...).
 
 
 	  | Code: | 	 		  /******************************************************************************
 
 
Driver routines for MAX6953 5x7 cathode-row LED display drivers.
 
 
Written for the CCS PCM cross-compiler version 3.185
 
 
Originally written by Stuart Hunter, Technical Director, ViziMatic Ltd.
 
******************************************************************************/
 
 
 
#ifndef DISPLAY_SDA
 
 
//The pin definitions are set for a PIC16F819 SSP module. If they are
 
//redefined elsewhere before this file is included then your own definitions
 
//will override these.
 
#define DISPLAY_SDA        PIN_B1
 
#define DISPLAY_SCL        PIN_B4
 
#endif
 
 
//Miscellaneous defines
 
#define SLOW             0      //Use for setting blink rate      
 
#define FAST             1
 
#define PLANE0             0x20   //Use for setting data start address
 
#define PLANE1             0x40
 
#define BOTHPLANES          0x60
 
#define WRITE_NOW          1      //Used in operations affecting the CONFIG
 
#define WRITE_LATER       0      //register.
 
 
 
 
 
//Add FORCE_HW to the end of the line below if you want or need
 
//to use a hardware I2C implementation (ie your PIC has the MSSP module).
 
//Remove the line if you've already defined the I2C pins!!!
 
#use i2c(master, sda=DISPLAY_SDA, scl=DISPLAY_SCL )      //,FORCE_HW
 
 
int config_byte;
 
int device_address;
 
 
 
// Initialise the I2C bus and config register
 
void init_display()
 
{
 
      output_float(DISPLAY_SCL);
 
      output_float(DISPLAY_SDA);
 
   config_byte = 0;
 
}
 
 
void set_device_address( int addr )
 
{
 
   addr+= 0x50;         //MAX6953 addresses take the form 101xxxx
 
   device_address = addr;   //where xxxx is the user-selected address 0-15.
 
}
 
 
// This function is mainly for internal use, but you can use it to
 
// set the CONFIG register directly if you don't want to use the
 
// individual functions provided for this purpose.
 
void write_config_register( int config_byte )
 
{
 
   i2c_start();
 
   i2c_write( (device_address<<1) & 0xFE );
 
   i2c_write( 0x04 );
 
   i2c_write( config_byte );
 
   i2c_stop();
 
}
 
 
// This function sets the display interval for each display plane.
 
// With a 4MHz clock, FAST is 0.5s and SLOW is 1.0s.
 
void set_blink_speed( int speed, short wrt )
 
{
 
   if( speed == SLOW ) config_byte &= 0xFB;
 
   else config_byte |= 0x04;
 
   if( wrt ) write_config_register( config_byte );
 
}
 
 
// This function enables or disables plane switching ( blinking )
 
void blink_enable( short state, short wrt )
 
{
 
   if( state ) config_byte |= 8;
 
   else config_byte &= 0xF7;
 
   if( wrt ) write_config_register( config_byte );
 
}
 
 
// This function is used for blink time synchronisation across multiple devices.
 
// call it once for each device, in sequence. Nonpersistent.
 
void blink_sync( void )
 
{
 
   write_config_register( config_byte |= 0x10 );
 
}
 
 
// Clear the plane data in the chip. Nonpersistent.
 
void clear_digits( void )
 
{
 
   write_config_register( config_byte | 0x20 );
 
}
 
 
// Put the display into low power shutdown mode
 
void shutdown( short state, short wrt )
 
{
 
   if( !state ) config_byte |= 0x01;
 
   else config_byte &= 0xFE;
 
   if( wrt ) write_config_register( config_byte );
 
}
 
 
// Put the display in test mode. Will illuminate all LEDs if state=TRUE.
 
// Does not affect plane data - original display is restored when set FALSE.
 
void display_test( short state )
 
{
 
   i2c_start();
 
   i2c_write( (device_address<<1) & 0xFE );
 
   i2c_write( 0x07 );
 
   if (state )
 
   {
 
      i2c_write( 1 );
 
   }
 
   else
 
   {
 
      i2c_write( 0 );
 
   }
 
   i2c_stop();
 
}
 
 
// Set the display intensity from 0-15. This routine sets all digits to
 
// the same value, if you want to set 'em individually then you need to 
 
// implement your own function - I don't need that ability!
 
void set_intensity( int intens )
 
{
 
   int tempd;
 
   tempd = intens<<4;   //set the most significant nybble
 
   intens |= tempd;
 
   i2c_start();
 
   i2c_write( (device_address<<1) &0xFE );
 
   i2c_write( 0x01 );      //first intensity register
 
   i2c_write( intens );
 
   i2c_write( intens );   //register addr autoincrements, so write second reg.
 
   i2c_stop();
 
}
 
 
// Sets the number of digits to be displayed ( 2 or 4 ). Included just for
 
// the hell of it - I don't use this in my app.
 
void set_scan_limit( short state )
 
{
 
   i2c_start();
 
   i2c_write( (device_address<<1) &0xFE );
 
   i2c_write( 0x03 );
 
   if (state )
 
   {
 
      i2c_write( 1 );
 
   }
 
   else
 
   {
 
      i2c_write( 0 );
 
   }
 
   i2c_stop();
 
}
 
 
// Set the plane data for display. Normal characters should be written to 
 
// PLANE0. See the Maxim datasheet for an explanation of the data planing
 
// system.
 
void write_display_character( int start, int length, char* string )
 
{
 
   int n;
 
 
   i2c_start();
 
   i2c_write( (device_address<<1) &0xFE );
 
   i2c_write( start );                  //start address of write operation
 
   for( n=0; n<length; n++ )
 
   {
 
      i2c_write( string[n] );            //write noninverted string, address
 
   }                              //will autoincrement.
 
   i2c_stop();
 
}
 
 
// As above, but displays an inverted ( background lit, char off ) character.
 
void write_inverted_display_character( int start, int length, char* string )
 
{
 
   int n;
 
 
   i2c_start();
 
   i2c_write( (device_address<<1) &0xFE );
 
   i2c_write( start );                  //start address of write operation
 
   for( n=0; n<length; n++ )
 
   {
 
      i2c_write( string[n] |= 0x80 );      //write inverted string, address
 
   }                              //will autoincrement.
 
   i2c_stop();
 
}
 
 | 	  
 
 
As an example, in the main() function, include the following code:
 
 	  | Code: | 	 		  
 
init_display();
 
set_device_address( 0 );
 
shutdown( FALSE,TRUE );
 
set_intensity( 15 );
 
display_test( TRUE );
 
delay_ms( 2000 );
 
display_test( FALSE );
 
write_display_character( PLANE0,4,"TEST" );
 
 | 	  
 
 
This of course assumes that your MAX6953 is set at the base address - if it isn't, then substitute the appropriate number 0-15 in set_device_address(). | 
			 
		  | 
	 
	
		  | 
	 
	
		
			The Puma
 
 
  Joined: 23 Apr 2004 Posts: 227 Location: The Netherlands 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Feb 28, 2006 1:07 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Is the driver the same for the MAX6952, exept then the I2C functions
 
this must be concerted to SPI | 
			 
		  | 
	 
	
		  | 
	 
	
		
			Lykos1986
 
 
  Joined: 26 Nov 2005 Posts: 68
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri May 18, 2007 12:15 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Hello!
 
I am trying to use the previous driver but I have some problems with the program. The MPLAB gives me that error:
 
Error 90 "E:\MPLAB 7.50\Projects\...    …" Line 24(43,44): Attempt to create a pointer to a constant
 
 
And the program is:
 
 
#include <16F876A.h>
 
#fuses XT, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
 
#use delay (clock = 4000000)
 
#include <max6953.c>
 
 
void main()
 
{
 
   input(pin_b2);
 
   input(pin_b3);
 
   input(pin_c0);
 
   input(pin_c1);
 
 
delay_ms(100);
 
 
output_high(pin_a5);
 
 
init_display();
 
set_device_address( 0 );
 
shutdown( FALSE,TRUE );
 
set_intensity( 1 );
 
display_test( TRUE );
 
delay_ms( 2000 );
 
display_test( FALSE );
 
write_display_character( PLANE0,4, "TEST" );  ---------------------Error
 
 
while(1)
 
{
 
	output_high(pin_a5);
 
	delay_ms(1000);
 
	output_low(pin_a5);
 
	delay_ms(1000);
 
}
 
}
 
 
 
What I have to do??? | 
			 
		  | 
	 
	
		  | 
	 
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri May 18, 2007 12:32 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Create an array in RAM.  Copy the constant string into that array.
 
Pass the array to the write_display_character() function.  See the
 
changes shown in bold below:
 
 	  | Quote: | 	 		  
 
void main()
 
{
 
char stringbuf[20];
 
 
.
 
.
 
.
 
 
 
strcpy(stringbuf, "TEST");
 
write_display_character( PLANE0, 4, stringbuf);
 
.
 
.
 
.
 
while(1);
 
}  | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		
			Lykos1986
 
 
  Joined: 26 Nov 2005 Posts: 68
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri May 18, 2007 2:48 pm     | 
				     | 
			 
			
				
  | 
			 
			
				It works!!!!!
 
 
Thank you very much!!!
 
But why that is happening? I have very basics knowledge on C | 
			 
		  | 
	 
	
		  | 
	 
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri May 18, 2007 3:01 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Read the compiler error message:
 
 	  | Quote: | 	 		  |  Line 24(43,44): Attempt to create a pointer to a constant  | 	  
 
The compiler will not let you create a pointer to a string stored in ROM.
 
It will only let you create a pointer to a string stored in RAM.
 
Therefore, you must copy the string from a ROM array ('const') to
 
a RAM array.   Then you can pass the RAM array to a function.
 
This is a limitation of CCS with the PIC.   In future versions of CCS,
 
they propose to remove this limitation. | 
			 
		  | 
	 
	
		  | 
	 
	
		
			getforumcss
 
 
  Joined: 03 Jun 2007 Posts: 1
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Sun Jun 03, 2007 3:44 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Tks you StuH_CC
 
It is a very good sample code! but you don't have implement all functionality of a max6953 eg for using USER-DEFINED Fonts in address code 0x05.
 
i would like drawn a heart or several smiler. can you make it...
 
best regard
 
 
getelectronic | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
  | 
   
 
  
Powered by phpBB © 2001, 2005 phpBB Group
  
		 |