пробел, стереть символ, очистить дисплей, и перемещение курсора влево,
вправо, вверх, вниз.
Начнем с букв и символов. Как я уже говорил, к каждой кнопке мы
прикрутим по 4 символа. Для этого создадим таблицы этих символов, по
которым мы будем их перебирать:
1
2
3
4
5
6
7
8
9
Letter_K_Table1: .
0x2E,0x2C,0x3F,0x21,0, 0 ;""., ",", "?", "!"
Letter_K_Table2: .db 0xE0,0xE1,0xE2,0xE3,0, 0 ;а, б, в, г
Letter_K_Table3: .db 0xE4,0xE5,0xE6,0xE7,0, 0 ;д, е, ж, з
Letter_K_Table4: .db 0xE8,0xE9,0xEA,0xEB,0, 0 ;и, й, к, л
Letter_K_Table5: .db 0xEC,0xED,0xEE,0xEF,0, 0 ;м, н, о, п
Letter_K_Table6: .db 0xf0,0xf1,0xf2,0xf3,0, 0 ;р, с, т, у
Letter_K_Table7: .db 0xf4,0xf5,0xf6,0xf7,0, 0 ;ф, х, ц, ч
Letter_K_Table8: .db 0xf8,0xf9,0xfa,0xfb,0, 0 ;ш, щ, ъ, ы
Letter_K_Table9: .db 0xfc,0xfd,0xfe,0xff,0, 0 ;ь, э, ю, я
Тут последовательно забиты строчные буквы кирилицы в ANSI кодировке.
каждая таблица заканчивается нулем. так как в таблице должно быть четное
количество байт, то я добавил еще по нулю вконце. Это немного
расточительно с точки зрения использования памяти, но увы и ах - адресация
у нас тут словами.
Очевидно предположить, что при нажатии любой из девяти кнопок будет
выполняться один и тот же код, но будут использоваться разные данные. А
это значит, что мы создадим функцию, в которую будут передаваться номер
нажатой кнопки и адрес начала нашей таблицы с символами для этой кнопки.
Таблицы были только что описаны выше.
В обработчике нажатия первой кнопки Key1 запишем следующий код:
1
2
3
4
5
6
; символы "." "," "?" "!"
key1: LDI ZL,low(Letter_K_Table1*2) ; загружаем в Z адрес
начала таблицы
LDI ZH,high(Letter_K_Table1*2) ; с символами,
принадлежащей первой кнопке
LDI R16,1 ; загружаем в R16 номер
нажатой кнопки
RCALL lcd_write_l ; вызов функции вывода
символа в видеопамять