ReAl (01.09.2011 13:20, просмотров: 203) ответил mazur на С еором ничего не выйдет. Все равно нужно сохранять LCD_DATA. r16-младшая тетрада-управление. Старшая тетрада-шина данных. На LCD сначала отправляется старшая тетрада, затем младшая.
Возможно, я и ошибаюсь. Но LCD_DATA "сохраняется" в своем же регистре, никуда не исчезая. Проверьте было:
push LCD_DATA ; сохранили
andi LCD_DATA,0xF0 ; выделили старшую часть (убили младшую)
in r16,DATA_PORT ; врезали старшую часть LCD_DATA
andi r16,0x0F ; в часть данных
or r16,LCD_DATA ; образа порта LCD
out DATA_PORT,r16 ; отправили СТАРШУЮ часть
...
andi r16, 0x0F ; убили старшую часть LCD_DATA в образе порта LCD
pop LCD_DATA ; восстановили всё содержимое LCD_DATA
swap LCD_DATA ; младшую часть LCD_DATA
andi LCD_DATA,0xF0 ; перенесли в старшую и замаскировали
or r16,LCD_DATA ; врезали в старшую часть образа порта
out DATA_PORT,r16 ; отправили МЛАДШУЮ часть
стало:
in r16,DATA_PORT ;
andi r16, 0x0F ;
; Для старшей части LCD_DATA это будет фактически OR, так как в R16 там нули
; Т.е. в старшей части R16 будет уже нужная часть LCD_DATA
; в младшей части R16 сидит XOR нужного с младшей частью LCD_DATA
eor r16, LCD_DATA
; убиваем старшую часть LCD_DATA, она уже не нужна, младшая сохранилась
andi LCD_DATA, 0x0F
; старшая часть R16 не меняется, в LCD_DATA там нули
; младшая часть R16 восстанавливается
; low4(R16) ^ low4(LCD_DATA) ^ low4(LCD_DATA) == low4(R16)
eor r16, LCD_DATA
out DATA_PORT,r16 ; отправили СТАРШУЮ часть
...
andi r16, 0x0F ; убили старшую часть LCD_DATA в образе порта LCD
swap LCD_DATA ; младшую часть LCD_DATA перенесли в старшую
or r16,LCD_DATA ; и врезали в R16
out DATA_PORT,r16 ; отправили МЛАДШУЮ часть