Практическая работа №02 (буфер дисплея) / Valentin Gubarev

Для выполнения практической работы потребуется отладочная плата 1986EvBrd_48_Rev3.

В этой практической работе дан пример реализации драйвера дисплея и вывода текста на русском языке на экран, а так же организация вывода счётчика.

Проект состоит из восьми файлов. Один из них написан на языке ассемблер, остальные на языке си.

Описание файлов

В файле font_ansi_5x8.c представлен шрифт в кодировке ANSI. Каждый из символов представлен в виде 5 байт (5 на 8 бит). Благодаря последовательности расположения описания символов (в том числе букв) в порядке следования определённом в кодировке ANSI имеется возможность в программе писать тексты на русском языке в удобочитаемом виде.

В файле graphics.c размещены функции для вывода текста в буфер, очистки буфера и выгрузки буфера на дисплей.

Файл startup_1986be9x.s

1
2
3
4
5
	AREA    RESET, DATA, READONLY
	IMPORT 	main
	DCD     0x20008000      ; Вершина стека
	DCD     main            ; Выполнение программы main
	END

Файл structs.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef STRUCTS
#define STRUCTS

/* Определение структуры порта */
typedef struct {
    unsigned RXTX;
    unsigned OE;
    unsigned FUNC;
    unsigned DIGITAL;
    unsigned PULL;
    unsigned PD;
    unsigned PWR;
    unsigned GFEN;
}struct_ports;

#define A ((struct_ports *) 0x400A8000)
#define D ((struct_ports *) 0x400C0000)
#define F ((struct_ports *) 0x400E8000)

#endif

Файл driver_lcd.h

1
2
3
4
5
6
7
8
9
10
#ifndef DRIVER_LCD
#define DRIVER_LCD

#include "structs.h"

void LcdInit(void);
void LcdDispOn(void);
void LcdScreen(unsigned char screen[8][128]);

#endif //DRIVER_LCD

Файл font_ansi_5x8.h

1
2
3
4
5
6
#ifndef FONT_ANSI_5X8
#define FONT_ANSI_5X8

extern const unsigned char ansi[256][5];

#endif //FONT_ANSI_5X8

Файл graphics.h

1
2
3
4
5
6
7
#include "structs.h"
#include "driver_lcd.h"
#include "font_ansi_5x8.h"

void Print(unsigned row, unsigned col, char * byte);
void ClearScreen(void);
void ScreenUpdate(void);

Файл main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*----------------------------------------*/
/* Практическая работа 02 (буфер дисплея) */
/*----------------------------------------*/

#include "structs.h"
#include "driver_lcd.h"
#include "graphics.h"

void PortOut(struct_ports * port){
    port->OE      = 0xFF;       /* Выход                */
    port->FUNC    = 0x0000;     /* Порт                 */
    port->DIGITAL = 0xFF;       /* Цифровые             */
    port->PULL    = 0x00000000; /* Подтяжка отключена   */
    port->PD      = 0x00000000; /* Управляемый драйвер  */
    port->PWR     = 0xFFFF;     /* Фронт ~10 нс         */
    port->GFEN    = 0x0000;     /* Фильтрация отключена */
}

static void Delay(unsigned count){
  while(count--);
}

int main (void) {
    /* Включение тактирования порта F */
    *(unsigned *)(0x4002001C) |= (1<<29);
    PortOut(F);

    /* Включение тактирования порта D */
    *(unsigned *)(0x4002001C) |= (1<<24);
    PortOut(D);

    /* Включение тактирования порта A */
    *(unsigned *)(0x4002001C) |= (1<<21);
    PortOut(A);  

    LcdInit();
    LcdDispOn();
    ClearScreen();

    Print(0,5,"Привет, программист!");
    Print(2,0,"Это пример вывода    ");
    Print(3,0,"текста на LCD-дисплей");

    ScreenUpdate();

    Print(7,0,"Счет:");
    char str[2] = "00";
    for(int i = 35; i >= 0; --i){
        str[0] = '0' + i/10;
        str[1] = '0' + i%10;
        Print(7,36,str);
        ScreenUpdate();
        Delay(2000000);
    }

    ClearScreen();
    Print(3,25,"Нажмите RESET");
    Print(4,19,"для перезапуска");
    ScreenUpdate();

    return 0;
}

Файл driver_lcd.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "driver_lcd.h"

/* Обозначения в соответствии с описанием дисплея */
/* MT-12864Jv.1 МЭЛТ */
#define LCD_SET_COL 0x40
#define LCD_SET_ROW 0xB8

#define Pause /*Delay(5)*/
#define Pause2ms Delay(100)

#define LCD_MT_DB A->RXTX
#define LCD_MT_RW_off F->RXTX &= ~(1<<3)
#define LCD_MT_RW_on  F->RXTX |=  (1<<3)
#define LCD_MT_E
#define LCD_MT_RES
#define LCD_MT_A0_on  F->RXTX |=  (1<<4)
#define LCD_MT_A0_off F->RXTX &= ~(1<<4)
#define LCD_MT_E1 F->RXTX |= (F->RXTX & ~0x3) | 0x1
#define LCD_MT_E2 F->RXTX |= (F->RXTX & ~0x3) | 0x2
#define LCD_MT_E3 F->RXTX |= 0x3

/* Реализация функции задержки времени */
static void Delay(unsigned count){
  while(count--);
}

/* Строб для записи байта в дисплей */
static void Strob(void){
    Pause; /* Необходимая пауза */
    D->RXTX |=  (1<<3); /* Включаем  3 бит порта D */ // Set_Stb_Pin
    Pause; /* Необходимая пауза */
    D->RXTX &= ~(1<<3); /* Выключаем 3 бит порта D */ // Set_Stb_Pin
    Pause; /* Необходимая пауза */
}

/* Инициализация дисплея */
void LcdInit(void){
    F->RXTX &= ~(1<<2); /* Выключаем второй бит порта F */ // Clr_Res
    Pause2ms; /* Необходимая пауза */
    F->RXTX |=  (1<<2); /* Включаем 2 бит порта F */ // Set_Res
    LCD_MT_E3; /* Включаем 0 и 1 бит порта F */ // Set_E1_Pin
    LCD_MT_A0_off;
    LCD_MT_RW_on;
    Strob();
    LCD_MT_A0_off;
    LCD_MT_RW_off;
}

/* Включение дисплея */
void LcdDispOn(void){
    LCD_MT_A0_off;
    LCD_MT_RW_off;
    Pause; /* Необходимая пауза */
    A->RXTX |= 0x3F; /* Младшие 6 бит в 1 */
    Strob();
}

/* Выбор чипа */
static void SetChip(unsigned num_chip){
    F->RXTX &= ~(3<<0);
    F->RXTX |=  (1<<num_chip);
}

/* Выбор ряда */
static void SetRow(unsigned char row){
    LCD_MT_A0_off;
    LCD_MT_RW_off;
    A->RXTX = (LCD_SET_ROW | row);
    Strob();
}

/* Выбор колонки */
static void SetCol(unsigned char col){
    LCD_MT_A0_off;
    LCD_MT_RW_off;
    A->RXTX = (LCD_SET_COL | col);
    Strob();
}

/* Вывод байта */
static void LcdWriteData(unsigned char data){
    LCD_MT_A0_on;
    LCD_MT_RW_off;
    A->RXTX = data;
    Strob();
    LCD_MT_A0_off;
    LCD_MT_RW_off;
}

/* Вывод изображения из буфера на экран */
void LcdScreen(unsigned char screen[8][128]){
    SetChip(0);
    for(unsigned row = 0; row < 8; ++row){
        SetRow(row);
        SetCol(0);
        for(unsigned col = 0; col < 64; ++col){
            unsigned char byte = screen[row][col];
            LcdWriteData(byte);
        }
    }
    SetChip(1);
    for(unsigned row = 0; row < 8; ++row){
        SetRow(row);
        SetCol(0);
        for(unsigned col = 64; col < 128; ++col){
            unsigned char byte = screen[row][col];
            LcdWriteData(byte);
        }
    }
}

Файл font_ansi_5x8.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#include "font_ansi_5x8.h"

const unsigned char ansi[256][5] = {
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x00
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x01
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x02
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x03
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x04
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x05
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x06
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x07
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x08
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x09
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x0A
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x0B
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x0C
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x0D
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x0E
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x0F

    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x10
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x11
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x12
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x13
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x14
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x15
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x16
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x17
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x18
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x19
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x1A
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x1B
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x1C
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x1D
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x1E
    {0x00, 0x00, 0x00, 0x00, 0x00}, // spec 0x1F

    {0x00, 0x00, 0x00, 0x00, 0x00}, // sp 0x20
    {0x00, 0x00, 0x5f, 0x00, 0x00}, // ! 0x21
    {0x00, 0x07, 0x00, 0x07, 0x00}, // " 0x22
    {0x14, 0x7f, 0x14, 0x7f, 0x14}, // # 0x23
    {0x24, 0x2a, 0x7f, 0x2a, 0x12}, // $ 0x24
    {0x23, 0x13, 0x08, 0x64, 0x62}, // % 0x25
    {0x36, 0x49, 0x55, 0x22, 0x50}, // & 0x26
    {0x00, 0x05, 0x03, 0x00, 0x00}, // ' 0x27
    {0x00, 0x1c, 0x22, 0x41, 0x00}, // ( 0x28
    {0x00, 0x41, 0x22, 0x1c, 0x00}, // ) 0x29
    {0x14, 0x08, 0x3E, 0x08, 0x14}, // * 0x2A
    {0x08, 0x08, 0x3E, 0x08, 0x08}, // + 0x2B
    {0x00, 0x00, 0x50, 0x30, 0x00}, // , 0x2C
    {0x10, 0x10, 0x10, 0x10, 0x10}, // - 0x2D
    {0x00, 0x60, 0x60, 0x00, 0x00}, // . 0x2E
    {0x20, 0x10, 0x08, 0x04, 0x02}, // / 0x2F
    {0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0 0x30
    {0x00, 0x42, 0x7F, 0x40, 0x00}, // 1 0x31
    {0x42, 0x61, 0x51, 0x49, 0x46}, // 2 0x32
    {0x21, 0x41, 0x45, 0x4B, 0x31}, // 3 0x33
    {0x18, 0x14, 0x12, 0x7F, 0x10}, // 4 0x34
    {0x27, 0x45, 0x45, 0x45, 0x39}, // 5 0x35
    {0x3C, 0x4A, 0x49, 0x49, 0x30}, // 6 0x36
    {0x01, 0x71, 0x09, 0x05, 0x03}, // 7 0x37
    {0x36, 0x49, 0x49, 0x49, 0x36}, // 8 0x38
    {0x06, 0x49, 0x49, 0x29, 0x1E}, // 9 0x39
    {0x00, 0x36, 0x36, 0x00, 0x00}, // : 0x3A
    {0x00, 0x56, 0x36, 0x00, 0x00}, // ; 0x3B
    {0x08, 0x14, 0x22, 0x41, 0x00}, // < 0x3C
    {0x14, 0x14, 0x14, 0x14, 0x14}, // = 0x3D
    {0x00, 0x41, 0x22, 0x14, 0x08}, // > 0x3E
    {0x02, 0x01, 0x51, 0x09, 0x06}, // ? 0x3F
    {0x32, 0x49, 0x59, 0x51, 0x3E}, // @ 0x40
    {0x7E, 0x11, 0x11, 0x11, 0x7E}, // A 0x41
    {0x7F, 0x49, 0x49, 0x49, 0x36}, // B 0x42
    {0x3E, 0x41, 0x41, 0x41, 0x22}, // C 0x43
    {0x7F, 0x41, 0x41, 0x22, 0x1C}, // D 0x44
    {0x7F, 0x49, 0x49, 0x49, 0x41}, // E 0x45
    {0x7F, 0x09, 0x09, 0x09, 0x01}, // F 0x46
    {0x3E, 0x41, 0x49, 0x49, 0x7A}, // G 0x47
    {0x7F, 0x08, 0x08, 0x08, 0x7F}, // H 0x48
    {0x00, 0x41, 0x7F, 0x41, 0x00}, // I 0x49
    {0x20, 0x40, 0x41, 0x3F, 0x01}, // J 0x4A
    {0x7F, 0x08, 0x14, 0x22, 0x41}, // K 0x4B
    {0x7F, 0x40, 0x40, 0x40, 0x40}, // L 0x4C
    {0x7F, 0x02, 0x0C, 0x02, 0x7F}, // M 0x4D
    {0x7F, 0x04, 0x08, 0x10, 0x7F}, // N 0x4E
    {0x3E, 0x41, 0x41, 0x41, 0x3E}, // O 0x4F
    {0x7F, 0x09, 0x09, 0x09, 0x06}, // P 0x50
    {0x3E, 0x41, 0x51, 0x21, 0x5E}, // Q 0x51
    {0x7F, 0x09, 0x19, 0x29, 0x46}, // R 0x52
    {0x46, 0x49, 0x49, 0x49, 0x31}, // S 0x53
    {0x01, 0x01, 0x7F, 0x01, 0x01}, // T 0x54
    {0x3F, 0x40, 0x40, 0x40, 0x3F}, // U 0x55
    {0x1F, 0x20, 0x40, 0x20, 0x1F}, // V 0x56
    {0x3F, 0x40, 0x38, 0x40, 0x3F}, // W 0x57
    {0x63, 0x14, 0x08, 0x14, 0x63}, // X 0x58
    {0x07, 0x08, 0x70, 0x08, 0x07}, // Y 0x59
    {0x61, 0x51, 0x49, 0x45, 0x43}, // Z 0x5A
    {0x00, 0x7F, 0x41, 0x41, 0x00}, // [ 0x5B
    {0x55, 0x2A, 0x55, 0x2A, 0x55}, // 0x5C
    {0x00, 0x41, 0x41, 0x7F, 0x00}, // ] 0x5D
    {0x04, 0x02, 0x01, 0x02, 0x04}, // ^ 0x5E
    {0x40, 0x40, 0x40, 0x40, 0x40}, // _ 0x5F
    {0x00, 0x01, 0x02, 0x04, 0x00}, // ' 0x60
    {0x20, 0x54, 0x54, 0x54, 0x78}, // a 0x61
    {0x7F, 0x48, 0x44, 0x44, 0x38}, // b 0x62
    {0x38, 0x44, 0x44, 0x44, 0x20}, // c 0x63
    {0x38, 0x44, 0x44, 0x48, 0x7F}, // d 0x64
    {0x38, 0x54, 0x54, 0x54, 0x18}, // e 0x65
    {0x08, 0x7E, 0x09, 0x01, 0x02}, // f 0x66
    {0x0C, 0x52, 0x52, 0x52, 0x3E}, // g 0x67
    {0x7F, 0x08, 0x04, 0x04, 0x78}, // h 0x68
    {0x00, 0x44, 0x7D, 0x40, 0x00}, // i 0x69
    {0x20, 0x40, 0x44, 0x3D, 0x00}, // j 0x6A
    {0x7F, 0x10, 0x28, 0x44, 0x00}, // k 0x6B
    {0x00, 0x41, 0x7F, 0x40, 0x00}, // l 0x6C
    {0x7C, 0x04, 0x18, 0x04, 0x78}, // m 0x6D
    {0x7C, 0x08, 0x04, 0x04, 0x78}, // n 0x6E
    {0x38, 0x44, 0x44, 0x44, 0x38}, // o 0x6F
    {0x7C, 0x14, 0x14, 0x14, 0x08}, // p 0x70
    {0x08, 0x14, 0x14, 0x18, 0x7C}, // q 0x71
    {0x7C, 0x08, 0x04, 0x04, 0x08}, // r 0x72
    {0x48, 0x54, 0x54, 0x54, 0x20}, // s 0x73
    {0x04, 0x3F, 0x44, 0x40, 0x20}, // t 0x74
    {0x3C, 0x40, 0x40, 0x20, 0x7C}, // u 0x75
    {0x1C, 0x20, 0x40, 0x20, 0x1C}, // v 0x76
    {0x3C, 0x40, 0x30, 0x40, 0x3C}, // w 0x77
    {0x44, 0x28, 0x10, 0x28, 0x44}, // x 0x78
    {0x0C, 0x50, 0x50, 0x50, 0x3C}, // y 0x79
    {0x44, 0x64, 0x54, 0x4C, 0x44}, // z 0x7A
    {0x08, 0x08, 0x36, 0x41, 0x41}, // { 0x7B
    {0x00, 0x00, 0x7F, 0x00, 0x00}, // | 0x7C
    {0x41, 0x41, 0x36, 0x08, 0x08}, // } 0x7D
    {0x02, 0x01, 0x02, 0x02, 0x01}, // ~ 0x7E
    {0x00, 0x00, 0x00, 0x00, 0x00}, // DE 0x7F

    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x80
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x81
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x82
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x83
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x84
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x85
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x86
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x87
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x88
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x89
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8A
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8B
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8C
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8D
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8E
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x8F

    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x90
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x91
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x92
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x93
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x94
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x95
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x96
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x97
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x98
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x99
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9A
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9B
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9C
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9D
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9E
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0x9F

    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA0
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA1
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA2
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA3
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA4
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA5
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA6
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA7
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA8
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xA9
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xAA
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xAB
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xAC
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xAD
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xAE
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xAF

    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB0
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB1
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB2
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB3
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB4
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB5
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB6
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB7
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB8
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xB9
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xBA
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xBB
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xBC
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xBD
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xBE
    {0x00, 0x00, 0x00, 0x00, 0x00}, // 0xBF

    {0x7E, 0x11, 0x11, 0x11, 0x7E}, // А 0xC0
    {0x7F, 0x49, 0x49, 0x49, 0x33}, // Б 0xC1
    {0x7F, 0x49, 0x49, 0x49, 0x36}, // В 0xC2
    {0x7F, 0x01, 0x01, 0x01, 0x03}, // Г 0xC3
    {0xE0, 0x51, 0x4F, 0x41, 0xFF}, // Д 0xC4
    {0x7F, 0x49, 0x49, 0x49, 0x49}, // Е 0xC5
    {0x77, 0x08, 0x7F, 0x08, 0x77}, // Ж 0xC6
    {0x49, 0x49, 0x49, 0x49, 0x36}, // З 0xC7
    {0x7F, 0x10, 0x08, 0x04, 0x7F}, // И 0xC8
    {0x7C, 0x21, 0x12, 0x09, 0x7C}, // Й 0xC9
    {0x7F, 0x08, 0x14, 0x22, 0x41}, // К 0xCA
    {0x20, 0x41, 0x3F, 0x01, 0x7F}, // Л 0xCB
    {0x7F, 0x02, 0x0C, 0x02, 0x7F}, // М 0xCC
    {0x7F, 0x08, 0x08, 0x08, 0x7F}, // Н 0xCD
    {0x3E, 0x41, 0x41, 0x41, 0x3E}, // О 0xCE
    {0x7F, 0x01, 0x01, 0x01, 0x7F}, // П 0xCF
    {0x7F, 0x09, 0x09, 0x09, 0x06}, // Р 0xD0
    {0x3E, 0x41, 0x41, 0x41, 0x22}, // С 0xD1
    {0x01, 0x01, 0x7F, 0x01, 0x01}, // Т 0xD2
    {0x27, 0x48, 0x48, 0x48, 0x3F}, // У 0xD3
    {0x1C, 0x22, 0x7F, 0x22, 0x1C}, // Ф 0xD4
    {0x63, 0x14, 0x08, 0x14, 0x63}, // Х 0xD5
    {0x7F, 0x40, 0x40, 0x40, 0xFF}, // Ц 0xD6
    {0x07, 0x08, 0x08, 0x08, 0x7F}, // Ч 0xD7
    {0x7F, 0x40, 0x7F, 0x40, 0x7F}, // Ш 0xD8
    {0x7F, 0x40, 0x7F, 0x40, 0xFF}, // Щ 0xD9
    {0x01, 0x7F, 0x48, 0x48, 0x30}, // Ъ 0xDA
    {0x7F, 0x48, 0x30, 0x00, 0x7F}, // Ы 0xDB
    {0x7F, 0x48, 0x48, 0x30, 0x00}, // Ь 0xDC
    {0x22, 0x41, 0x49, 0x49, 0x3E}, // Э 0xDD
    {0x7F, 0x08, 0x3E, 0x41, 0x3E}, // Ю 0xDE
    {0x46, 0x29, 0x19, 0x09, 0x7F}, // Я 0xDF
    {0x20, 0x54, 0x54, 0x54, 0x78}, // а 0xE0
    {0x3C, 0x4A, 0x4A, 0x49, 0x31}, // б 0xE1
    {0x7C, 0x54, 0x54, 0x28, 0x00}, // в 0xE2
    {0x7C, 0x04, 0x04, 0x04, 0x0C}, // г 0xE3
    {0xE0, 0x54, 0x4C, 0x44, 0xFC}, // д 0xE4
    {0x38, 0x54, 0x54, 0x54, 0x08}, // е 0xE5
    {0x6C, 0x10, 0x7C, 0x10, 0x6C}, // ж 0xE6
    {0x44, 0x44, 0x54, 0x54, 0x28}, // з 0xE7
    {0x7C, 0x20, 0x10, 0x08, 0x7C}, // и 0xE8
    {0x78, 0x42, 0x24, 0x12, 0x78}, // й 0xE9
    {0x7C, 0x10, 0x28, 0x44, 0x00}, // к 0xEA
    {0x20, 0x44, 0x3C, 0x04, 0x7C}, // л 0xEB
    {0x7C, 0x08, 0x10, 0x08, 0x7C}, // м 0xEC
    {0x7C, 0x10, 0x10, 0x10, 0x7C}, // н 0xED
    {0x38, 0x44, 0x44, 0x44, 0x38}, // о 0xEE
    {0x7C, 0x04, 0x04, 0x04, 0x7C}, // п 0xEF
    {0x7C, 0x14, 0x14, 0x14, 0x08}, // р 0xE0
    {0x38, 0x44, 0x44, 0x44, 0x44}, // с 0xF1
    {0x04, 0x04, 0x7C, 0x04, 0x04}, // т 0xF2
    {0x0C, 0x50, 0x50, 0x50, 0x3C}, // у 0xF3
    {0x18, 0x24, 0x7E, 0x24, 0x18}, // ф 0xF4
    {0x44, 0x28, 0x10, 0x28, 0x44}, // х 0xF5
    {0x7C, 0x40, 0x40, 0x40, 0xFC}, // ц 0xF6
    {0x0C, 0x10, 0x10, 0x10, 0x7C}, // ч 0xF7
    {0x7C, 0x40, 0x7C, 0x40, 0x7C}, // ш 0xF8
    {0x7C, 0x40, 0x7C, 0x40, 0xFC}, // щ 0xF9
    {0x04, 0x7C, 0x50, 0x50, 0x20}, // ъ 0xFA
    {0x7C, 0x50, 0x20, 0x00, 0x7C}, // ы 0xFB
    {0x7C, 0x50, 0x50, 0x20, 0x00}, // ь 0xFC
    {0x28, 0x44, 0x54, 0x54, 0x38}, // э 0xFD
    {0x7C, 0x10, 0x38, 0x44, 0x38}, // ю 0xFE
    {0x08, 0x54, 0x34, 0x14, 0x7C}  // я 0xFF
};

Файл graphics.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "graphics.h"

/* Флаг, есть ли что выводить на экран */
static unsigned char grafic_out = 1;

/* Буфер для хранения графической информации */
/* Доступ к памяти дисплея намного медленнее */
static unsigned char screen[8][128];

/* Очистка буфера экрана */
void ClearScreen(void){
    grafic_out = 1;
    for(unsigned i = 0; i < sizeof(screen); ++i)
        screen[0][i] = 0x00;
}

/* Печать нуль терминированной строки в позицию (row, col) */
void Print(unsigned row, unsigned col, char * byte){
    grafic_out = 1;
    if (row > 7) return;
    while(*byte){
        for(unsigned i = 0; i < 5 && col < 128; ++i)
            screen[row][col++] = ansi[*byte][i];
        if (col < 128)
            screen[row][col++] = 0x00;
        ++byte;
    }
}

/* Вывод изображения, если были изменения */
void ScreenUpdate(void){
    if (grafic_out){
        grafic_out = 0;
        LcdScreen(screen);
    }
}

Задания для самостоятельного выполнения

  1. Реализуйте горизонтальную бегущую строку.
  2. Реализуйте вертикальную бегущую строку.
  3. Реализуйте строку, бегущую по периметру дисплея.
  4. Реализуйте счёт в двоичной позиционной системе счисления.
  5. Реализуйте счёт в шестнадцатеричной позиционной системе счисления.
  6. Добавьте в файл graphics.c функцию вывода переменной типа unsigned int, добавьте объявление в graphics.h.
Лицензия Creative Commons
Code More Team - GitHub