Library to use MAX7219

Committer:
lucasmoraeseng
Date:
Sun Feb 28 21:54:51 2016 +0000
Revision:
0:cba98a2b97d2
Library to use MAX7219 with Leds

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lucasmoraeseng 0:cba98a2b97d2 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
lucasmoraeseng 0:cba98a2b97d2 2 *
lucasmoraeseng 0:cba98a2b97d2 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
lucasmoraeseng 0:cba98a2b97d2 4 * and associated documentation files (the "Software"), to deal in the Software without
lucasmoraeseng 0:cba98a2b97d2 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
lucasmoraeseng 0:cba98a2b97d2 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
lucasmoraeseng 0:cba98a2b97d2 7 * Software is furnished to do so, subject to the following conditions:
lucasmoraeseng 0:cba98a2b97d2 8 *
lucasmoraeseng 0:cba98a2b97d2 9 * The above copyright notice and this permission notice shall be included in all copies or
lucasmoraeseng 0:cba98a2b97d2 10 * substantial portions of the Software.
lucasmoraeseng 0:cba98a2b97d2 11 *
lucasmoraeseng 0:cba98a2b97d2 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
lucasmoraeseng 0:cba98a2b97d2 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
lucasmoraeseng 0:cba98a2b97d2 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
lucasmoraeseng 0:cba98a2b97d2 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
lucasmoraeseng 0:cba98a2b97d2 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
lucasmoraeseng 0:cba98a2b97d2 17 */
lucasmoraeseng 0:cba98a2b97d2 18
lucasmoraeseng 0:cba98a2b97d2 19 #include "MAX7219.h"
lucasmoraeseng 0:cba98a2b97d2 20
lucasmoraeseng 0:cba98a2b97d2 21 // define max7219 registers
lucasmoraeseng 0:cba98a2b97d2 22 #define max7219_reg_noop 0x00
lucasmoraeseng 0:cba98a2b97d2 23 #define max7219_reg_digit0 0x01
lucasmoraeseng 0:cba98a2b97d2 24 #define max7219_reg_digit1 0x02
lucasmoraeseng 0:cba98a2b97d2 25 #define max7219_reg_digit2 0x03
lucasmoraeseng 0:cba98a2b97d2 26 #define max7219_reg_digit3 0x04
lucasmoraeseng 0:cba98a2b97d2 27 #define max7219_reg_digit4 0x05
lucasmoraeseng 0:cba98a2b97d2 28 #define max7219_reg_digit5 0x06
lucasmoraeseng 0:cba98a2b97d2 29 #define max7219_reg_digit6 0x07
lucasmoraeseng 0:cba98a2b97d2 30 #define max7219_reg_digit7 0x08
lucasmoraeseng 0:cba98a2b97d2 31 #define max7219_reg_decodeMode 0x09
lucasmoraeseng 0:cba98a2b97d2 32 #define max7219_reg_intensity 0x0a
lucasmoraeseng 0:cba98a2b97d2 33 #define max7219_reg_scanLimit 0x0b
lucasmoraeseng 0:cba98a2b97d2 34 #define max7219_reg_shutdown 0x0c
lucasmoraeseng 0:cba98a2b97d2 35 #define max7219_reg_displayTest 0x0f
lucasmoraeseng 0:cba98a2b97d2 36
lucasmoraeseng 0:cba98a2b97d2 37 #define Max7219_Time 125
lucasmoraeseng 0:cba98a2b97d2 38
lucasmoraeseng 0:cba98a2b97d2 39 #ifndef MaxInUse
lucasmoraeseng 0:cba98a2b97d2 40 #define MaxInUse 1
lucasmoraeseng 0:cba98a2b97d2 41 #endif
lucasmoraeseng 0:cba98a2b97d2 42
lucasmoraeseng 0:cba98a2b97d2 43
lucasmoraeseng 0:cba98a2b97d2 44 DigitalOut DIN(PTA7);
lucasmoraeseng 0:cba98a2b97d2 45 DigitalOut CLK(PTB0);
lucasmoraeseng 0:cba98a2b97d2 46 DigitalOut LOAD(PTA5);
lucasmoraeseng 0:cba98a2b97d2 47
lucasmoraeseng 0:cba98a2b97d2 48 MAX7219::MAX7219() {
lucasmoraeseng 0:cba98a2b97d2 49 DIN=0;
lucasmoraeseng 0:cba98a2b97d2 50 CLK=0;
lucasmoraeseng 0:cba98a2b97d2 51 LOAD = 1;
lucasmoraeseng 0:cba98a2b97d2 52 }
lucasmoraeseng 0:cba98a2b97d2 53
lucasmoraeseng 0:cba98a2b97d2 54 MAX7219::~MAX7219() { }
lucasmoraeseng 0:cba98a2b97d2 55
lucasmoraeseng 0:cba98a2b97d2 56 void MAX7219::putByte(uint8_t data) {
lucasmoraeseng 0:cba98a2b97d2 57 uint8_t i = 8;
lucasmoraeseng 0:cba98a2b97d2 58 uint8_t mask;
lucasmoraeseng 0:cba98a2b97d2 59
lucasmoraeseng 0:cba98a2b97d2 60 while(i > 0) {
lucasmoraeseng 0:cba98a2b97d2 61 mask = 0x01 << (i - 1); // get bitmask
lucasmoraeseng 0:cba98a2b97d2 62 CLK = 0; // tick
lucasmoraeseng 0:cba98a2b97d2 63 if (data & mask){ // choose bit
lucasmoraeseng 0:cba98a2b97d2 64 DIN = 1; // send 1
lucasmoraeseng 0:cba98a2b97d2 65 }else{
lucasmoraeseng 0:cba98a2b97d2 66 DIN = 0; // send 0
lucasmoraeseng 0:cba98a2b97d2 67 }
lucasmoraeseng 0:cba98a2b97d2 68 CLK = 1; // tock
lucasmoraeseng 0:cba98a2b97d2 69 --i; // move to lesser bit
lucasmoraeseng 0:cba98a2b97d2 70 //wait_us(Max7219_Time);
lucasmoraeseng 0:cba98a2b97d2 71 }
lucasmoraeseng 0:cba98a2b97d2 72 }
lucasmoraeseng 0:cba98a2b97d2 73
lucasmoraeseng 0:cba98a2b97d2 74 void MAX7219::Init(uint8_t ND,uint8_t DM,uint8_t IN)
lucasmoraeseng 0:cba98a2b97d2 75 {
lucasmoraeseng 0:cba98a2b97d2 76 uint8_t e;
lucasmoraeseng 0:cba98a2b97d2 77 //initiation of the max 7219
lucasmoraeseng 0:cba98a2b97d2 78 maxAll(max7219_reg_scanLimit, ND);
lucasmoraeseng 0:cba98a2b97d2 79 maxAll(max7219_reg_decodeMode, DM); // using an led matrix (not digits)
lucasmoraeseng 0:cba98a2b97d2 80 maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode
lucasmoraeseng 0:cba98a2b97d2 81 maxAll(max7219_reg_displayTest, 0x00); // no display test
lucasmoraeseng 0:cba98a2b97d2 82 for (e=1; e<=8; e++) { // empty registers, turn all LEDs off
lucasmoraeseng 0:cba98a2b97d2 83 maxAll(e,0);
lucasmoraeseng 0:cba98a2b97d2 84 }
lucasmoraeseng 0:cba98a2b97d2 85 maxAll(max7219_reg_intensity, 0x0f & IN); // the first 0x0f is the value you can set
lucasmoraeseng 0:cba98a2b97d2 86 // range: 0x00 to 0x0f
lucasmoraeseng 0:cba98a2b97d2 87
lucasmoraeseng 0:cba98a2b97d2 88 }
lucasmoraeseng 0:cba98a2b97d2 89
lucasmoraeseng 0:cba98a2b97d2 90 void MAX7219::maxSingle( uint8_t reg, uint8_t col) {
lucasmoraeseng 0:cba98a2b97d2 91 //maxSingle is the "easy" function to use for a single max7219
lucasmoraeseng 0:cba98a2b97d2 92
lucasmoraeseng 0:cba98a2b97d2 93 LOAD = 0; // begin
lucasmoraeseng 0:cba98a2b97d2 94 putByte(reg); // specify register
lucasmoraeseng 0:cba98a2b97d2 95 putByte(col); // put data
lucasmoraeseng 0:cba98a2b97d2 96 LOAD = 0; // and load da stuff
lucasmoraeseng 0:cba98a2b97d2 97 LOAD = 1;
lucasmoraeseng 0:cba98a2b97d2 98 }
lucasmoraeseng 0:cba98a2b97d2 99
lucasmoraeseng 0:cba98a2b97d2 100 void MAX7219::maxAll(uint8_t reg, uint8_t col) { // initialize all MAX7219's in the system
lucasmoraeseng 0:cba98a2b97d2 101 uint8_t c = 0;
lucasmoraeseng 0:cba98a2b97d2 102 LOAD = 0; // begin
lucasmoraeseng 0:cba98a2b97d2 103 for ( c =1; c<= MaxInUse; c++) {
lucasmoraeseng 0:cba98a2b97d2 104 putByte(reg); // specify register
lucasmoraeseng 0:cba98a2b97d2 105 putByte(col); // put data
lucasmoraeseng 0:cba98a2b97d2 106 }
lucasmoraeseng 0:cba98a2b97d2 107 LOAD = 0;
lucasmoraeseng 0:cba98a2b97d2 108 LOAD = 1;
lucasmoraeseng 0:cba98a2b97d2 109 }
lucasmoraeseng 0:cba98a2b97d2 110
lucasmoraeseng 0:cba98a2b97d2 111 void MAX7219::maxOne(uint8_t maxNr, uint8_t reg, uint8_t col) {
lucasmoraeseng 0:cba98a2b97d2 112 //maxOne is for addressing different MAX7219's,
lucasmoraeseng 0:cba98a2b97d2 113 //while having a couple of them cascaded
lucasmoraeseng 0:cba98a2b97d2 114
lucasmoraeseng 0:cba98a2b97d2 115 uint8_t c = 0;
lucasmoraeseng 0:cba98a2b97d2 116 LOAD = 0; // begin
lucasmoraeseng 0:cba98a2b97d2 117
lucasmoraeseng 0:cba98a2b97d2 118 for ( c = MaxInUse; c > maxNr; c--) {
lucasmoraeseng 0:cba98a2b97d2 119 putByte(0); // means no operation
lucasmoraeseng 0:cba98a2b97d2 120 putByte(0); // means no operation
lucasmoraeseng 0:cba98a2b97d2 121 }
lucasmoraeseng 0:cba98a2b97d2 122
lucasmoraeseng 0:cba98a2b97d2 123 putByte(reg); // specify register
lucasmoraeseng 0:cba98a2b97d2 124 putByte(col);//((data & 0x01) * 256) + data >> 1); // put data
lucasmoraeseng 0:cba98a2b97d2 125
lucasmoraeseng 0:cba98a2b97d2 126 for ( c =maxNr-1; c >= 1; c--) {
lucasmoraeseng 0:cba98a2b97d2 127 putByte(0); // means no operation
lucasmoraeseng 0:cba98a2b97d2 128 putByte(0); // means no operation
lucasmoraeseng 0:cba98a2b97d2 129 }
lucasmoraeseng 0:cba98a2b97d2 130
lucasmoraeseng 0:cba98a2b97d2 131 LOAD = 0; // and load da stuff
lucasmoraeseng 0:cba98a2b97d2 132 LOAD = 1;
lucasmoraeseng 0:cba98a2b97d2 133 }
lucasmoraeseng 0:cba98a2b97d2 134
lucasmoraeseng 0:cba98a2b97d2 135 void MAX7219::Power(uint8_t Mode)
lucasmoraeseng 0:cba98a2b97d2 136 {
lucasmoraeseng 0:cba98a2b97d2 137 if(Mode>=1){
lucasmoraeseng 0:cba98a2b97d2 138 maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode
lucasmoraeseng 0:cba98a2b97d2 139 }
lucasmoraeseng 0:cba98a2b97d2 140 else{
lucasmoraeseng 0:cba98a2b97d2 141 maxAll(max7219_reg_shutdown, 0x00); // in shutdown mode
lucasmoraeseng 0:cba98a2b97d2 142 }
lucasmoraeseng 0:cba98a2b97d2 143 }
lucasmoraeseng 0:cba98a2b97d2 144
lucasmoraeseng 0:cba98a2b97d2 145
lucasmoraeseng 0:cba98a2b97d2 146