Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Условное компилирование
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
serge71
Подскажите плз, как можно сделать, на asm : некая подпрограмма использует массив данных (таблицу символов шрифта, определенных как .DB), есть несколько шрифтов.
draw_symbol:
CODE
draw_symbol:

ldi ZL,low(font*2)
ldi ZH,high(font*2)

;загрузка переменных шрифта

lpm width,Z+ ;максимальная ширина символа
lpm heigth,Z+ ;высота для всех символов
lpm bit_p_pixel,Z+;количество байтов шрифта на один пиксел
lpm first_char,Z+;первый символ шрифта в ASCII
lpm last_char,Z+;последний символ шривта в ASCII
и т.д.

font:
.DB 0x02, 0xAC, 0x08, 0x0B, 0x01, 0x20, 0x7E,0x03
.DB 0x01, 0x04, 0x06, 0x05, 0x07, 0x05, 0x01, 0x02, 0x02, 0x03, 0x05, 0x02, 0x02, 0x01, 0x04, 0x05
................................

font8x11:
.DB 0x02, 0xAC, 0x08, 0x0B, 0x01, 0x20, 0x7E,0x03
.DB 0x01, 0x04, 0x06, 0x05, 0x07, 0x05, 0x01, 0x02, 0x02, 0x03, 0x05, 0x02, 0x02, 0x01, 0x04, 0x05

font13x16:
.DB 0x02, 0xAC, 0x08, 0x0B, 0x01, 0x20, 0x7E,0x03
.DB 0x01, 0x04, 0x06, 0x05, 0x07, 0x05, 0x01, 0x02, 0x02, 0x03, 0x05, 0x02, 0x02, 0x01, 0x04, 0x05

какие директивы компилятору указать чтоб при вызове подпрограммы подставлялась нужная таблица.
vvvv
Нужно загружать нужным адресом ZH и ZL до вызова подпрограммы draw_symbol. Или использовать еще один регистр в качестве индекса,
который будет говорить подпрограмме draw_symbol, какую таблицу использовать.
Условное компилирование не поможет. Оно требуется когда нужно сделать тот или иной код до выполнения программы, а не вовремя.
serge71
А мне не требуется менять шрифт во время выполнения программы, он будет постоянен для конкретного отображения(вызова draw_symbol), я что-то не могу разобратья с ifdef ifndif endif и т.п. Может как по другому можно сделать
galjoen
Цитата(serge71 @ Feb 2 2009, 15:11) *
какие директивы компилятору указать чтоб при вызове подпрограммы подставлялась нужная таблица.

Поместите каждую таблицу в свой файл. Обычно с расширением .inc. Например shrift8x8.inc, shrift9x14.inc и т.д. И всё это в каталог INC. И вставляйте оператором .include "INC\shrift8x8.inc" или .include "INC\shrift9x14.inc" и т.д. Вы ведь уже так что-то типа .include "INC\can128def.inc" делаете?
MrYuran
#define CURR_FONT font // font8x11 // font13x16

...
ldi ZL,low(CURR_FONT*2)
ldi ZH,high(CURR_FONT*2)
...
serge71
Цитата(MrYuran @ Feb 2 2009, 15:28) *
#define CURR_FONT font // font8x11 // font13x16

...
ldi ZL,low(CURR_FONT*2)
ldi ZH,high(CURR_FONT*2)
...


Не понимаю строки #define, как таблицу-то выбирать ?

Как сделать так, чтоб перед вызовом draw_symbol происходила подстановка нужной таблицы font = font8x8 или font = 8x11, до её очередного переопределения, не меняя текста подпрограммы, надо всего лишь переопределить переменную.

Цитата(galjoen @ Feb 2 2009, 15:27) *
Поместите каждую таблицу в свой файл. Обычно с расширением .inc. Например shrift8x8.inc, shrift9x14.inc и т.д. И всё это в каталог INC. И вставляйте оператором .include "INC\shrift8x8.inc" или .include "INC\shrift9x14.inc" и т.д. Вы ведь уже так что-то типа .include "INC\can128def.inc" делаете?

Спасибо, попробую, но может есть другие способы
adc
вот так:

CODE
.equ fontcur=font1 // font8x11 // font13x16// <-- здесь разкоментить нужный(используемый) шрифт.

.IF fontcur==font1
myFont:
.db....
.db....
.MESSAGE "use font1"
.endif

.IF fontcur==font8x11
myFont:
.db....
.db....
.MESSAGE "use font8x11"
.endif

.IF fontcur==font13x16
myFont:
.db....
.db....
.endif


Загружаете с адреса по метке myFont.
ps:исправил "=" на "=="
serge71
Это всё понятно, так прекрасно работает, но только шрифт один и тот же во всем проекте, а надо чтоб для отдельных строк использовался другой шрифт.

Цитата(adc @ Feb 2 2009, 16:04) *
вот так:


А как быть с тремя одинаковыми меиками myFont ?
_Pasha
Код
.dseg

pending_font:.byte  2; делаем глобальную переменную,
                             ;в которую перед выводом строки
                            ;пишем адрес фонта       
;пример
; ldi ZL,low(font8x11 << 1)
; ldi ZH,high(font8x11 << 1)
; sts pending_font,ZL
; sts pending_font+1,ZH                             

.cseg
draw_symbol:
    lds  ZL, pending_font
    lds  ZH,pending_font+1
;далее по тексту
adc
Цитата(serge71 @ Feb 2 2009, 16:25) *
А как быть с тремя одинаковыми меиками myFont ?

) дак в том то и дело что метка то одна! Это условное компилирование. При сборке пректа в контроллер прошьется только та часть которая определена.
А на счет разных шрифтов в программе.. то условное компилирование не причем. Сначало определяете нужный шрифт(загружаете метку )
Код
ldi ZL,low(...*2)
ldi ZH,high(...*2)

а потом вызываете свою пп без строк:
Код
ldi ZL,low(font*2)
    ldi ZH,high(font*2)
_Pasha
Цитата(serge71 @ Feb 2 2009, 16:25) *
Это всё понятно, так прекрасно работает, но только шрифт один и тот же во всем проекте, а надо чтоб для отдельных строк использовался другой шрифт.


Это не условная компиляция sad.gif
serge71
Цитата(_Pasha @ Feb 2 2009, 16:28) *
Код
;пример
;далее по тексту

Такое решение было, спасибо

Цитата(adc @ Feb 2 2009, 16:32) *
) дак в том то и дело что метка то одна! Это условное компилирование. При сборке пректа в контроллер прошьется только та часть которая определена.
А на счет разных шрифтов в программе.. то условное компилирование не причем. Сначало определяете нужный шрифт(загружаете метку )

Я понял, но у меня компилятор ругается на все:
.if CURR_FONT==font8x11

Цитата(_Pasha @ Feb 2 2009, 16:35) *
Это не условная компиляция sad.gif

Ну может я не так сформулировал
adc
Цитата(serge71 @ Feb 2 2009, 16:40) *
Я понял, но у меня компилятор ругается на все:
.if CURR_FONT==font8x11

а на что именно он ругается? Все должно работать если правильно написали!
может ему не нравится обозначение ..8х11.. попробуйте другое
smac
Цитата(serge71 @ Feb 2 2009, 16:40) *
Я понял, но у меня компилятор ругается на все:
.if CURR_FONT==font8x11


Ну может я не так сформулировал

Попробуйте так как Вам советовал adc, только с небольшими изменениями
Код
#define   font8x11 //  - выбираем font8x11, главное чтобы далее в программе не было метки с именем выбираемого шрифта
// естественно если нужен font13x16, то написать его имя

#IFDEF     font8x11    
myFont:
.db....
.db....
.MESSAGE "use font8x11"
#endif

#IFDEF     font13x16
myFont:
.db....
.db....
.MESSAGE "use font13x16"
#endif

Выше приведенное может использоваться с АВРовским ассемблером начиная с версии 2.0
serge71
Цитата(smac @ Feb 2 2009, 22:29) *
Попробуйте так как Вам советовал adc, только с небольшими изменениями

Спасибо вечером попробую
defunct
Цитата(serge71 @ Feb 2 2009, 15:40) *
Цитата

Это не условная компиляция
Ну может я не так сформулировал

Ну так переформулируй.
Ответ для реализации того, что тебе нужно - уже дан в посте #2. Вдумчиво прочитай и реализуй.
Никакие ifdef, .IF тебе тут не помогут, потому что они предназначены совсем для другого.
serge71
Цитата(defunct @ Feb 3 2009, 14:34) *
Ну может я не так сформулировал

Ну так переформулируй.
Ответ для реализации того, что тебе нужно - уже дан в посте #2. Вдумчиво прочитай и реализуй.
Никакие ifdef, .IF тебе тут не помогут, потому что они предназначены совсем для другого.
Реализовано уже было как во#2 посте, хотел понять можно ли это сделать на этапе компиляции, видимо это был оптимальный вариант.
defunct
Цитата(serge71 @ Feb 3 2009, 18:50) *
Реализовано уже было как во#2 посте, хотел понять можно ли это сделать на этапе компиляции, видимо это был оптимальный вариант.

К сожалению это единственный возможный вариант в данном случае
ermilovd
Вот кусочек моей старой проги на асме (AStudio) c условной компиляцией табличных данных (во FLASH-памяти)

CODE
.org $1000
Table_Altera:
;*******************************************************************************
.equ TYPE_BLOCK = 6 ; или 0,1,2,3,4,5
;*******************************************************************************
.IF TYPE_BLOCK == 0
.include "mv01_old39.inc"
.equ OUT_PORT = PORTB
.Equ UR_C = PB4
.Equ UR_B = PB5
.ELIF TYPE_BLOCK == 1
.include "mv01_new1.inc"
.equ OUT_PORT = PORTE
.Equ UR_C = PE2
.Equ UR_B = PE3
.ELIF TYPE_BLOCK == 2 ; Very OLD OTS
.include "mv01_old_rl1.inc"
.equ OUT_PORT = PORTB
.Equ UR_C = PB4
.Equ UR_B = PB5
.ELIF TYPE_BLOCK == 3 ; Very OLD OTS Test
.include "mv01_old_rl1_test.inc"
.equ OUT_PORT = PORTB
.Equ UR_C = PB4
.Equ UR_B = PB5
.ELIF TYPE_BLOCK == 4
.include "mv01_p4b3t.inc" ; for oldOTS
.equ OUT_PORT = PORTB
.Equ UR_C = PB4
.Equ UR_B = PB5
.ELIF TYPE_BLOCK == 5
.include "mv01_testrl.inc"
.equ OUT_PORT = PORTB
.Equ UR_C = PB4
.Equ UR_B = PB5
.ELIF TYPE_BLOCK == 6
.include "mv01f_000501.inc"
.equ OUT_PORT = PORTE
.Equ UR_C = PE2
.Equ UR_B = PE3 ; B_NApr
.ENDIF
;*******************************************************************************

Структура *.inc-файлов :
Код
.db 0x17,0x1F,0x27,0x2E,0x2F,0x33,0x37,0x3A,0x3B,0x3E
.db 0xFF,0xFF,0xFF,0x01,0x7E,0xE7,0x1F,0x62,0x7B,0x3C
.db 0x33,0xFF,0x47,0xA0,0x09,0x30,0x01,0x26,0xD0,0x04
.db 0xC0,0x80,0x13,0x33,0x03,0x60,0x33,0x64,0x35,0x81
.db 0x26,0x40,0x06,0x9A,0x33,0x18,0x68,0x02,0x64,0xC0
.db 0x0C,0x80,0x01,0x00,0x10,0x0C,0x34,0x01,0x30,0x33
.db 0x06,0xC0,0x33,0x13,0x60,0x02,0x64,0xA0,0x09,0x90
serge71
Цитата(ermilovd @ Feb 9 2009, 11:45) *
Вот кусочек моей старой проги на асме (AStudio) c условной компиляцией табличных данных (во FLASH-памяти)

Таким способом не возможно выбирать таблицу перед выполнением процедуры вывода символа (по крайне мере у меня не получилось)
XVR
Цитата(serge71 @ Feb 2 2009, 16:40) *
Ну может я не так сформулировал
bb-offtopic.gif
К хирургу прибегает молодой человек и с порога заявляет:
- Доктор, срочно кастрируйте меня!
- Зачем ?!, у вас эе еще вся жизнь впереди !
- Ну надо, срочно, я потом объясню.
Ну раз надо, то надо. Доктор отрезал, что просили. После операции спрашивает:
- Ну так зачем?
- Понимаете, доктор. Я собираюсь женится, а невеста у меня еврейка, а у них там с этим очень строго.
- А, так вам надо было сделать обрезание!
- А что, я как то не так сказал ??
demiurg_spb
Анекдот очень к местуsmile.gif
Цитата(serge71 @ Feb 10 2009, 22:45) *
Таким способом не возможно выбирать таблицу перед выполнением процедуры вывода символа (по крайне мере у меня не получилось)
Если Вам нужно менять активную таблицу во время выполнения программы, то это никого отношения к условной компиляции не имеет. Вам нужно просто напросто сделать двумерный или Н-мерный массив из нескольких таблиц и изменять на лету номер индекса активной таблицы. Или передавать указатель в Вашу функцию на требуемую таблицу, что более разумно...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.