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