1 | #define SPI_CLK PB5
|
2 | #define SPI_DATA PB3
|
3 |
|
4 | #define SPI_CLK_LOW() (PORTB &= ~(1<<PB5))
|
5 | #define SPI_CLK_HIGH() (PORTB |= (1<<PB5))
|
6 |
|
7 | #define SPI_DATA_LOW() (PORTB &= ~(1<<PB3))
|
8 | #define SPI_DATA_HIGH() (PORTB |= (1<<PB3))
|
9 |
|
10 | void display_plot(uint8_t x, uint8_t y)
|
11 | {
|
12 | // Set the x-axis area
|
13 | softspi_command(SET_COLUMN_ADDRESS);
|
14 | softspi_parameter(0x00);
|
15 | softspi_parameter(x);
|
16 | softspi_parameter(0x00);
|
17 | softspi_parameter(0x7F);
|
18 |
|
19 | // Set the y-axis area
|
20 | softspi_command(SET_PAGE_ADDRESS);
|
21 | softspi_parameter(0x00);
|
22 | softspi_parameter(y);
|
23 | softspi_parameter(0x00);
|
24 | softspi_parameter(0x7F);
|
25 |
|
26 | // Plot the point
|
27 | softspi_command(WRITE_MEMORY_START);
|
28 | softspi_parameter(100);
|
29 | softspi_parameter(50);
|
30 | }
|
31 |
|
32 | void display_init(void)
|
33 | {
|
34 | // Exit sleep mode, after this it needs a timeout to stabilize the circuit
|
35 | loop_ms(7);
|
36 | softspi_command(EXIT_SLEEP_MODE);
|
37 | loop_ms(7);
|
38 |
|
39 | softspi_command(SET_PIXEL_FORMAT);
|
40 | softspi_parameter(0x05);
|
41 |
|
42 | softspi_command(SET_GAMMA_CURVE);
|
43 | softspi_parameter(0x04);
|
44 |
|
45 | softspi_command(GAM_R_SEL);
|
46 | softspi_parameter(0x01);
|
47 |
|
48 | // Set the x-axis area
|
49 | softspi_command(SET_COLUMN_ADDRESS);
|
50 | softspi_parameter(0x00);
|
51 | softspi_parameter(0x00);
|
52 | softspi_parameter(0x00);
|
53 | softspi_parameter(0x7F);
|
54 |
|
55 | // Set the y-axis area
|
56 | softspi_command(SET_PAGE_ADDRESS);
|
57 | softspi_parameter(0x00);
|
58 | softspi_parameter(0x00);
|
59 | softspi_parameter(0x00);
|
60 | softspi_parameter(0x7F);
|
61 |
|
62 | // Select display orientation
|
63 | softspi_command(SET_ADDRESS_MODE);
|
64 | softspi_parameter(0x00);
|
65 |
|
66 | // Enable the display
|
67 | softspi_command(SET_DISPLAY_ON);
|
68 | softspi_command(WRITE_MEMORY_START);
|
69 | }
|
70 |
|
71 | void softspi_command(uint16_t data)
|
72 | {
|
73 | DDRB |= (1<<SPI_DATA);
|
74 | unsigned int i=0;
|
75 |
|
76 | // clear the D/CX bit, so that the controller take the byte as command byte
|
77 | data &= ~(1<<8);
|
78 |
|
79 | for (i=9;i>0;i--)
|
80 | {
|
81 |
|
82 | SPI_CLK_LOW(); //clock low
|
83 |
|
84 | if (data & 0x100) /* Wenn MSB-Bit gesetzt */
|
85 | {
|
86 | SPI_DATA_HIGH(); /* Data-Pin auf 1 schalten, */
|
87 | }
|
88 | else
|
89 | {
|
90 | SPI_DATA_LOW(); /* ansonsten auf 0 */
|
91 | }
|
92 | data = data << 1;
|
93 |
|
94 | SPI_CLK_HIGH(); //Clock bit rising edge
|
95 | }
|
96 |
|
97 | SPI_CLK_LOW(); //CS high, übertragung beendet
|
98 | }
|
99 |
|
100 |
|
101 | void softspi_parameter(uint16_t data)
|
102 | {
|
103 | uint8_t counter=0;
|
104 | DDRB |= (1<<SPI_DATA);
|
105 | // Set the D/CX bit so that the controller use the byte as parameter
|
106 | data |= (1<<8);
|
107 |
|
108 | for (counter=9;counter>0;counter--)
|
109 | {
|
110 |
|
111 | SPI_CLK_LOW(); //clock low
|
112 |
|
113 | if (data & 0x100) /* If MSB-Bit set */
|
114 | {
|
115 | SPI_DATA_HIGH(); /* Data-Pin on 1 */
|
116 | }
|
117 | else
|
118 | {
|
119 | SPI_DATA_LOW(); /* else 0 */
|
120 | }
|
121 | data = data << 1;
|
122 |
|
123 | SPI_CLK_HIGH(); //Clock bit rising edge
|
124 | }
|
125 |
|
126 | SPI_CLK_LOW(); //CS high, transmission finished
|
127 | }
|
128 |
|
129 | int main(void)
|
130 | {
|
131 | display_init();
|
132 | while(1)
|
133 | {
|
134 | display_plot(x,y);
|
135 | }
|
136 |
|
137 |
|
138 | }
|