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 | }
|