Grzegorz Kaczmarek
/
Max7221
Fix to have load pin working with SPI1.
Fork of Max7221 by
Max7221.cpp@7:a160cb7cdd86, 2015-11-23 (annotated)
- Committer:
- ky3orr
- Date:
- Mon Nov 23 11:28:44 2015 +0000
- Revision:
- 7:a160cb7cdd86
- Parent:
- 6:191569a26f50
- Child:
- 8:3f5901f2f813
Code refactored to have MAX7219/7221 driver only with SPI chain support.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jakowisp | 2:828c62cc1861 | 1 | /** |
jakowisp | 2:828c62cc1861 | 2 | * @file Max7221.cpp |
ky3orr | 7:a160cb7cdd86 | 3 | * @brief MAX7219/7221 driver class. |
jakowisp | 2:828c62cc1861 | 4 | * |
ky3orr | 7:a160cb7cdd86 | 5 | * @author Grzegorz Kaczmarek |
ky3orr | 7:a160cb7cdd86 | 6 | * @comment Code inspired on erlier Dwayne S. Dilbeck's work |
ky3orr | 7:a160cb7cdd86 | 7 | * @date 20/11/2015 |
jakowisp | 2:828c62cc1861 | 8 | */ |
ky3orr | 7:a160cb7cdd86 | 9 | |
jakowisp | 1:d8589d1f368c | 10 | #include "mbed.h" |
jakowisp | 1:d8589d1f368c | 11 | #include "Max7221.h" |
jakowisp | 1:d8589d1f368c | 12 | |
ky3orr | 7:a160cb7cdd86 | 13 | Max7221::Max7221(SPI *spi, DigitalOut *cs, unsigned int position) : |
ky3orr | 7:a160cb7cdd86 | 14 | mp_spi(spi), |
ky3orr | 7:a160cb7cdd86 | 15 | mp_cs(cs), |
ky3orr | 7:a160cb7cdd86 | 16 | m_position(position) |
ky3orr | 7:a160cb7cdd86 | 17 | { |
jakowisp | 1:d8589d1f368c | 18 | } |
jakowisp | 1:d8589d1f368c | 19 | |
ky3orr | 7:a160cb7cdd86 | 20 | void Max7221::CsLow() |
ky3orr | 7:a160cb7cdd86 | 21 | { |
ky3orr | 7:a160cb7cdd86 | 22 | if(mp_cs != NULL) { |
ky3orr | 7:a160cb7cdd86 | 23 | *mp_cs = LOG_0; |
jakowisp | 1:d8589d1f368c | 24 | } |
jakowisp | 1:d8589d1f368c | 25 | } |
jakowisp | 1:d8589d1f368c | 26 | |
ky3orr | 7:a160cb7cdd86 | 27 | void Max7221::CsHigh() |
ky3orr | 7:a160cb7cdd86 | 28 | { |
ky3orr | 7:a160cb7cdd86 | 29 | if(mp_cs != NULL) { |
ky3orr | 7:a160cb7cdd86 | 30 | *mp_cs = LOG_1; |
jakowisp | 1:d8589d1f368c | 31 | } |
jakowisp | 1:d8589d1f368c | 32 | } |
jakowisp | 1:d8589d1f368c | 33 | |
ky3orr | 7:a160cb7cdd86 | 34 | void Max7221::WriteRaw(unsigned int reg, unsigned int data) { |
ky3orr | 7:a160cb7cdd86 | 35 | if(mp_spi != NULL) { |
ky3orr | 7:a160cb7cdd86 | 36 | mp_spi->write(reg); |
ky3orr | 7:a160cb7cdd86 | 37 | mp_spi->write(data); |
jakowisp | 1:d8589d1f368c | 38 | } |
jakowisp | 1:d8589d1f368c | 39 | } |
ky3orr | 7:a160cb7cdd86 | 40 | |
ky3orr | 7:a160cb7cdd86 | 41 | void Max7221::Write(unsigned int reg, unsigned int data) { |
ky3orr | 7:a160cb7cdd86 | 42 | unsigned int i; |
ky3orr | 7:a160cb7cdd86 | 43 | |
ky3orr | 7:a160cb7cdd86 | 44 | CsLow(); |
ky3orr | 7:a160cb7cdd86 | 45 | WriteRaw(reg, data); |
ky3orr | 7:a160cb7cdd86 | 46 | if(m_position > 0) { |
ky3orr | 7:a160cb7cdd86 | 47 | i = m_position; |
ky3orr | 7:a160cb7cdd86 | 48 | while(i--) { |
ky3orr | 7:a160cb7cdd86 | 49 | WriteRaw(max7219_reg_noop, 0x0); |
ky3orr | 7:a160cb7cdd86 | 50 | } |
ky3orr | 7:a160cb7cdd86 | 51 | } |
ky3orr | 7:a160cb7cdd86 | 52 | CsHigh(); |
ky3orr | 7:a160cb7cdd86 | 53 | } |
ky3orr | 7:a160cb7cdd86 | 54 | |
ky3orr | 7:a160cb7cdd86 | 55 | void Max7221::TestMode(bool mode) { |
ky3orr | 7:a160cb7cdd86 | 56 | if(mode) { |
ky3orr | 7:a160cb7cdd86 | 57 | Write(max7219_reg_displayTest, 0x01); |
ky3orr | 7:a160cb7cdd86 | 58 | } else { |
ky3orr | 7:a160cb7cdd86 | 59 | Write(max7219_reg_displayTest, 0x00); |
ky3orr | 7:a160cb7cdd86 | 60 | } |
ky3orr | 7:a160cb7cdd86 | 61 | } |
ky3orr | 7:a160cb7cdd86 | 62 | |
ky3orr | 7:a160cb7cdd86 | 63 | void Max7221::UseDigitsNo(unsigned int digits_no) { |
ky3orr | 7:a160cb7cdd86 | 64 | if((digits_no > 0) && (digits_no < 9)) { |
ky3orr | 7:a160cb7cdd86 | 65 | Write(max7219_reg_scanLimit, (digits_no - 1)); |
ky3orr | 7:a160cb7cdd86 | 66 | } |
ky3orr | 7:a160cb7cdd86 | 67 | } |
ky3orr | 7:a160cb7cdd86 | 68 | |
ky3orr | 7:a160cb7cdd86 | 69 | void Max7221::DecodeMode(unsigned int mode) { |
ky3orr | 7:a160cb7cdd86 | 70 | Write(max7219_reg_decodeMode, mode); |
jakowisp | 1:d8589d1f368c | 71 | } |
jakowisp | 1:d8589d1f368c | 72 | |
ky3orr | 7:a160cb7cdd86 | 73 | void Max7221::WriteDigit(unsigned int digit_no, unsigned int value) { |
ky3orr | 7:a160cb7cdd86 | 74 | if(digit_no < 8) { |
ky3orr | 7:a160cb7cdd86 | 75 | Write(digit_no, value); |
ky3orr | 7:a160cb7cdd86 | 76 | } |
ky3orr | 7:a160cb7cdd86 | 77 | } |
jakowisp | 1:d8589d1f368c | 78 | |
ky3orr | 7:a160cb7cdd86 | 79 | void Max7221::Intensity(unsigned int intensity) { |
ky3orr | 7:a160cb7cdd86 | 80 | if(intensity > 0x0F) { |
ky3orr | 7:a160cb7cdd86 | 81 | intensity = 0x0F; |
ky3orr | 7:a160cb7cdd86 | 82 | } |
ky3orr | 7:a160cb7cdd86 | 83 | Write(max7219_reg_intensity, intensity); |
jakowisp | 1:d8589d1f368c | 84 | } |
jakowisp | 1:d8589d1f368c | 85 | |
ky3orr | 7:a160cb7cdd86 | 86 | void Max7221::OperationMode(bool mode) { |
ky3orr | 7:a160cb7cdd86 | 87 | if(mode) { |
ky3orr | 7:a160cb7cdd86 | 88 | Write(max7219_reg_shutdown, 0x01); |
ky3orr | 7:a160cb7cdd86 | 89 | } else { |
ky3orr | 7:a160cb7cdd86 | 90 | Write(max7219_reg_shutdown, 0x00); |
jakowisp | 1:d8589d1f368c | 91 | } |
jakowisp | 1:d8589d1f368c | 92 | } |
jakowisp | 2:828c62cc1861 | 93 | |
ky3orr | 7:a160cb7cdd86 | 94 | void Max7221::Setup () { |
ky3orr | 7:a160cb7cdd86 | 95 | unsigned int i; |
ky3orr | 7:a160cb7cdd86 | 96 | |
ky3orr | 7:a160cb7cdd86 | 97 | TestMode(false); // Disable display test |
ky3orr | 7:a160cb7cdd86 | 98 | UseDigitsNo(8); // Use all 8 digits |
ky3orr | 7:a160cb7cdd86 | 99 | DecodeMode(0xFF); // Turn on Code B font decode for all digits |
ky3orr | 7:a160cb7cdd86 | 100 | for(i=1;i<9;i++) { // Clean all digits |
ky3orr | 7:a160cb7cdd86 | 101 | WriteDigit(i, 0x0F); |
ky3orr | 7:a160cb7cdd86 | 102 | } |
ky3orr | 7:a160cb7cdd86 | 103 | Intensity(0x01); // Set lowest display intensity(0x00-0xFF) |
ky3orr | 7:a160cb7cdd86 | 104 | OperationMode(true); // Enable operation mode |
ky3orr | 7:a160cb7cdd86 | 105 | } |