summaryrefslogtreecommitdiff
path: root/max7219.c
diff options
context:
space:
mode:
Diffstat (limited to 'max7219.c')
-rw-r--r--max7219.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/max7219.c b/max7219.c
new file mode 100644
index 0000000..a1e0da3
--- /dev/null
+++ b/max7219.c
@@ -0,0 +1,133 @@
+/************************************************************************/
+/* */
+/* 7 Segment Driver MAX7219 */
+/* Common Anode Display */
+/* */
+/* Author: Peter Dannegger */
+/* danni@specs.de */
+/* */
+/************************************************************************/
+
+#include "main.h"
+#include "max7219.h"
+
+u8 brightness = 5;
+
+u8 code digits[] = { DIGITS };
+
+u8 displaymem[8] = { CHAR_SPACE, // 8 digits, msb first
+ CHAR_SPACE,
+ CHAR_SPACE,
+ CHAR_SPACE,
+ CHAR_SPACE,
+ CHAR_SPACE,
+ CHAR_SPACE,
+ CHAR_SPACE };
+
+u8 code charset[] = { // Definition Character Set
+ _A+_B+_C+_D+_E+_F , // CHAR_0
+ _B+_C , // CHAR_1
+ _A+_B+ _D+_E+ _G, // CHAR_2
+ _A+_B+_C+_D+ _G, // CHAR_3
+ _B+_C+ _F+_G, // CHAR_4
+ _A+ _C+_D+ _F+_G, // CHAR_5
+ _A+ _C+_D+_E+_F+_G, // CHAR_6
+ _A+_B+_C , // CHAR_7
+ _A+_B+_C+_D+_E+_F+_G, // CHAR_8
+ _A+_B+_C+_D +_F+_G, // CHAR_9
+ _A+_B+_C+ _E+_F+_G, // CHAR_A
+ _C+_D+_E+_F+_G, // CHAR_b
+ _D+_E+ _G, // CHAR_c ;'c'
+ _B+_C+_D+_E+ _G, // CHAR_d
+ _A+ _D+_E+_F+_G, // CHAR_E
+ _A+ _E+_F+_G, // CHAR_F
+ 0 , // 16 = SPACE
+ _G, // 17 = MINUS
+ _A+_B+ _F+_G, // 18 = GRAD
+ _A+ _D+_E+_F , // 19 = CHAR_C2 ;'C'
+ _E+ _G, // 20 = CHAR_r
+ _C+_D+_E+ _G, // 21 = CHAR_o
+ _B+_C+ _E+_F+_G, // 22 = H
+ _D+_E+_F , // 23 = L
+ _D , // 24 = _
+ _A , // 25 = upper "-"
+ _A+_B+ _E+_F+_G, // CHAR_P
+ _B+_C+_D+_E+_F , // CHAR_U
+ _A+_B+_C+ _E+_F // CHAR_M
+ };
+
+
+void display_write( u16 dc )
+{
+ u8 i;
+
+ MAX7219_DDR |= 1<<MAX7219_DO;
+ MAX7219_DDR |= 1<<MAX7219_SCK;
+ MAX7219_DDR |= 1<<MAX7219_STB;
+ MAX7219_PORT &= ~(1<<MAX7219_STB);
+
+ for( i = 12; i; i-- ){
+ MAX7219_PORT &= ~(1<<MAX7219_SCK);
+ MAX7219_PORT |= 1<<MAX7219_DO;
+ if( (dc & 0x0800) == 0 )
+ MAX7219_PORT &= ~(1<<MAX7219_DO);
+ dc <<= 1;
+ MAX7219_PORT |= 1<<MAX7219_SCK;
+ }
+
+ MAX7219_PORT |= 1<<MAX7219_STB;
+}
+
+
+void display_out( void )
+{
+ u8 * dptr;
+ u8 i, j, byte;
+
+ display_write( 0xC01 );
+
+ dptr = displaymem;
+ for( i = 8; i; i-- ){
+ j = LPM(charset + (*dptr & 0x3F)); // convert to 7-segment
+ if( *dptr & 0x80 )
+ j |= _DP; // set decimal point
+ *dptr++ = j;
+ }
+
+ for( i = 8; i; i-- ){ // for all segments
+ dptr = displaymem;
+ byte = 0;
+ for( j = 8; j; j-- ){ // collect all digits
+ if( *dptr & 1 )
+ byte |= LPM(digits+j-1); // digit order mask
+ *dptr >>= 1; // next segment
+ dptr++;
+ }
+ display_write( byte + i * 256); // output same segments
+ }
+}
+
+
+void display_clear( void )
+{
+ u8 i;
+
+ for( i = 8; i; i--)
+ displaymem[i-1] = CHAR_SPACE;
+}
+
+
+void display_init( void )
+{
+ display_write( 0xF00 ); // Testmode off
+ display_write( 0x900 ); // Decode off
+ display_write( 0xB07 ); // 8 Digits
+ display_write( 0xC01 ); // Display on
+ display_write( 0xA00 | brightness ); // Brightness
+}
+
+
+void display_off( void )
+{
+ display_write( 0xC00 );
+}