matrix_1.c


1
/****************************************************************************
2
3
                LCD mit ATMEGA48
4
5
      Andreas Weschenfelder
6
      22.07.06
7
      
8
      Ansteuerung der 8x8 Matrix
9
      ueber SPI
10
      CS-Ansteuerung mit MAX7219 nicht moeglich
11
      
12
      Taktfrequenz 12Mhz
13
       
14
*****************************************************************************/
15
16
17
#include <math.h>
18
#include <avr/io.h>
19
#include <avr/delay.h>
20
#include <stdlib.h>
21
#include <avr/interrupt.h> 
22
#include <avr/signal.h>
23
#include <inttypes.h>
24
#include <compat/twi.h>
25
#include <ctype.h>
26
#include <string.h>
27
#include <avr/pgmspace.h>
28
29
#define MATRIX_DDR    DDRB  //Port an dem das Display angeschlossen wurde
30
#define MATRIX_PORT    PORTB
31
#define MATRIX_REG    PINB
32
#define MATRIX_LOAD    PB0
33
#define MATRIX_MOSI    PB3    //-> Display Data In
34
#define MATRIX_MISO    PB4    //Wird nicht benotigt
35
#define MATRIX_CLK    PB5
36
#define SPI_DDR      DDRB  //SPI-Port
37
#define SPI_PORT    PORTB
38
#define SPI_REG      PINB
39
#define SPI_MOSI    PB3    
40
#define SPI_MISO    PB4    
41
#define SPI_CLK      PB5
42
#define SPI_CS      PB2    // Master oder Slave-Modus
43
44
45
//Adressen
46
#define ADRESS_NO_OP    0x00
47
#define ADRESS_DIGIT_0    0x01    //
48
#define ADRESS_DIGIT_1    0x02    //
49
#define ADRESS_DIGIT_2    0x03    //
50
#define ADRESS_DIGIT_3    0x04    //
51
#define ADRESS_DIGIT_4    0x05    //Digitalanzeigen, gemultiplexed
52
#define ADRESS_DIGIT_5    0x06    //
53
#define ADRESS_DIGIT_6    0x07    //
54
#define ADRESS_DIGIT_7    0x08    //
55
#define ADRESS_DEC_MODE    0x09    //BCD-Wandlung
56
#define ADRESS_INTENSITY  0x0A    //Intensitaet Licht
57
#define ADRESS_SCAN_LIMIT  0x0B    //Wieviele Segemente sind angeschlossen
58
#define ADRESS_SHUTDOWN_MOD  0x0C    //Shut-Down-Mode  -> Stromsparmodus
59
#define ADRESS_DISP_TEST  0x0F    //Test-Mode
60
//Daten
61
#define DATA_SHUT_DOWN_ON  0x00
62
#define DATA_SHUT_DOWN_OFF  0x01
63
#define DATA_NO_DECODE    0x00
64
#define DATA_ALL_DECODE    0xFF
65
66
//Baudrate Generieren
67
#define    XTAL    12.0e6
68
#define    BAUD  9600
69
#define bauddivider (unsigned int)(XTAL / BAUD / 16 - 0.5)
70
71
72
//Prototypes-UART
73
void USART_Init(void);
74
void putchar( char c );
75
void puts( char *s );
76
77
78
//Prototypes - serielles Display
79
void SPI_master_init(void);
80
void SPI_Master_Transmit(char tmp_data);
81
void matrix(int tmp_adress, int tmp_data);
82
83
84
85
int main(void)
86
{
87
//UART Initialisieren
88
USART_Init();
89
//UART-Start-Ausgabe
90
puts( "\n\r8x8-Matrix mit MAX7219 ueber ATMEGA48 via SPI ansteuern!\n\r" );
91
92
93
//Initzialisierung SPI
94
SPI_master_init();
95
96
//LOAD muss Low sein sein - Bei Steigender Flanke wird der 16-Bit-Befehl eingelatcht
97
MATRIX_DDR |= (1<<MATRIX_LOAD);
98
MATRIX_PORT &= ~(1<<MATRIX_LOAD);
99
100
//Initialisieren des Displays
101
matrix(ADRESS_SHUTDOWN_MOD, DATA_SHUT_DOWN_OFF);      //Matrix aufwecken
102
matrix(ADRESS_DEC_MODE, DATA_NO_DECODE);          //Alle Anzeigen in BCD-Codierung
103
matrix(ADRESS_INTENSITY, 0x04);                //intensity    17/32
104
matrix(ADRESS_SCAN_LIMIT, 0x07);              //scan limit all digits
105
106
//Display aus
107
matrix(ADRESS_DIGIT_0, 0x00);
108
matrix(ADRESS_DIGIT_1, 0x00);
109
matrix(ADRESS_DIGIT_2, 0x00);
110
matrix(ADRESS_DIGIT_3, 0x00);
111
matrix(ADRESS_DIGIT_4, 0x00);
112
matrix(ADRESS_DIGIT_5, 0x00);
113
matrix(ADRESS_DIGIT_6, 0x00);
114
matrix(ADRESS_DIGIT_7, 0x00);
115
116
while(1)
117
  {
118
  
119
  }
120
  
121
return 0;
122
}
123
124
125
void SPI_master_init(void)
126
{
127
//MOSI, CLOCK, CS als Output, Rest als Input
128
SPI_DDR = (1<<SPI_MOSI)|(1<<SPI_CLK)|(1<<SPI_CS);
129
130
//Enable SPI, Master, CLK=f/16
131
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
132
}
133
134
void SPI_Master_Transmit(char tmp_data)
135
{
136
SPDR = tmp_data;
137
while(!(SPSR & (1<<SPIF)));
138
}
139
140
void matrix(int tmp_adress, int tmp_data)
141
{
142
MATRIX_PORT |= (1<<MATRIX_LOAD);
143
_delay_us(10);
144
145
SPI_Master_Transmit(tmp_adress);
146
SPI_Master_Transmit(tmp_data);
147
148
MATRIX_PORT &= ~(1<<MATRIX_LOAD);
149
MATRIX_PORT |= (1<<MATRIX_LOAD);
150
}
151
152
153
//UART_Initialisierung
154
void USART_Init(void)
155
{
156
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);            //Enable receiver and transmitter
157
UCSR0C |= (3<<UCSZ00);                  // Set frame format: 8data, 1Stopbit
158
UBRR0H = 0x00;                      // Set baud rate => 9600 baud @ 4 MHz; Tabellenwert
159
UBRR0L = 75;    
160
}
161
162
//UART_Schreiben
163
void puts( char *s )
164
{
165
  while( *s )
166
    putchar( *s++ );
167
}
168
169
void putchar( char c )
170
{
171
  while( (UCSR0A & 1<<UDRE0) == 0 );
172
  UDR0 = c;
173
}