Charles Young's development fork. Going forward I only want to push mature code to main repository.

Dependencies:   mbed

Fork of GEO_COUNTER_L432KC by Geo Electronics "Geo Counter"

LED7segDisplay.cpp

Committer:
Charles David Young
Date:
2018-09-05
Revision:
27:81c417f7cf1a
Parent:
26:166dbe6022e8
Child:
29:3a2152a3a9d1

File content as of revision 27:81c417f7cf1a:

/**
 * @author Charles Young
 *
 */

#include "LED7segDisplay.hpp"

LED7segDisplay::LED7segDisplay()
{
   brightness = BRIGHTNESS_MAX;
   Display_init();
}

//---------------------------------------------------------------------------
// Initialize the MAX7219

void LED7segDisplay::Display_init(void)
{
   uint8_t i;
   uint16_t data_to_send[6] = {SHUTDOWN, TURN_ON, DEC_MODE, brightness, SCAN_LIM, TEST};

   for(i = 0; i < sizeof(data_to_send)/sizeof(uint16_t); i++)
   {
      sendDataToDisplay(data_to_send[i]);
   }
    
   return;
}

void LED7segDisplay::Display_brightness_up()
{
   if (brightness < BRIGHTNESS_MAX)
   {
      Display_brightness(++brightness);
   }
}

void LED7segDisplay::Display_brightness_down()
{
   if (brightness > BRIGHTNESS_MIN)
   {
      Display_brightness(--brightness);
   }
}

void LED7segDisplay::Display_brightness(uint16_t brightness)
{
   sendDataToDisplay(brightness);
}

//---------------------------------------------------------------------------
// Refresh the 6 digits of the main display

void LED7segDisplay::Display_6D_write(uint8_t value)
{
 
   uint8_t digit;
   uint16_t data_to_send;
   char TextString[6];
    
   // int to string, then string to digits
    
   sprintf(TextString, "%6d", value);   // int to string
    
   for(uint8_t i=0; i<6; i++)
   {   
      if(TextString[i] == ' ')  // blank empty digits
         Disp_Digit[i] = 0x7F;
      else
         Disp_Digit[i] = TextString[i]-'0';      
   }

   // write to chip

   SCK = 0;
   wait_us(DT);    
    
   for(digit = 1; digit <7; digit++)
   {
      // each stream consists of digit address and data to show
      data_to_send = 7 - digit;
      data_to_send<<=8;
      data_to_send = data_to_send | Disp_Digit[digit-1];
      sendDataToDisplay(data_to_send);
   }
    
   return;
}


//---------------------------------------------------------------------------
// Refresh the 2 digits of the gate display

void LED7segDisplay::Display_2D_write(unsigned short value)
{
 
   uint8_t digit;
   uint16_t data_to_send;
   char TextString[2];

   // int to string, then string to digits
    
   sprintf(TextString, "%2d", value);   // int to string

   if(TextString[0] == ' ')  // blank empty digits
      Disp_Digit[7] = 0x7F;
   else
      Disp_Digit[7] = TextString[0] - '0';
    
   Disp_Digit[6] = TextString[1] - '0';

   // write to chip
    
   SCK = 0;
   wait_us(DT);    
    
   for(digit = 7; digit <9; digit++)
   {
      // each stream consists of digit address and data to show
      data_to_send = digit;
      data_to_send<<=8;
      data_to_send = data_to_send | Disp_Digit[digit-1];
      sendDataToDisplay(data_to_send);
   }
    
   return;
}

void LED7segDisplay::sendDataToDisplay(uint16_t data_to_send)
{
   CS1 = 0;
   for(uint16_t mask = 0x8000; mask!= 0; mask>>= 1)
   {
      wait_us(DT);
      SCK = 0;
      if(mask & data_to_send)
         MOSI = 1;
      else
         MOSI = 0;
                
      wait_us(DT);
      SCK = 1;
   }
        
   wait_us(DT);    
   SCK = 0;
   wait_us(DT);
   CS1 = 1;
}