Advertisement
Guest User

carlhako

a guest
Mar 23rd, 2010
499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. /*
  2.  MAXIM 7219 Library
  3.  Carl Hakanson
  4.  carlhako.gmail.com
  5.  21/02/2010
  6.  
  7.  Tested @ 14mhz if your running below 10mhz you can remove the 1ms delays
  8.  If you change from PBx to PDx for eg do search and replace all DDRB and PORTB
  9.  with DDRD and PORTD. That and the below definitions should be the only part
  10.  to change.
  11.  
  12. Segments
  13. --------
  14.  A
  15. F B
  16.  G
  17. E C
  18.  D
  19.  
  20. */
  21. //send16(dig,(A+F+E+D));
  22.  
  23.  
  24.  
  25.  
  26. #define DIN  PB1
  27. #define CLK  PB2
  28. #define LOAD  PB3
  29.  
  30. #define A 64
  31. #define B 32
  32. #define C 16
  33. #define D 8
  34. #define E 4
  35. #define F 2
  36. #define G 1
  37.  
  38. void max7219_init() {
  39.     DDRB |= ( (1<< CLK) | (1<< DIN) | (1<< LOAD) ); // set all pins to output
  40.    
  41.     send16(0x0C,0x01); // send power on
  42.    
  43.     send16(0x09,0x00); // send decode mode
  44.    
  45.     send16(0x0B,0x04); // send scan limit
  46.    
  47.     send16(0x0A,0x08); // send intensity
  48.    
  49.     send16(0x0F,0x00); // send test off
  50.    
  51.     send16(0x01,0x08); // send digit 0 - 8 
  52. }
  53.  
  54. void send16(unsigned char first_b, unsigned char second_b)  //writes the W_Byte to the DS1302
  55. {
  56.     DDRB |= ( (1<< CLK) | (1<< DIN) | (1<< LOAD) );
  57.     PORTB &= ~( (1<< CLK) | (1<< DIN) | (1<< LOAD) ); // set all pins to low
  58.     unsigned char i;
  59.  
  60.     for(i = 0; i < 8; i++) // send first 8 bits
  61.     {
  62.         PORTB &= ~(1<<CLK); // CLK low
  63.         PORTB &= ~(1<<DIN); // DIN low
  64.         if(first_b &0x80) // compare bit 7, if high set DIN to high
  65.         {
  66.             PORTB |= (1<<DIN); // set DIN to high
  67.         } else
  68.         delay_ms(1);
  69.         PORTB |= (1<<CLK); // CLK high
  70.         first_b <<=1; // shift bits along 1
  71.     }
  72.    
  73.     for(i = 0; i < 8; i++) // send second 8 bits
  74.     {
  75.         PORTB &= ~(1<<CLK);
  76.         PORTB &= ~(1<<DIN);
  77.         if(second_b &0x80) // compare bit 7, if high set DIN to high
  78.         {
  79.             PORTB |= (1<<DIN); // set DIN to high
  80.         }
  81.         delay_ms(1);
  82.         PORTB |= (1<<CLK); // pulse CLK
  83.         second_b <<=1; // shift bits along 1
  84.     }
  85.  
  86.     PORTB |= (1<<LOAD);
  87. }
  88.  
  89.  
  90. void display(uint8_t dig,uint8_t num) {
  91.     char DP;
  92.     printf_P(PSTR("b4 if: %u \r\n"), DP);
  93.     if (num > 127) {
  94.         DP = 128;
  95.         num &= ~(1<<7);
  96.     } else DP = 0;
  97.     printf_P(PSTR("after if: %u \r\n"), DP);
  98.     switch(num) { // switch pins to output based on variable num
  99.         case 0:
  100.             send16(dig,(DP+A+B+C+D+E+F));
  101.             break;
  102.        
  103.         case 1:
  104.             send16(dig,(DP+B+C));
  105.             break;
  106.            
  107.         case 2:
  108.             send16(dig,(DP+A+B+D+E+G));
  109.             break;
  110.            
  111.         case 3:
  112.             send16(dig,(DP+A+B+C+D+G));
  113.             break;
  114.            
  115.         case 4:
  116.             send16(dig,(DP+B+C+F+G));
  117.             break;
  118.        
  119.         case 5:
  120.             send16(dig,(DP+A+C+D+F+G));
  121.             break;
  122.            
  123.         case 6:
  124.             send16(dig,(DP+A+C+D+E+F+G));
  125.             break;
  126.            
  127.         case 7:
  128.             send16(dig,(DP+A+B+C));
  129.             break;
  130.            
  131.         case 8:
  132.             send16(dig,(DP+A+B+C+D+E+F+G));
  133.             break;
  134.    
  135.         case 9:
  136.             send16(dig,(DP+A+B+C+D+F+G));
  137.             break;
  138.            
  139.         case 11: // A
  140.             send16(dig,(A+F+G+E+D));
  141.             break;
  142.            
  143.         case 13:
  144.             send16(dig,(A+F+E+D));
  145.             break;
  146.            
  147.         case 15: // E
  148.             send16(dig,(A+F+G+E+D));
  149.             break;
  150.            
  151.         case 29: // S
  152.             send16(dig,(A+F+G+C+D));
  153.             break;
  154.            
  155.         case 30: // T
  156.             send16(dig,(A+F+E));
  157.             break;
  158.            
  159.         case 37:
  160.             send16(dig,(A+F+G+B));
  161.             break;
  162.            
  163.         case 100:
  164.             send16(dig,0);
  165.             break;
  166.        
  167.        
  168.         default: // if invalid number is passed to function E is displayed.
  169.         send16(dig,(A+F+G+E+D));
  170.         break;
  171.        
  172.     }
  173.    
  174.  
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement