LCD Nokia 5110 представляет собой монохромный графический дисплей с разрешением 48×84 пикселей, который можно использовать для отображения различной информации в устройствах на микроконтроллерах. В прошлом, радиолюбители для своих поделок доставали подобные дисплеи из телефонов Nokia 3310, в настоящее время можно приобрести готовый модуль под Arduino, где дисплей смонтирован на печатной плате. Дополнительно на плате установлены светодиоды подсветки, синего цвета свечения.
Заказать дисплей можно здесь. В дисплее установлен контроллер PCD8544, напряжение питания может находиться в пределах 2,7…3,3 В, ток потребления составляет 240…320 мкА. Модуль имеет следующие выводы для подключения:
- RST – вывод сброса контроллера дисплея
- CE – вывод разрешения передачи данных
- DC – выбор режима передачи, команда или данные
- DIN – вход передачи данных интерфейса SPI
- CLK – вывод тактирования интерфейса SPI
- VCC – вывод питания дисплея
- LIGHT – вывод управление подсветкой, для включения необходимо подать низкий логический уровень
- GND – общий провод (отрицательный полюс источника питания)
Передача данных осуществляется с помощью стандартного интерфейса SPI, частота тактирования до 4 МГц. Во время сеанса передачи данных, на линии CE необходимо установить низкий логический уровень, тем самым разрешая передачу. Когда на дисплей передается команда, линию DC необходимо “притянуть” к общему проводу (лог. 0), при высоком логическом уровне на линии DC, можно передавать данные, которые непосредственно будут отображаться на дисплее.
При включении дисплея, необходимо обязательно выполнить процедуру сброса, в течение 30 мс после подачи питания, выдать на линию RST отрицательный импульс, минимальная длительность импульса (низкого логического уровня) составляет 100 нс. Лог. 0 на линии RST может присутствовать до подачи питания.
В следующей таблице приведены команды управления дисплеем:
Команда | D/C | Байт команды | Описание | |||||||
DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | |||
Значение бита H не имеет значения (0 или 1) | ||||||||||
NOP | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | пустая команда |
Function set | 0 | 0 | 0 | 1 | 0 | 0 | PD | V | H | Настройка функций |
Write data | 1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Запись данных |
Бит H=0, базовые команды | ||||||||||
Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | X | Зарезервировано |
Display control | 0 | 0 | 0 | 0 | 0 | 1 | D | 0 | E | Настройки отображения |
Reserved | 0 | 0 | 0 | 0 | 1 | X | X | X | X | Зарезервировано |
Y address | 0 | 0 | 1 | 0 | 0 | 0 | Y2 | Y1 | Y0 | Установка адресного указателя для вывода данных (0 ≤ Y ≤ 5) |
X address | 0 | 1 | X6 | X5 | X4 | X3 | X2 | X1 | X0 | Установка адресного указателя для вывода данных (0 ≤ X ≤ 83) |
Бит H=1, расширенные команды | ||||||||||
Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | Зарезервировано |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | ||
Temperature control | 0 | 0 | 0 | 0 | 0 | 0 | 1 | TC1 | TC0 | Установка значения температурного коэффициента |
Reserved | 0 | 0 | 0 | 0 | 0 | 1 | X | X | X | Зарезервировано |
Bias system | 0 | 0 | 0 | 0 | 1 | 0 | BS2 | BS1 | BS0 | Настройка смещения напряжений |
Reserved | 0 | 0 | 1 | X | X | X | X | X | X | Зарезервировано |
Set Vop | 0 | 1 | Vop6 | Vop5 | Vop4 | Vop3 | Vop2 | Vop1 | Vop0 | Установка значения напряжения питания матрицы (контрастность) |
Назначение битов в командах описано в следующей таблице:
Бит | Значение | Описание |
PD | 0 | Контроллер дисплея включен |
1 | Контроллер дисплея выключен | |
V | 0 | Горизонтальная адресация |
1 | Вертикальная адресация | |
H | 0 | Использовать базовый набор команд |
1 | Использовать расширенный набор команд | |
D и E | 00 | Все сегменты дисплея выключены |
01 | Все сегменты дисплея включены | |
10 | Нормальный режим | |
11 | Инверсное отображение | |
TC1 и TC0 | 00 | Температурный коэффициент 0 |
01 | Температурный коэффициент 1 | |
10 | Температурный коэффициент 2 | |
11 | Температурный коэффициент 3 | |
BS2, BS1, BS0 | 000 | 1:100 |
001 | 1:80 | |
010 | 1:65 | |
011 | 1:48 | |
100 | 1:40/1:34 | |
101 | 1:24 | |
110 | 1:18/1:16 | |
111 | 1:10/1:9/1:8 |
Матрица дисплея условно поделена на столбцы, представляющие собой 8 пикселей, то есть когда мы отправляем 1 байт данных на дисплей, он отображается в этом столбце. По ширине (горизонтали) дисплея расположены 84 столбца, по высоте (вертикали) расположены 6 столбцов (то есть всего 6 строк). Адрес необходимого столбца (адресный указатель) задается командами X address, Y address. Ниже на картинке представлена структура матрицы:
Адресный указатель автоматически инкрементируется после каждого отправленного на дисплей байта данных. С помощью бита V команды Function set, можно выбрать порядок заполнения столбцов матрицы, если бит равен 0 (горизонтальная адресация), столбцы матрицы заполняются слева-направо, сверху-вниз, при вертикальной адресации V=1, сверху-вниз, слева-направо. После заполнения последнего столбца (X=83, Y=5), адресный указатель возвращается в левый верхний угол (X=0, Y=0). На следующей картинке изображена схема адресаций:
После процедуры сброса, контроллер дисплея находится в выключенном состоянии, все сегменты погашены, соответственно необходимо выполнить инициализацию, отправив на дисплей следующие байты:
- 0x21 (00100001) – команда настройки функций: включить контроллер дисплея, горизонтальная адресация, выбрать расширенный набор команд.
- 0x13 (00010011) – команда установки смещения напряжений (Bias system), в указанной команде выбрано значение 1:48. Значение смещения влияет на внутренний генератор напряжения, питающий матрицу дисплея. Внутренний генератор способен повышать напряжение до 8,5 В, которое влияет на контрастность изображения.
- 0x04 (00000100) – команда установки температурного коэффициента, здесь выбран 0-й коэффициент. Данный коэффициент устанавливает кривую зависимости напряжение питания матрицы (контрастность) от температуры окружающей среды. При понижении температуры контрастность автоматически увеличивается, всего можно выбрать 4 различных коэффициента, соответствующие кривые можно посмотреть в даташите.
- 0xC1 (11000001) – команда установки контрастности дисплея, в данном случае величина контрастности равна 0x65 (1000001). Значение может варьироваться от 0x00 до 0x7F. От этого значения зависит напряжение питания матрицы.
- 0x20 (00100000) – команда настройки функций: включить контроллер дисплея, горизонтальная адресация, выбрать стандартный набор команд. Здесь мы возвращаемся на стандартный набор команд.
- 0x0С (00001100) – команда настройки отображения: выбрать нормальный режим работы.
После инициализации дисплей готов к работе, но необходимо выполнить еще одно действие, после сброса и инициализации состояние сегментов не определено, и дисплей будет показывать мусор, поэтому следует выполнить очистку, записав во все столбцы значение 0x00.
На следующей картинке показана схема подключения дисплея Nokia 5110 к микроконтроллеру PIC16F628A:
Основная часть кода программы приведена ниже (полный код доступен для скачивания в конце статьи):
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 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #include <P16F628A.INC> LIST p=16F628A __CONFIG H'3F18' ;Конфигурация микроконтроллера errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге Sec equ 0020h ;вспомогательные регистры счета Sec1 equ 0021h ; Sec2 equ 0022h ; nomer equ 0023h ;регистр хранения кода ascii символа scetbit equ 0024h ;регистр счета кол-ва бит perem equ 0025h ;вспомогательный регистр передачи байта по spi temp equ 0026h ;вспомогательный регистр счета tmp_tab equ 0027h ;регистр хранения номера таблицы #DEFINE res_lcd PORTB,0 ;присвоение названий линиям ввода-вывода #DEFINE cs PORTB,1 ;для работы с LCD дисплеем Nоkiа 5110 #DEFINE dat_com PORTB,2 ; #DEFINE sdata PORTB,3 ; #DEFINE sclk PORTB,4 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b'00010011' ;установка значений выходных защелок порта B movwf PORTB ; movlw b'00000111' ;выключение компараторов movwf CMCON ; bsf STATUS,RP0 ;выбрать 1-й банк movlw b'11100000' ;настройка линий ввода\вывода порта B movwf TRISB ;RB0,RB1 - на вход, остальные на выход bcf STATUS,RP0 ;выбрать 0-й банк call init_lcd ;вызов подпрограммы инициализации дисплея call clear_lcd ;вызов подпрограммы очистки дисплея ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw '"' ;вывод текста ("RadioLaba.ru") call viv_symb ; movlw 'R' ; call viv_symb ; movlw 'a' ; call viv_symb ; movlw 'd' ; call viv_symb ; movlw 'i' ; call viv_symb ; movlw 'o' ; call viv_symb ; movlw 'L' ; call viv_symb ; movlw 'a' ; call viv_symb ; movlw 'b' ; call viv_symb ; movlw 'a' ; call viv_symb ; movlw '.' ; call viv_symb ; movlw 'r' ; call viv_symb ; movlw 'u' ; call viv_symb ; movlw '"' ; call viv_symb ; call paus1s ;пауза 1 сек call ust_cur_2 ;установка курсора на начало 2-ой строки movlw ' ' ;вывод текста ( Тестовый код) call viv_symb ; movlw 'Т' ; call viv_symb ; movlw 'е' ; call viv_symb ; movlw 'с' ; call viv_symb ; movlw 'т' ; call viv_symb ; movlw 'о' ; call viv_symb ; movlw 'в' ; call viv_symb ; movlw 'ы' ; call viv_symb ; movlw 'й' ; call viv_symb ; movlw ' ' ; call viv_symb ; movlw 'К' ; call viv_symb ; movlw 'о' ; call viv_symb ; movlw 'д' ; call viv_symb ; call paus1s ;пауза 1 сек call ust_cur_3 ;установка курсора на начало 3-й строки movlw ' ' ;вывод текста ( *Дисплей*) call viv_symb ; movlw ' ' ; call viv_symb ; movlw '*' ; call viv_symb ; movlw 'Д' ; call viv_symb ; movlw 'и' ; call viv_symb ; movlw 'с' ; call viv_symb ; movlw 'п' ; call viv_symb ; movlw 'л' ; call viv_symb ; movlw 'е' ; call viv_symb ; movlw 'й' ; call viv_symb ; movlw '*' ; call viv_symb ; call paus1s ;пауза 1 сек call ust_cur_4 ;установка курсора на начало 4-й строки movlw ' ' ;вывод текста ( Nоkiа 5110) call viv_symb ; movlw ' ' ; call viv_symb ; movlw 'N' ; call viv_symb ; movlw 'o' ; call viv_symb ; movlw 'k' ; call viv_symb ; movlw 'i' ; call viv_symb ; movlw 'a' ; call viv_symb ; movlw ' ' ; call viv_symb ; movlw '5' ; call viv_symb ; movlw '1' ; call viv_symb ; movlw '1' ; call viv_symb ; movlw '0' ; call viv_symb ; call paus1s ;пауза 1 сек call ust_cur_5 ;установка курсора на начало 5-й строки movlw ' ' ;вывод текста ( Контроллер) call viv_symb ; movlw ' ' ; call viv_symb ; movlw 'К' ; call viv_symb ; movlw 'о' ; call viv_symb ; movlw 'н' ; call viv_symb ; movlw 'т' ; call viv_symb ; movlw 'р' ; call viv_symb ; movlw 'о' ; call viv_symb ; movlw 'л' ; call viv_symb ; movlw 'л' ; call viv_symb ; movlw 'е' ; call viv_symb ; movlw 'р' ; call viv_symb ; call paus1s ;пауза 1 сек call ust_cur_6 ;установка курсора на начало 6-й строки movlw ' ' ;вывод текста ( РIС16F628А) call viv_symb ; movlw ' ' ; call viv_symb ; movlw 'P' ; call viv_symb ; movlw 'I' ; call viv_symb ; movlw 'C' ; call viv_symb ; movlw '1' ; call viv_symb ; movlw '6' ; call viv_symb ; movlw 'F' ; call viv_symb ; movlw '6' ; call viv_symb ; movlw '2' ; call viv_symb ; movlw '8' ; call viv_symb ; movlw 'A' ; call viv_symb ; met_1 nop ;зацикливание программы goto met_1 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_lcd bcf res_lcd ;подпрограмма инициализации дисплея movlw .200 ;выдача лог.0 на линию RST: сброс дисплея movwf scetbit ;пауза 0,6 мс in_1 decfsz scetbit,F ; goto in_1 ; bsf res_lcd ; movlw 0x21 ;включить контроллер дисплея, горизонт.адресация, расширенный набор команд call sendispcom ; movlw 0x13 ;установка смещения напряжения Bias 1:48 call sendispcom ; movlw 0x04 ;установка температурного коэффициента 0 call sendispcom ; movlw 0xC1 ;установка контрастности (значение 0x65) call sendispcom ; movlw 0x20 ;стандартный набор команд call sendispcom ; movlw 0x0C ;установка - нормальный режим работы call sendispcom ; return ;выход ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ust_cur_1 movlw 0x40 ;установка курсор в позицию Y0 call sendispcom goto ust ust_cur_2 movlw 0x41 ;установка курсор в позицию Y1 call sendispcom goto ust ust_cur_3 movlw 0x42 ;установка курсор в позицию Y2 call sendispcom goto ust ust_cur_4 movlw 0x43 ;установка курсор в позицию Y3 call sendispcom goto ust ust_cur_5 movlw 0x44 ;установка курсор в позицию Y4 call sendispcom goto ust ust_cur_6 movlw 0x45 ;установка курсор в позицию Y5 call sendispcom ust movlw 0x80 ;установка курсор в позицию X0 call sendispcom return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; clear_lcd movlw 0x40 ;подпрограмма очистки дисплея call sendispcom ;установка курсор в позицию Y0 movlw 0x80 call sendispcom ;установка курсор в позицию X0 movlw .6 ;запись счетчика, значение 504 movwf Sec1 povt4 movlw .84 movwf Sec povt3 movlw .0 call sendispdat ;отправка значения 0x00 на дисплея decfsz Sec,F ;значение отправляется 504 раза goto povt3 ;для очистки дисплея decfsz Sec1,F goto povt4 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sendispcom movwf perem ;подпрограмма отправки команды/данных на дисплей bcf dat_com goto povt1 sendispdat movwf perem bsf dat_com povt1 movlw .8 movwf scetbit bcf cs povt2 bcf sclk btfsc perem,7 bsf sdata btfss perem,7 bcf sdata bsf sclk rlf perem,F decfsz scetbit,F goto povt2 bsf cs return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; viv_symb movwf nomer ;подпрограмма вывода символа на дисплей movlw .32 ; subwf nomer,W ; btfss STATUS,C ; return ;значение символа менее 32: выход из подпрограммы movf nomer,W sublw .82 btfss STATUS,C goto viv_symb_1 ;значение символа более 82: переход на метку viv_symb_1 movlw .32 ;значение символа более 31 и менее 83: символ в таблице tab_symb_1 subwf nomer,F ;вычитание числа 32 из ASCII кода символа, получаем movlw .1 ;преобразованное значение символа movwf tmp_tab ;запись номера таблицы (1) в регистр tmp_tab goto symb_lcd viv_symb_1 movf nomer,W sublw .126 btfss STATUS,C goto viv_symb_2 ;значение символа более 126: переход на метку viv_symb_2 movlw .83 ;значение символа более 82 и менее 128: символ в таблице tab_symb_2 subwf nomer,F ;вычитание числа 83 из ASCII кода символа, получаем movlw .2 ;преобразованное значение символа movwf tmp_tab ;запись номера таблицы (2) в регистр tmp_tab goto symb_lcd viv_symb_2 movf nomer,W sublw .191 btfss STATUS,C goto viv_symb_3 ;значение символа более 191: переход на метку viv_symb_3 movlw .176 ;проверка регистра nomer на совпадение с числом 176 xorwf nomer,W ;176 - ascii код символа размерности температры, угла btfss STATUS,Z return ;значение не совпадает: выход из подпрограммы movlw .13 ;значение символа равно 176, символ размерности температуры, угла movwf nomer ;устанавливаем вручную преобраз. значение символа movlw .4 movwf tmp_tab ;запись номера таблицы (4) в регистр tmp_tab goto symb_lcd viv_symb_3 movf nomer,W sublw .242 btfss STATUS,C goto viv_symb_4 ;значение символа более 242: переход на метку viv_symb_4 movlw .192 ;значение символа более 191 и менее 243: символ в таблице tab_symb_3 subwf nomer,F ;вычитание числа 192 из ASCII кода символа, получаем movlw .3 ;преобразованное значение символа movwf tmp_tab ;запись номера таблицы (3) в регистр tmp_tab goto symb_lcd viv_symb_4 movlw .243 ;значение символа более 242: символ в таблице tab_symb_4 subwf nomer,F movlw .4 movwf tmp_tab ;запись номера таблицы (4) в регистр tmp_tab ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; symb_lcd movf nomer,W ;умножение преобразованного значения символа на 5 addwf nomer,F addwf nomer,F addwf nomer,F addwf nomer,F movlw .5 movwf temp ;запись счетчика для вывода 5 байт символа symb_1 movlw .1 ;определение ранее записанного номера талицы xorwf tmp_tab,W ;для вызова соответствующей таблицы btfss STATUS,Z goto symb_m1 call tab_symb_1 goto symb_2 symb_m1 movlw .2 xorwf tmp_tab,W btfss STATUS,Z goto symb_m2 call tab_symb_2 goto symb_2 symb_m2 movlw .3 xorwf tmp_tab,W btfss STATUS,Z goto symb_m3 call tab_symb_3 goto symb_2 symb_m3 call tab_symb_4 symb_2 call sendispdat ;вывод байта символа на дисплей incf nomer,F decfsz temp,F goto symb_1 movlw .0 call sendispdat ;вывод пустого столбца (0x00) разделителя символов return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; tab_symb_1 movlw high tab1 ;таблица данных содержащая байты символов movwf PCLATH ;спецзнаки, цифры 0-9, латинские символы A-R movf nomer,W ; addlw low tab1 ; btfsc STATUS,C ; incf PCLATH,F ; movf nomer,W ; addwf PCL,F tab1 dt 0x00, 0x00, 0x00, 0x00, 0x00; (пробел) значение ASCII кода 32 dt 0x00, 0x00, 0x5F, 0x00, 0x00; ! dt 0x00, 0x07, 0x00, 0x07, 0x00; " dt 0x14, 0x7F, 0x14, 0x7F, 0x14; # dt 0x24, 0x2A, 0x7F, 0x2A, 0x12; $ dt 0x23, 0x13, 0x08, 0x64, 0x62; % dt 0x36, 0x49, 0x55, 0x22, 0x50; & dt 0x00, 0x05, 0x03, 0x00, 0x00; ' dt 0x00, 0x1C, 0x22, 0x41, 0x00; ( dt 0x00, 0x41, 0x22, 0x1C, 0x00; ) dt 0x08, 0x2A, 0x1C, 0x2A, 0x08; * dt 0x08, 0x08, 0x3E, 0x08, 0x08; + dt 0x00, 0x50, 0x30, 0x00, 0x00; , dt 0x08, 0x08, 0x08, 0x08, 0x08; - dt 0x00, 0x60, 0x60, 0x00, 0x00; . dt 0x20, 0x10, 0x08, 0x04, 0x02; / dt 0x3E, 0x51, 0x49, 0x45, 0x3E; 0 dt 0x00, 0x42, 0x7F, 0x40, 0x00; 1 dt 0x42, 0x61, 0x51, 0x49, 0x46; 2 .......................... .......................... .......................... ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Данный код выводит на дисплей последовательно 6 строк, с паузой в 1 сек: “Radiolaba.ru”, Тестовый код, *Дисплей*, Nоkiа 5110, Контроллер, PIC16F628A.
Каждый символ имеет размеры 5×7 пикселей, то есть состоит из 5 байт. Контроллер дисплея не имеет встроенного знакогенератора, поэтому байты для прорисовки символов включены в код программы в виде таблиц данных. Всего поддерживается отображение 162 символов, это спецзнаки, цифры, латинские и кириллические символы, все они разделены на 4 таблицы данных, так как одна таблица может вмещать только 256 байт данных.
Подпрограмма знакогенератора (viv_symb) на основе ASCII кода символа извлекает байты из соответствующей таблицы, и выводит их на дисплей. Сначала определяется таблица данных, в которой находятся байты символа, затем из ASCII кода символа вычитается определенное значение, чтобы в дальнейшем не выйти за границы таблицы, при выполнении вычисляемого перехода. Полученное значение умножается на 5, это необходимо для попадания на первый байт символа при вычисляемом переходе, так как каждый символ занимает в таблице 5 байт. Далее последовательно выводятся остальные 4 байта.
В подпрограмме viv_symb дополнительно вставляется пустой столбец (байт 0x00) для разделения символов на экране, то есть на одну строку дисплея умещается 84/6=14 символов. Байты для прорисовки символов занимают значительную часть памяти программ микроконтроллера: 162*5 = 810 слов, или 40,5% памяти.
Для вывода символа размерности угла и температуры, в подпрограмму viv_symb нужно передать значение 176 (ASCII код символа).
После настройки внутренних регистров микроконтроллера выполняется инициализация дисплея с помощью подпрограммы init_lcd, далее вызывается подпрограмма очистки дисплея clear_lcd, которая записывает во все столбцы матрицы значение 0x00, после очистки адресный указатель возвращается в левый верхний угол (X=0, Y=0). Ну а дальше на дисплей поочередно выводятся символы. Для установки адресного указателя в начала требуемой строки необходимо вызвать соответствующую подпрограмму ust_cur_1, ust_cur_2 и т. д. Для отправки команды используется подпрограмма sendispcom, для передачи данных sendispdat, предварительно необходимо записать в аккумулятор передаваемое значение.
В конце статьи также можно скачать кода программы для вывода шрифта удвоенного размера 9×14. При использовании такого шрифта на дисплее поместится 3 строки по 8 символов. Программа выводит на дисплей последовательно 3 строки, с паузой в 1 сек: +PIC16+, Nokia, 5110.
Здесь использованы почти те же алгоритмы что и для шрифта 5×7, с одной разницей: добавлены два регистра x_adr, y_adr, хранящих значения адресного указателя. Каждый символ состоит из 18-ти байт. Так как высота символа занимает две строки, сначала выводится верхняя часть, затем нижняя, поэтому для корректного отображения необходимо знать текущее положение указателя. Если требуется вывести символ в произвольном месте экрана, после установки адресного указателя следует перезаписать регистры x_adr, y_adr новыми значениями. В подпрограммах установки адресного указателя (ust_cur_x), вышеуказанное действие выполняется автоматически.
В этом коде заложены не все символы: цифры 0-9, прописные латинские символы A-Z, точка, пробел, тире, плюс, и символ размерности угла и температуры. Данные символы занимают 41*18 = 738 байт, или 37% памяти программ.
Кроме символов, на дисплей можно выводить графические изображения с разрешением 48×84 пикселей, и даже анимированные ролики. Одна картинка будет занимать 504 байта, поэтому для хранения большого количества изображений придется использовать внешнюю EEPROM память, или SD карту.
Очень полезная статья,спасибо!
Спасибо, сэкономит массу времени.
Спасибо! И статья хорошая и сайт, ну и автор всего этого молодец . Сам разобрался – другим помогает! Без-воз-мез-дно, т.е. даром.
Огромное спасибо за Ваши статьи, очень интересно и доступно!
Я рад что вам и другим участникам понравилось, буду стараться писать новые статьи.
Ovesome guilde! Thank you very much!
*awesome… sorry for typo..
Пожалуйста, помогите мне. Это не работает для меня. Я загрузил шестнадцатеричный файл 5×7 в PIC16F628A, подключив его к дисплею, но ничего не отображается. Знаете ли вы, для чего предназначена перемычка JP? Заранее спасибо.
С наилучшими пожеланиями,
Ференц Изинг, Венгрия
Pozhaluysta, pomogite mne. Eto ne rabotayet dlya menya. YA zagruzil shestnadtsaterichnyy fayl 5×7 v PIC16F628A, podklyuchiv yego k displeyu, no nichego ne otobrazhayetsya. Znayete li vy, dlya chego prednaznachena peremychka JP? Zaraneye spasibo. S nailuchshimi pozhelaniyami, Ferenc Izing, Vengriya
Извините, это настоящее сообщение:
Пожалуйста, помогите мне. Это не работает для меня. Я загрузил шестнадцатеричный файл 5×7 в PIC16F628A, подключив его к дисплею, но ничего не отображается. Знаете ли вы, для чего предназначена перемычка JP? Заранее спасибо.
С наилучшими пожеланиями,
Ференц Изинг, Венгрия
Здравствуйте, перемычка JP включает подсветку дисплея. Обычно сам дисплей плохо прижат к плате, из-за чего теряется контакт и дисплей ничего не показывает, попробуйте прижать дисплей к плате. Второй вариант, это подрегулировать контрастность дисплея, поменять значение контрастности в прошивке в пределах 0xA0 – 0xE6 (160-230). В прошивке установлено значение 0xC1
movlw 0xC1 ;установка контрастности (значение 0x65)
call sendispcom ;
Спасибо за быстрый ответ. К сожалению, это не помогло затянуть панель или увеличить контраст. На дисплее ничего не отображается. В чем проблема?
Кроме микроконтроллера остается только один вариант – это неисправный дисплей.
Попробуйте прижать дисплей к плате с разным усилием, а также давить на различные участки дисплея. Можно попробовать разобрать дисплей, почистить контакты на плате и токопроводящую резину спиртом.
если через полосатую резину – на пару секунд окунуть в чистый бензин. Многократно проверено на разных дисплейчиках и индикаторах.
Спасибо за совет!
Большое спасибо за прекрасный материал. Программа работает сразу. Поменял символы на то что хотел, перепрошил, всё получилось.
Теперь задача считать данные ч контроллера HX711, вывести на экран вес и обороты бесколлекторного двигателя, которым предполагается управлять с этого же (pic16f628a) контроллера.
1.При такой контрастности экран почти черный.
” movlw 0xC1 ;установка контрастности (значение 0x65)
call sendispcom ; ”
опытным путем подобрал :
“movlw 0xb6 ;установка контрастности
call sendispcom ;”
2.Для переворота вывода на 180 градусов нужно
а) координату Х установить в конец строки.
б)обратить байт столбца знакогенератора подпрограммой _mirror;
;**********************************************
_mirror
;W->norm;
;mirror – результат
movwf norm
clrf mirror
btfsc norm,0
bsf mirror,7
btfsc norm,1
bsf mirror,6
btfsc norm,2
bsf mirror,5
btfsc norm,3
bsf mirror,4
btfsc norm,4
bsf mirror,3
btfsc norm,5
bsf mirror,2
btfsc norm,6
bsf mirror,1
btfsc norm,7
bsf mirror,0
return ; (обращенный столбец в mirror)
;***************************************************
в).Заменить
“symb_2 call sendispdat ;вывод байта символа на дисплей
incf nomer,F
”
на
“symb_2 call sendispdat ;вывод байта символа на дисплей
DECF nomer,F
”
(то есть при выводе обращенного столбца ДЕКРЕМЕНТИРОВАТЬ текущую координату Х)
P.S. Я портировал программу на PIC16F1825 (Enhanced Mid-Range). Поэтому у меня функция “viv_symb” здорово отличается от исходной