Re: Символьные строки-константы? (PIC,ASM)
Добавлено: Пн фев 08, 2010 18:55:44
Я работал с pic16 мало и давно (до появления AVR_noise писал(а):По одному символу "вручную"- как-то тупо... или нормально?Код: Выделить всё
movlw Symbol_a ; коды символов определены в начале через .equ LCD_print ; макрос, шлёт данное из W индикатору, внутри ничего интересного movlw Symbol_b LCD_print ...
Есть команда RETLW, осуществляющая взврат из подпрограммы с загрузкой константы в W. Вот этой командой все таблицы и делаются.
В ассемблере должна существовать директива, позволяющая задать последовательность байтов во флеше именно как последовательность этих команд, чтобы не писать
Код: Выделить всё
retlw "H"
retlw "e"
retlw "e"
retlw "l"
retlw "o"
retlw 0Код: Выделить всё
movlw low(msg1)
movwf strptr0
movlw high(msg1) ; чтобы не ставить везде - старший
call out_msg ; заносится в strptr0 уже в начале out_msg
...
movlw low(msg2)
movwf strptr0
movlw high(msg2) ; чтобы не ставить везде - старший
call out_msg ; заносится в strptr0 уже в начале out_msg
; принимает указатель на строку во флеш кода,
; младший байт адреса уже в strptr0, старший в W
out_msg:
movwf strptr1
out_msg_2:
call get_strptr
iorlw 0
btfsc STATUS,Z
return ; завершающий 0, конец строки
call out_char ; вывод одного символа из W
incf strptr0,f
btfsc
incf strptr1,f
goto out_msg_2
get_strptr:
movfw strptr1
movwf PCLATH
movfw strptr0
movwf PCL ; уходим на нужную retlw и возвращаем в out_msg символ
; то, чем в данном ассемблере можно сформировать последоательность
; команд retlw
; хорошо, если так
msg1:
.asciz "Hello!" ; asciz - автоматически с завершающим 0
; сойдёт и так
msg2:
.byte "H", "e", "l", "l", "o", "!", 0 ; а тут завершающий 0 вручную