Subversion Repositories idreammicro-avr

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
68 jlesech 1
/**************************************************************************//**
2
 * \brief MAX7219 library
3
 * \author Copyright (C) 2011  Julien Le Sech - www.idreammicro.com
4
 * \version 1.0
5
 * \date 20110908
6
 *
7
 * This file is part of the iDreamMicro library.
8
 *
9
 * This library is free software: you can redistribute it and/or modify it under
10
 * the terms of the GNU Lesser General Public License as published by the Free
11
 * Software Foundation, either version 3 of the License, or (at your option) any
12
 * later version.
13
 *
14
 * This library is distributed in the hope that it will be useful, but WITHOUT
15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17
 * details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public License
20
 * along with this program. If not, see http://www.gnu.org/licenses/
21
 ******************************************************************************/
22
 
23
/**************************************************************************//**
24
 * \file max7219.c
25
 ******************************************************************************/
26
 
27
/******************************************************************************
28
 * Header file inclusions.
29
 ******************************************************************************/
30
 
31
#include "../max7219.h"
32
 
33
#include <digital_io/digital_io.h>
34
#include <spi/spi.h>
35
 
36
#include <util/delay.h>
37
 
38
#include <stdbool.h>
39
#include <stdint.h>
40
 
41
/******************************************************************************
42
 * Private macros.
43
 ******************************************************************************/
44
 
45
#define REG_NO_OP           0x00
46
#define REG_DIGIT_0         0x01
47
#define REG_DIGIT_1         0x02
48
#define REG_DIGIT_2         0x03
49
#define REG_DIGIT_3         0x04
50
#define REG_DIGIT_4         0x05
51
#define REG_DIGIT_5         0x06
52
#define REG_DIGIT_6         0x07
53
#define REG_DIGIT_7         0x08
54
#define REG_DECODE_MODE     0x09
55
#define REG_INTENSITY       0x0A
56
#define REG_SCAN_LIMIT      0x0B
57
#define REG_SHUTDOWN        0x0C
58
#define REG_DISPLAY_TEST    0x0F
59
 
60
/******************************************************************************
61
 * Private constants.
62
 ******************************************************************************/
63
 
64
static const digital_io__pin_position_t chip_select_pin =
65
    DIGITAL_IO__PORT_B | DIGITAL_IO__PIN_2;
66
 
67
/******************************************************************************
68
 * Private function prototypes.
69
 ******************************************************************************/
70
 
71
/**************************************************************************//**
72
 * \fn void max7219__write(uint8_t address, uin8_t value)
73
 *
74
 * \brief Write value into MAX7219 register.
75
 *
76
 * \param       address Register address.
77
 * \param       value   Value to write.
78
 ******************************************************************************/
79
void
80
max7219__write
81
(
82
    uint8_t address,
83
    uint8_t value
84
);
85
 
86
/******************************************************************************
87
 * Public function definitions.
88
 ******************************************************************************/
89
 
90
/**************************************************************************//**
91
 * \fn void max7219__initialize(void)
92
 *
93
 * \brief Initialize SPI to drive MAX7219.
94
 ******************************************************************************/
95
void
96
max7219__initialize
97
(
98
    void
99
){
100
    // Configure chip select pin as output.
101
    digital_io__configure_pin(chip_select_pin, DIGITAL_IO__DIRECTION__OUTPUT);
102
    digital_io__set_pin_level(chip_select_pin, DIGITAL_IO__LEVEL__HIGH);
103
 
104
    // Wait a little to allow MAX7219 to see a correct logic level on CS pin.
105
    _delay_ms(2);
106
 
107
    // Configure SPI.
108
    spi_master__initialize();
109
    spi__set_data_order(SPI__DATA_ORDER__MSB_FIRST);
110
    spi__set_data_mode(SPI__DATA_MODE_0);
111
    spi__set_clock_rate(SPI__CLOCK_RATE__FOSC_OVER_4);
112
}
113
 
114
/**************************************************************************//**
115
 * \fn void max7219__set_decode_mode(max7219__decode_mode_t mode)
116
 *
117
 * \brief Set MAX7219 decode mode.
118
 *
119
 * \param       mode    Decode mode to set.
120
 ******************************************************************************/
121
void
122
max7219__set_decode_mode
123
(
124
    max7219__decode_mode_t  mode
125
){
126
    max7219__write(REG_DECODE_MODE, mode);
127
}
128
 
129
/**************************************************************************//**
130
 * \fn void max7219__set_intensity(max7219__intensity_t intensity)
131
 *
132
 * \brief Set MAX7219 intensity.
133
 *
134
 * \param       intensity       Intensity to set.
135
 ******************************************************************************/
136
void
137
max7219__set_intensity
138
(
139
    max7219__intensity_t    intensity
140
){
141
    max7219__write(REG_INTENSITY, intensity);
142
}
143
 
144
/**************************************************************************//**
145
 * \fn void max7219__set_scan_limit(max7219__scan_limit_t limit)
146
 *
147
 * \brief Set MAX7219 scan limit.
148
 *
149
 * \param       limit   Scan limit to set.
150
 ******************************************************************************/
151
void
152
max7219__set_scan_limit
153
(
154
    max7219__scan_limit_t   limit
155
){
156
    max7219__write(REG_SCAN_LIMIT, limit);
157
}
158
 
159
/**************************************************************************//**
160
 * \fn void max7219__set_shutdown_mode(max7219__shutdown_mode_t mode)
161
 *
162
 * \brief Set MAX7219 shutdown mode.
163
 *
164
 * \param       mode    Shutdown mode to set.
165
 ******************************************************************************/
166
void
167
max7219__set_shutdown_mode
168
(
169
    max7219__shutdown_mode_t    mode
170
){
171
    max7219__write(REG_SHUTDOWN, mode);
172
}
173
 
174
/**************************************************************************//**
175
 * \fn void max7219__set_display_test_mode(max7219__display_test_mode_t mode)
176
 *
177
 * \brief Set MAX7219 display test mode.
178
 *
179
 * \param       mode    Display test mode to set.
180
 *****************************************************************************/
181
void
182
max7219__set_display_test_mode
183
(
184
    max7219__display_test_mode_t    mode
185
){
186
    max7219__write(REG_DISPLAY_TEST, mode);
187
}
188
 
189
/**************************************************************************//**
190
 * \fn void max7219__write_char_on_digit(
191
 * max7219__digit_t     digit,
192
 * max7219__character_t character,
193
 * bool                 decimal_point)
194
 *
195
 * \brief Write character on digit.
196
 *
197
 * \param       digit               Digit to write.
198
 * \param       character           Character to write.
199
 * \param   decimal_point   Display decimal point.
200
 ******************************************************************************/
201
void
202
max7219__write_char_on_digit
203
(
204
    max7219__digit_t        digit,
205
    max7219__character_t    character,
206
    bool                    decimal_point
207
){
208
    uint8_t value = character;
209
    if (decimal_point)
210
    {
211
        // If decimal point must be switched on.
212
        value |= max7219__segment__DP;
213
    }
214
    max7219__write(digit, value);
215
}
216
 
217
/**************************************************************************//**
218
 * \fn void max7219__write_segments_on_digit(
219
 * max7219__digit_t     digit,
220
 * max7219__segment_t   segments)
221
 *
222
 * \brief Set segment(s) on digit.
223
 *
224
 * \param       digit   Digit to write.
225
 * \param       segment Segment(s) to set.
226
 ******************************************************************************/
227
void
228
max7219__write_segments_on_digit
229
(
230
    max7219__digit_t    digit,
231
    max7219__segment_t  segments
232
){
233
    max7219__write(digit, segments);
234
}
235
 
236
/******************************************************************************
237
 * Private function definitions.
238
 ******************************************************************************/
239
 
240
/**************************************************************************//**
241
 * \fn void max7219__write(uint8_t address, uint8_t value)
242
 *
243
 * \brief Write value into MAX7219 register.
244
 *
245
 * \param       address Register address.
246
 * \param       value   Value to write.
247
 ******************************************************************************/
248
void
249
max7219__write
250
(
251
    uint8_t address,
252
    uint8_t value
253
){
254
    // Reset chip select pin to select the device.
255
    digital_io__set_pin_level(chip_select_pin, DIGITAL_IO__LEVEL__LOW);
256
 
257
    // tcss
258
    _delay_ms(1);
259
 
260
    // Transmit data to the device, register address and value.
261
    spi_master__transmit(address);
262
    spi_master__transmit(value);
263
 
264
    // Set chip select pin to valid data onto the device.
265
    digital_io__set_pin_level(chip_select_pin, DIGITAL_IO__LEVEL__HIGH);
266
 
267
    // tcsw
268
    _delay_ms(1);
269
}