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