.include "usb1287def.inc"



.def key_pos = r18
.def key_val =r19
.def temp_1 =r20
.def temp_2 =r21
.def const_0 = r2
.dseg
.org 0x0100
sumbol_value: .byte 24 //Значения символов
position_value: .byte 1 //Значения для соответствующих позиций
save_write_keys: .byte 1 //Сюда заносятся коды нажатых клавиш для дальнейшего вывода на дисплей

.cseg 
.org 0x00
rjmp RESET
//другие вектора прерываний
.org 0x64
ldi r16, low(RAMEND) out SPL, r16
ldi r16, high(RAMEND) out SPH, r16 //Инициализация стека
//Инициализация соответствующих линий для клавиатуры
ldi r16, 0b00001111 // - по горизонтали 
out ddrb , r16
out portb, r16
ldi r16, 0b00111111// - по вертикали
out ddrc, r16
out portc, r16
ldi key_pos, 0
mov const_0, key_pos
/*ldi r16, value_for_lcd_1 sts sumbol_value   //Загрузка значений для каждого символа цифры
ldi r16, value_for_lcd_2 sts sumbol_value+1
ldi r16, value_for_lcd_3 sts sumbol_value+2
ldi r16, value_for_lcd_4 sts sumbol_value+3*/ //Вместо  value_for_lcd подставляешь свои значения
//........................................
// и т.д.
//Тоже самое делаешь для position_value

main:
 rcall write_lcd
rjmp main

write_lcd:
//Здесь реализуешь свой алгоритм вывода данных на дисплей
ret

delay_1:
//Здесь реализуешь код задежки
ret

INT_0://Нажатие клавиши

rcall delay_1//Делаем задержку, чтобы успеть замкнуть все контакты
 ldi temp_1, 0
 ldi temp_2, 0
 in r16, PORTB
 in r17, PORTC

//находим значение по горизонтали
  sbrc r16,0 rjmp next_1
  ldi temp_1,1 rjmp next_4
next_1:
  sbrc r16,1 rjmp next_2
  ldi temp_1,2 rjmp next_4
next_2:
  sbrc r16,2 rjmp next_3
  ldi temp_1,3 rjmp next_4
next_3:
  sbrc r16,3 rjmp next_4
  ldi temp_1,4 
 
//находим значение по вертикали 
next_4:
  sbrc r17,0 rjmp next_5
  ldi temp_2,1 rjmp next_10
next_5:
  sbrc r17,1 rjmp next_6
  ldi temp_2,2 rjmp next_10
next_6:
  sbrc r17,2 rjmp next_7
  ldi temp_2,3 rjmp next_10
next_7:
  sbrc r17,3 rjmp next_8
  ldi temp_2,4 rjmp next_10
next_8:
  sbrc r17,4 rjmp next_9
  ldi temp_2,5 rjmp next_10
next_9:
  sbrc r17,5 
  ldi temp_2,6 rjmp next_10

 rjmp end_i
 next_10:
//Проверяем правильность нажатия клавиши
 tst temp_1  breq end_i
 tst temp_2  breq end_i

 
 mul temp_1, temp_2 //Узнаём номер клавиши
 mov key_val, r0 
 ldi r29, save_write_keys&0xff
 ldi r30, (save_write_keys&0xff00)>>8//Устанавливаем адрес 
 add r29, key_pos adc r30, const_0
 st Z, key_val //Добавляем код нажатой клавиши в массив
 inc key_pos 



end_i:
reti

