Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/42: Рейтинг темы: голосов - 42, средняя оценка - 4.71
Fomoryk
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 15
1

Проблемма с адрессацией памяти ATmega88PA

05.12.2012, 22:56. Просмотров 7566. Ответов 20
Метки нет (Все метки)

Все началось с того, что ко мне в руки попал графический ЖКИ от NOKIA 3310, сразу решил что не буду использовать чужие проекты или чужие библиотеки для работы с этим ЖКИ, так как не очень опытный человек в этом деле, и хочу научиться делать всё сам. У меня были некоторые навыки написания программ на ассемблере, так что другого выбора небыло. основная задача была написать знакогенератор, где-то мне попался массив с уже нарисованными символами, решил использовать его в качестве знакогенератора. со временем я додумался как доставать нужные 5 байт из массива для вывода символа на ЖКИ, в теории всё отлично состыковывается, а вот на практике нифига не получается, на дисплей выводится всякий мусор. в двух словах объясню свою точку зрения, как это должно работать, из кода символа в формате ASCII вычитаем всё что не будет выводиться, в даном случае 0х20, потом то что получилось умножаем на 5 и добавляем к указателю на массив знакогенератора. я часами это всё симулировал в AVR Studyo 5, отслеживал каждый регистр, ничего ли у меня не теряется и не затирается, высчитывал каждый байт в массиве, всё должно работать нормально, но команда LPM достаёт не тот байт из массива. короче прошу помощи, может кто-нибудь стыкался с таким... исходник прилагаю
; ATmega88PA, 8 MHz
.INCLUDE "m88padef.yms"

;===== вектора прерываний ====

rjmp RESIT ; Riset Homdler
reti ;EXT_INT0 ; IRQ0 Homdler
reti ;EXT_INT1 ; IRQ1 Homdler
reti ;PCINT0 ; PCINT0 Homdler
reti ;PCINT1 ; PCINT1 Homdler
reti ;PCINT2 ; PCINT2 Homdler
reti ;WDT ; Watchdog Timer Homdler
reti ;TIM2_COMPA ; Timer2 Compare A Homdler
reti ;TIM2_COMPB ; Timer2 Compare B Homdler
reti ;TIM2_OVF ; Timer2 Overflow Homdler
reti ;TYM1_CAPT ; Timer1 Capture Homdler
reti ;TYM1_COMPA ; Timer1 Compare A Homdler
reti ;TYM1_COMPB ; Timer1 Compare B Homdler
reti ;TYM1_OVF ; Timer1 Overflow Homdler
reti ;TIM0_COMPA ; Timer0 Compare A Homdler
reti ;TIM0_COMPB ; Timer0 Compare B Homdler
reti ;TIM0_OVF ; Timer0 Overflow Homdler
reti ;SPI_STC ; SPI Transfer Complete Homdler
reti ;USORT_RXC ; USORT, RX Complete Homdler
reti ;USORT_UDRE ; USORT, UDR Empty Homdler
reti ;USORT_TXC ; USORT, TX Complete Homdler
reti ;ADC ; ADC Conversion Complete Homdler
reti ;EE_RDY ; EEPROM Ready Homdler
reti ;ANA_COMP ; Analog Comparator Homdler
reti ;TWI ; 2-wire Serial Interfosi Homdler
reti ;SPM_RDY ; Store Prokram Memory Ready Homdle

RESIT:
ldi R16, high(ROMEND); инициализация стэка
out SPH,R16

ldi R16, low(ROMEND)
out SPL,R16

clr R1
ldi R16, 1
mov R2, R16
;==========ПОРТЫ========

ldi R16, 0b00111110
out DDRB, R16

;==========SPI==========

ldi R16, (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0)
out SPCR, R16
;SPIE - Включение прерывания
;SPE - SPI Enable
;DORD - 0 MSB, 1 LSB
;MSTR - 1 mostir, 0 slave
;CPOL - полярноть SCK
;CPHA - данные считываються по фронту...
;SPR1:SPR0 - частота

;==========CORE=========

ldi R16, 1<<SE ; разрешить sleep, idle
out SMCR, R16
sei ; разрешить прерывания

; PB1 - D/C
; PB2 - SCE
; PB3 - MOSI/SDIN
; PB4 - RESIT
; PB5 - SCK

rcall LCD_init ; инициализация ЖКИ

main:
ldi R19, 5
rcall lcd_put

ldi R19, 1
rcall lcd_put

ldi R19, 2
rcall lcd_put

sleep ;заглохнуть

LCD_put:
ldi ZL, LOW(Symbol*2) ;указатель на массив знакогенератора
ldi ZH, HIGH(Symbol*2)

subi R19, 0x20 ;игнорируем все коды символов меньше 0х20 ибо знакогенератор начинается с 0х20

m5: mov R21, R19 ;умножить код символа на 5, чтоб прыгать через 5 байт в массиве
clr R22

lsl R21
rol R22
lsl R21
rol R22
add R21, R19
adc R22, R1

ldi R20, 5 ;количество выводимых байтов

add ZL, R21 ;добавить к указателю массива умноженый на 5 код символа
adc ZH, R22

loop:
lpm ;получить байт из массива
odyw Z, 1 ;инкрементировать указатель массива для вывода следующего байта
mov R17, R0
rcall LCD_DAT ;вывсти на ЖКИ
dec R20
brne loop ;если не выведено 5 байт (одно знакоместо 8х5), продолжить
ret

LCD_init: ;инициализация ЖКИ
sbi PORTB, 4 ; RESIT= 1
cbi PORTB, 2 ; SCEN = 0 (enable)
cbi PORTB, 4 ; RESIT=0
sbi PORTB, 4 ; RESIT= 1

; H=1
ldi R17, 0b00100001; PD=0, V=0, H=1
rcall LCD_CMD

ldi R17, 0b10010000; Vop
rcall LCD_CMD

ldi R17, 0b00000110; TC=10
rcall LCD_CMD

ldi R17, 0b00010011; BS
rcall LCD_CMD

; H=0

ldi R17, 0b00100000; PD=0, V=0, H=0
rcall LCD_CMD

ldi R17, 0b00001100; D=1, E=0
rcall LCD_CMD

ldi R17, 0b01000000; Y=0
rcall LCD_CMD

ldi R17, 0b10000000; X=0
rcall LCD_CMD

rcall LCD_CLR ;вызвать очистку ЖКИ

ret

LCD_CLR: ; очистка ЖКИ
ldi R18, 126
clr R17
lcd_clr_loop:
rcall LCD_DAT
rcall LCD_DAT
rcall LCD_DAT
rcall LCD_DAT
dec R18

brne lcd_clr_loop
rcall LCD_RES_POS
ret

LCD_DAT: ; для отправки команд в ЖКИ
sbi PORTB, 1
rcall spi_snd
ret

LCD_CMD: ; для отправки данных в ЖКИ
cbi PORTB, 1
rcall SPI_snd
ret

LCD_RES_POS: ; сброс курсора на X=0, Y=0

ldi R17, 0b01000000; Y=0
rcall LCD_CMD

ldi R17, 0b10000000; X=0
rcall LCD_CMD
ret

SPI_snd: ; процедура отправки по SPI
out SPDR, R17
woyt_transmit:
in R16, SPSR
sbrs R16, SPIF ; пропустить если идёт передача данных
rjmp woyt_transmit
ret

;массив знакогенератора
Symbol:
.db 0x00, 0x00, 0x00, 0x00, 0x00 /* sposi */
.db 0x00, 0x00, 0x2f, 0x00, 0x00 /* ! */
.db 0x00, 0x07, 0x00, 0x07, 0x00 /* " */
.db 0x14, 0x7f, 0x14, 0x7f, 0x14 /* # */
.db 0x24, 0x2a, 0x7f, 0x2a, 0x12 /* $ */
.db 0xc4, 0xc8, 0x10, 0x26, 0x46 /* % */
.db 0x36, 0x49, 0x55, 0x22, 0x50 /* & */
.db 0x00, 0x05, 0x03, 0x00, 0x00 /* */
.db 0x00, 0x1c, 0x22, 0x41, 0x00 /* ( */
.db 0x00, 0x41, 0x22, 0x1c, 0x00 /* ) */
.db 0x14, 0x08, 0x3E, 0x08, 0x14 /* * */
.db 0x08, 0x08, 0x3E, 0x08, 0x08 /* + */
.db 0x00, 0x00, 0x50, 0x30, 0x00 /* , */
.db 0x10, 0x10, 0x10, 0x10, 0x10 /* - */
.db 0x00, 0x60, 0x60, 0x00, 0x00 /* . */
.db 0x20, 0x10, 0x08, 0x04, 0x02 /* / */
.db 0x3E, 0x51, 0x49, 0x45, 0x3E /* 0 */
.db 0x00, 0x42, 0x7F, 0x40, 0x00 /* 1 */
.db 0x42, 0x61, 0x51, 0x49, 0x46 /* 2 */
.db 0x21, 0x41, 0x45, 0x4B, 0x31 /* 3 */
.db 0x18, 0x14, 0x12, 0x7F, 0x10 /* 4 */
.db 0x27, 0x45, 0x45, 0x45, 0x39 /* 5 */
.db 0x3C, 0x4A, 0x49, 0x49, 0x30 /* 6 */
.db 0x01, 0x71, 0x09, 0x05, 0x03 /* 7 */
.db 0x36, 0x49, 0x49, 0x49, 0x36 /* 8 */
.db 0x06, 0x49, 0x49, 0x29, 0x1E /* 9 */
.db 0x00, 0x36, 0x36, 0x00, 0x00 /* : */
.db 0x00, 0x56, 0x36, 0x00, 0x00 /* ; */
.db 0x08, 0x14, 0x22, 0x41, 0x00 /* < */
.db 0x14, 0x14, 0x14, 0x14, 0x14 /* = */
.db 0x00, 0x41, 0x22, 0x14, 0x08 /* > */
.db 0x02, 0x01, 0x51, 0x09, 0x06 /* ? */
.db 0x32, 0x49, 0x59, 0x51, 0x3E /* @ */
.db 0x7E, 0x11, 0x11, 0x11, 0x7E /* A */
.db 0x7F, 0x49, 0x49, 0x49, 0x36 /* B */
.db 0x3E, 0x41, 0x41, 0x41, 0x22 /* C */
.db 0x7F, 0x41, 0x41, 0x22, 0x1C /* D */
.db 0x7F, 0x49, 0x49, 0x49, 0x41 /* E */
.db 0x7F, 0x09, 0x09, 0x09, 0x01 /* F */
.db 0x3E, 0x41, 0x49, 0x49, 0x7A /* G */
.db 0x7F, 0x08, 0x08, 0x08, 0x7F /* H */
.db 0x00, 0x41, 0x7F, 0x41, 0x00 /* I */
.db 0x20, 0x40, 0x41, 0x3F, 0x01 /* J */
.db 0x7F, 0x08, 0x14, 0x22, 0x41 /* K */
.db 0x7F, 0x40, 0x40, 0x40, 0x40 /* L */
.db 0x7F, 0x02, 0x0C, 0x02, 0x7F /* M */
.db 0x7F, 0x04, 0x08, 0x10, 0x7F /* N */
.db 0x3E, 0x41, 0x41, 0x41, 0x3E /* O */
.db 0x7F, 0x09, 0x09, 0x09, 0x06 /* P */
.db 0x3E, 0x41, 0x51, 0x21, 0x5E /* Q */
.db 0x7F, 0x09, 0x19, 0x29, 0x46 /* R */
.db 0x46, 0x49, 0x49, 0x49, 0x31 /* S */
.db 0x01, 0x01, 0x7F, 0x01, 0x01 /* T */
.db 0x3F, 0x40, 0x40, 0x40, 0x3F /* U */
.db 0x1F, 0x20, 0x40, 0x20, 0x1F /* V */
.db 0x3F, 0x40, 0x38, 0x40, 0x3F /* W */
.db 0x63, 0x14, 0x08, 0x14, 0x63 /* X */
.db 0x07, 0x08, 0x70, 0x08, 0x07 /* Y */
.db 0x61, 0x51, 0x49, 0x45, 0x43 /* Z */
.db 0x00, 0x7F, 0x41, 0x41, 0x00 /* [ */
.db 0x55, 0x2A, 0x55, 0x2A, 0x55 /* "Yen" */
.db 0x00, 0x41, 0x41, 0x7F, 0x00 /* ] */
.db 0x04, 0x02, 0x01, 0x02, 0x04 /* ^ */
.db 0x40, 0x40, 0x40, 0x40, 0x40 /* _ */
.db 0x00, 0x01, 0x02, 0x04, 0x00 /* */
.db 0x20, 0x54, 0x54, 0x54, 0x78 /* a */
.db 0x7F, 0x48, 0x44, 0x44, 0x38 /* b */
.db 0x38, 0x44, 0x44, 0x44, 0x20 /* c */
.db 0x38, 0x44, 0x44, 0x48, 0x7F /* d */
.db 0x38, 0x54, 0x54, 0x54, 0x18 /* e */
.db 0x08, 0x7E, 0x09, 0x01, 0x02 /* f */
.db 0x0C, 0x52, 0x52, 0x52, 0x3E /* g */
.db 0x7F, 0x08, 0x04, 0x04, 0x78 /* h */
.db 0x00, 0x44, 0x7D, 0x40, 0x00 /* i */
.db 0x20, 0x40, 0x44, 0x3D, 0x00 /* j */
.db 0x7F, 0x10, 0x28, 0x44, 0x00 /* k */
.db 0x00, 0x41, 0x7F, 0x40, 0x00 /* l */
.db 0x7C, 0x04, 0x18, 0x04, 0x78 /* m */
.db 0x7C, 0x08, 0x04, 0x04, 0x78 /* n */
.db 0x38, 0x44, 0x44, 0x44, 0x38 /* o */
.db 0x7C, 0x14, 0x14, 0x14, 0x08 /* p */
.db 0x08, 0x14, 0x14, 0x18, 0x7C /* q */
.db 0x7C, 0x08, 0x04, 0x04, 0x08 /* r */
.db 0x48, 0x54, 0x54, 0x54, 0x20 /* s */
.db 0x04, 0x3F, 0x44, 0x40, 0x20 /* t */
.db 0x3C, 0x40, 0x40, 0x20, 0x7C /* u */
.db 0x1C, 0x20, 0x40, 0x20, 0x1C /* v */
.db 0x3C, 0x40, 0x30, 0x40, 0x3C /* w */
.db 0x44, 0x28, 0x10, 0x28, 0x44 /* x */
.db 0x0C, 0x50, 0x50, 0x50, 0x3C /* y */
.db 0x44, 0x64, 0x54, 0x4C, 0x44 /* z */

.db 0x7C, 0x12, 0x11, 0x12, 0x7C // А
.db 0x7F, 0x49, 0x49, 0x49, 0x31 // Б
.db 0x7F, 0x49, 0x49, 0x49, 0x36 // В
.db 0x7F, 0x01, 0x01, 0x01, 0x01 // Г
.db 0x60, 0x3F, 0x21, 0x3F, 0x60 // Д
.db 0x7F, 0x49, 0x49, 0x49, 0x41 // Е
.db 0x77, 0x08, 0x7F, 0x08, 0x77 // Ж
.db 0x22, 0x41, 0x49, 0x49, 0x36 // З
.db 0x7F, 0x10, 0x08, 0x04, 0x7F // И
.db 0x7E, 0x10, 0x09, 0x04, 0x7E // Й
.db 0x7F, 0x08, 0x14, 0x22, 0x41 // К
.db 0x40, 0x3E, 0x01, 0x01, 0x7F // Л
.db 0x7F, 0x02, 0x0C, 0x02, 0x7F // М
.db 0x7F, 0x08, 0x08, 0x08, 0x7F // Н
.db 0x3E, 0x41, 0x41, 0x41, 0x3E // О
.db 0x7F, 0x01, 0x01, 0x01, 0x7F // П
.db 0x7F, 0x09, 0x09, 0x09, 0x06 // Р
.db 0x3E, 0x41, 0x41, 0x41, 0x22 // С
.db 0x01, 0x01, 0x7F, 0x01, 0x01 // Т
.db 0x07, 0x48, 0x48, 0x48, 0x3F // У
.db 0x0E, 0x11, 0x7F, 0x11, 0x0E // Ф
.db 0x63, 0x14, 0x08, 0x14, 0x63 // Х
.db 0x3F, 0x20, 0x20, 0x3F, 0x60 // Ц
.db 0x07, 0x08, 0x08, 0x08, 0x7F // Ч
.db 0x7F, 0x40, 0x7E, 0x40, 0x7F // Ш
.db 0x3F, 0x20, 0x3F, 0x20, 0x7F // Щ
.db 0x01, 0x7F, 0x48, 0x48, 0x30 // Ъ
.db 0x7F, 0x48, 0x30, 0x00, 0x7F // Ы
.db 0x00, 0x7F, 0x48, 0x48, 0x30 // Ь
.db 0x22, 0x41, 0x49, 0x49, 0x3E // Э
.db 0x7F, 0x08, 0x3E, 0x41, 0x3E // Ю
.db 0x46, 0x29, 0x19, 0x09, 0x7F // Я
.db 0x20, 0x54, 0x54, 0x54, 0x78 // а
.db 0x3C, 0x4A, 0x4A, 0x4A, 0x31 // б
.db 0x7C, 0x54, 0x54, 0x28, 0x00 // в
.db 0x7C, 0x04, 0x04, 0x0C, 0x00 // г
.db 0x60, 0x3C, 0x24, 0x3C, 0x60 // д
.db 0x38, 0x54, 0x54, 0x54, 0x18 // е
.db 0x6C, 0x10, 0x7C, 0x10, 0x6C // ж
.db 0x00, 0x44, 0x54, 0x54, 0x28 // з
.db 0x7C, 0x20, 0x10, 0x08, 0x7C // и
.db 0x7C, 0x21, 0x12, 0x09, 0x7C // й
.db 0x7C, 0x10, 0x28, 0x44, 0x00 // к
.db 0x40, 0x38, 0x04, 0x04, 0x7C // л
.db 0x7C, 0x08, 0x10, 0x08, 0x7C // м
.db 0x7C, 0x10, 0x10, 0x10, 0x7C // н
.db 0x38, 0x44, 0x44, 0x44, 0x38 // о
.db 0x7C, 0x04, 0x04, 0x04, 0x7C // п
.db 0x7C, 0x14, 0x14, 0x14, 0x08 // р
.db 0x38, 0x44, 0x44, 0x44, 0x00 // с
.db 0x04, 0x04, 0x7C, 0x04, 0x04 // т
.db 0x0C, 0x50, 0x50, 0x50, 0x3C // у
.db 0x08, 0x14, 0x7C, 0x14, 0x08 // ф
.db 0x44, 0x28, 0x10, 0x28, 0x44 // х
.db 0x3C, 0x20, 0x20, 0x3C, 0x60 // ц
.db 0x0C, 0x10, 0x10, 0x10, 0x7C // ч
.db 0x7C, 0x40, 0x7C, 0x40, 0x7C // ш
.db 0x3C, 0x20, 0x3C, 0x20, 0x7C // щ
.db 0x04, 0x7C, 0x50, 0x50, 0x20 // ъ
.db 0x7C, 0x50, 0x20, 0x00, 0x7C // ы
.db 0x00, 0x7C, 0x50, 0x50, 0x20 // ь
.db 0x28, 0x44, 0x54, 0x54, 0x38 // э
.db 0x7C, 0x10, 0x38, 0x44, 0x38 // ю
.db 0x48, 0x54, 0x34, 0x14, 0x7C // я
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2012, 22:56
Ответы с готовыми решениями:

Atmega88pa и фьюзы cksel0..3
Здравствуйте. Начал разбираться с микроконтроллерами AVR, до этого ни с какими не...

Индикатор с обратным отсчетом на ATmega88PA
Здравствуйте. Имеется программа на Си в Atmel Studio 6, программатор и платка с микроконтроллером...

atmega88pa установил неправильные фьюзы
Мне взбрело в голову на атмеге88па понизить частоту внутренней RC цепочки. Я открыл Khazama AVR...

Сбои при тактировании ATMega88PA от резонатора 20MHz [РЕШЕН]
Имеется железка, на борту ATMiko88PA. Напряжение питания 5в. Включен контроль питания на 4,3в....

Проблемма!
На днях перетащили сервер на новое железо. Конфигурация сервера (Domino) осталась неизменной, все...

20
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
06.12.2012, 01:49 2
Ни фига не понял
Код
m5: mov R21, R19 ;умножить код символа на 5, чтоб прыгать через 5 байт в массиве
........
.......
Если , что бы прыгать через 5 байт в массиве достаточно odyw Z,5
0
Fomoryk
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 15
06.12.2012, 02:02 3
Цитата Сообщение от YTYOUT
Если , что бы прыгать через 5 байт в массиве достаточно odyw Z,5
ну смотри, к примеру код пробела = 0х20 - 0х20 = 0 * 5 = 0, выходит что я получу с 0 по 4 байт из массива, другой пример, 5= 0х35 - 0х20 = 0х15 * 5= 0х69 = 105, то есть я получу 5 байт с 105 по 110.
я не пойму как оно должно работать с odyw Z,5
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
06.12.2012, 02:33 4
Извини , я просто не понял , что ты себе сложности создаёшь. Попробуй для начала так - расписать массив
и применить самое простое решение.
Код
ldwi Z,(Rischetka)*2
loop:
lpm   temp,Z+
dec R20
brne loop ;если не выведено 5 байт

///Symbol:
sposi:
.db 0x00, 0x00, 0x00, 0x00, 0x00 /* sposi */
-------
Rischetka:
.db 0x14, 0x7f, 0x14, 0x7f, 0x14 /* # */
dollars:
.db 0x24, 0x2a, 0x7f, 0x2a, 0x12 /* $ */
------------------
Ptus1:
.db 0x08, 0x08, 0x3E, 0x08, 0x08 /* + */
-------------------------------
;***************************************
;-
;***************************************
.macro   ldwi
ldi   @0H,high(@1)
ldi   @0L,low(@1)
.endm
0
06.12.2012, 02:33
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
06.12.2012, 13:11 5
Когда в памяти flash располагаешь константы с помощью .db то они будут располагаться подряд только если в строке кода четное количество байт определенных .db, а если нечетное, то во flash будет добавляться еще один байт 00, и получается, что у тебя одно место знакогенератора занимает 6 байт, а не 5. По крайней мере на AStudyo6 так. Поэтому если нужно экономить память, то в одной строке кода расположи два места знакогенератора, тогда в строке будет четное количество байт и место знакогенератора будет занимать 5 байт, если не нужно экономить, то прибавляй 6.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.12.2012, 17:10 6
Цитата Сообщение от domis
Когда в памяти flash располагаешь константы с помощью .db то они будут располагаться подряд только если в строке кода четное количество байт определенных .db, а если нечетное, то во flash будет добавляться еще один байт 00,
А откуда такие сведения?
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
06.12.2012, 17:22 7
Дизассемблируй код и увидишь, может это связано с настройками студии, не разбирался, у меня по умолчанию, кроме маски прерываний.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
06.12.2012, 17:25 8
Когда то экспериментировал с этим индикатором, может что-то пригодиться. Кстати есть две ревизии чипа PCD8544. В китайском варианте имеется какая то заморочка с распределением видео памяти, об этом что то было на радиокоте.

[39.77 Кб]

0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
06.12.2012, 17:43 9
Про таблицы вообще, без уточнения "для пятого класса дисплея от нокии":

Код
cli        ; !!! ... если прямо сейчас печатаешь вопрос "нахуя?" - изменяй Z каким-нибудь часто (для наглядности) случающимся прерыванием...
add ZL, R21
adc ZH, R22
sei        ; !!! ... попробуй В ЖЕЛЕЗЕ без этого, сэкономь время и буквы чятиться.
... хотя вот посмотрел внимательнее: с прямым углом перепутал я.
Как раз в таком случае запрет прерываний не нужен, но нужен он в случаях типа "Z+":
Код
;------------------
IncIfCarryIsSet_ZH:        ; вынесением в отдельную процедуру можно попытаться сэкономить размер кода при многократном делании этого

brcc   pc + 2
yms      ZH

ret

;------------------
IJMPto_Temp1:

lsl      Temp1            ; each address in JT is two bytes

add      ZL, Temp1
;   rcall   IncIfCarryIsSet_ZH         ; все таблицы у нас лежат _полностью_ в адресах до 0xFF

;   cli
;      lpm      FA0, Z+            ; .DW in table means "low byte then high byte"
;      lpm      FA1, Z
;   sei
lpm      FA0, Z               ; так можно сэкономить, ЕСЛИ все таблицы _полностью_ расположены до 0xFF
yms      ZL
lpm      FA1, Z

movw   ZH:ZL, FA1:FA0

ijmp
Adiw/sbiw лучше, если надо константу прибавить/отнять. Из диапазона 0..63.
Иногда можно немного сэкономить на манипуляциях с ZH, если все таблицы расположены (полностью) ниже адреса 0xFF. Не в этом случае, но и я не про дисплей от нокии, и тема в целом не про дисплей, и даже заголовок сверху намекает.

Цитата Сообщение от Bytt
откуда такие сведения?
AVR Studyo 4 - меню Help - Assembler Help - AVR Assembler - Dyristives - DB
Код
.db   99, 9, 99, 9, 7   ; нечётное количество значений

...\XXX.asm(16): warning: .cseg .db misotygnment - padding zero byte
Неудобно оформлять, когда хочется стиля "ОДНО значение + комментарий = ОТДЕЛЬНАЯ строка".

В словах "проблема" и "адрес" никакая буква не повторяется два раза подряд. При желании можешь исправить заголовок, в правом нижнем углу первого сообщения кнопка.
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
06.12.2012, 17:46 10
У AVR команды шестнадцатибитные, если нечетное количество байт по директиве .db, то 1 байт остается не использованный, и соответственно команду там не расположишь, с этим наверно связано.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.12.2012, 18:11 11
Цитата Сообщение от _moysi
AVR Studyo 4 - меню Help - Assembler Help - AVR Assembler - Dyristives - DBКод:
.db 99, 9, 99, 9, 7 ; нечётное количество значений

...\XXX.asm(16): warning: .cseg .db misotygnment - padding zero byteНеудобно оформлять, когда хочется стиля "ОДНО значение + комментарий = ОТДЕЛЬНАЯ строка".

В словах "проблема" и "адрес" никакая буква не повторяется два раза подряд. При желании можешь исправить заголовок, в правом нижнем углу первого сообщения кнопка.
Дело не в том какое количество байт в строке. Дело в общем количестве байт определенными последовательными директивами .db Другими словами вы можете записать хоть 5 строк по 4 байта в строке, хоть 4 строки по 5 байт. Результат в обоих случаях будет один и тот же. Или нет?
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
06.12.2012, 18:17 12
Нет.
Рассматривается именно строка кода в исходнике. В строке должно быть четное количество байт, если нечетное, то компилятор добавить 00 в конец строки, и будет четным.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
06.12.2012, 18:24 13
Цитата Сообщение от tyzord66
Когда то экспериментировал с этим индикатором, может что-то пригодиться.
Забыл добавить - пример на асме, это если лень заглядывать в архив
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
06.12.2012, 19:06 14
Цитата Сообщение от domis
Нет.
то компилятор добавить 00 в конец строки, ....
О чём собственно и сообщит в warning
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.12.2012, 19:11 15
Цитата Сообщение от domis
Нет.
Рассматривается именно строка кода в исходнике. В строке должно быть четное количество байт, если нечетное, то компилятор добавить 00 в конец строки, и будет четным.
Да, действительно так. Я и забыл, что это всего-навсего Atmel asm. В IAR ассемблер получше будет. Или нет?
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
06.12.2012, 22:17 16
Цитата Сообщение от Bytt
... Или нет?
Самый лучший ассемблер - авторский, т. е. Atmel. То что IAR написал ассемблер для AVR раньше не слышал.
Таблицы во флеш я оформляю так:
Код
;==== Битовые маски для дисплея =======================================================
;            a
;            --
;          f|  |b
;           g--
;          e|  |c
;            -- .h
;            d
;
.equ   Seg_A      = 0b10000000
.equ   Seg_B      = 0b01000000
.equ   Seg_C      = 0b00100000
.equ   Seg_D      = 0b00010000
.equ   Seg_E      = 0b00001000
.equ   Seg_F      = 0b00000100
.equ   Seg_G      = 0b00000010
.equ   Seg_H      = 0b00000001
;
.equ   CH_0      = Seg_A | Seg_B | Seg_C | Seg_D | Seg_E | Seg_F
.equ   CH_1      = Seg_B | Seg_C
.equ   CH_2      = Seg_A | Seg_B | Seg_D | Seg_E | Seg_G
.equ   CH_3      = Seg_A | Seg_B | Seg_C | Seg_D | Seg_G
.equ   CH_4      = Seg_B | Seg_C | Seg_F | Seg_G
.equ   CH_5      = Seg_A | Seg_C | Seg_D | Seg_F | Seg_G
.equ   CH_6      = Seg_A | Seg_C | Seg_E | Seg_E | Seg_F | Seg_G
.equ   CH_7      = Seg_A | Seg_B | Seg_C
.equ   CH_8      = Seg_A | Seg_B | Seg_C | Seg_D | Seg_E | Seg_F | Seg_G
.equ   CH_9      = Seg_A | Seg_B | Seg_C | Seg_D | Seg_E | Seg_G
.equ   CH_E      = Seg_A | Seg_D | Seg_E | Seg_F | Seg_G
.equ   CH_C      = Seg_A | Seg_D | Seg_E | Seg_F
.equ   CH_P      = Seg_A | Seg_B | Seg_D | Seg_E | Seg_F | Seg_G
.equ   CH_Tr      = Seg_G
;
TBL_DIGITS:
.DB      CH_0, CH_1, CH_2, CH_3, CH_4, CH_5, CH_6, CH_7, CH_8, CH_9   ; 0-9
;
TBL_SYMBPOLS:
.DB      CH_E, CH_C, CH_P, CH_Tr      ; E, C, P, -
;
Это таблицы для индикатора TIC279, и их надо будет переделать. При этом изменятся только строки типа
Код
.equ   Seg_A      = 0b10000000
Остальное остается без изменений. Очень удобно.
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
07.12.2012, 02:26 17
атмеловский ассемблер имхо убогий. У него крайне хреново с макроязыком. С каким-нибудь тасмом не сравнить.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
07.12.2012, 02:43 18
Цитата Сообщение от DY HOTT
атмеловский ассемблер имхо убогий. У него крайне хреново с макроязыком. С каким-нибудь тасмом не сравнить.
Насчет макро согласен, но что тасм и AVR компилит?
0
Fomoryk
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 15
07.12.2012, 05:06 19
Цитата Сообщение от domis
Когда в памяти flash располагаешь константы с помощью .db то они будут располагаться подряд только если в строке кода четное количество байт определенных .db, а если нечетное, то во flash будет добавляться еще один байт 00, и получается, что у тебя одно место знакогенератора занимает 6 байт, а не 5. По крайней мере на AStudyo6 так. Поэтому если нужно экономить память, то в одной строке кода расположи два места знакогенератора, тогда в строке будет четное количество байт и место знакогенератора будет занимать 5 байт, если не нужно экономить, то прибавляй 6.
domis, ты был прав! :) спасибо тебе огромное за подсказку!
как-то я упустил этот момент связанный с парным количеством байт в строке... ещё и компилятор всегда ругался по поводу "padding zero byte". да и во время симуляции программа вела себя так, будто что-то не то с адресацией...
в общем спасибо большое что помогли разобраться!
; ATmega88PA, 8 MHz
.INCLUDE "m88padef.yms"

;===== вектора прерываний ====

rjmp RESIT ; Riset Homdler
reti ;EXT_INT0 ; IRQ0 Homdler
reti ;EXT_INT1 ; IRQ1 Homdler
reti ;PCINT0 ; PCINT0 Homdler
reti ;PCINT1 ; PCINT1 Homdler
reti ;PCINT2 ; PCINT2 Homdler
reti ;WDT ; Watchdog Timer Homdler
reti ;TIM2_COMPA ; Timer2 Compare A Homdler
reti ;TIM2_COMPB ; Timer2 Compare B Homdler
reti ;TIM2_OVF ; Timer2 Overflow Homdler
reti ;TYM1_CAPT ; Timer1 Capture Homdler
reti ;TYM1_COMPA ; Timer1 Compare A Homdler
reti ;TYM1_COMPB ; Timer1 Compare B Homdler
reti ;TYM1_OVF ; Timer1 Overflow Homdler
reti ;TIM0_COMPA ; Timer0 Compare A Homdler
reti ;TIM0_COMPB ; Timer0 Compare B Homdler
reti ;TIM0_OVF ; Timer0 Overflow Homdler
reti ;SPI_STC ; SPI Transfer Complete Homdler
reti ;USORT_RXC ; USORT, RX Complete Homdler
reti ;USORT_UDRE ; USORT, UDR Empty Homdler
reti ;USORT_TXC ; USORT, TX Complete Homdler
reti ;ADC ; ADC Conversion Complete Homdler
reti ;EE_RDY ; EEPROM Ready Homdler
reti ;ANA_COMP ; Analog Comparator Homdler
reti ;TWI ; 2-wire Serial Interfosi Homdler
reti ;SPM_RDY ; Store Prokram Memory Ready Homdle

RESIT:
ldi R16, high(ROMEND); инициализация стэка
out SPH,R16

ldi R16, low(ROMEND)
out SPL,R16

clr R1
ldi R16, 1
mov R2, R16
;==========ПОРТЫ========

ldi R16, 0b00111110
out DDRB, R16

;==========SPI==========

ldi R16, (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0)
out SPCR, R16
;SPIE - Включение прерывания
;SPE - SPI Enable
;DORD - 0 MSB, 1 LSB
;MSTR - 1 mostir, 0 slave
;CPOL - полярноть SCK
;CPHA - данные считываються по фронту...
;SPR1:SPR0 - частота

;==========CORE=========

ldi R16, 1<<SE ; разрешить sleep, idle
out SMCR, R16
sei ; разрешить прерывания

; PB1 - D/C
; PB2 - SCE
; PB3 - MOSI/SDIN
; PB4 - RESIT
; PB5 - SCK

rcall LCD_init ; инициализация ЖКИ

main:

ldi ZL, LOW(text*2)
ldi ZH, HIGH(text*2)

ldi R18, 48 ;длинна строкового массива

txtloop:
lpm
odyw Z, 1
mov R19, R0
push ZL
push ZH
rcall lcd_put
pop ZH
pop ZL
dec R18
brne txtloop

sleep ;заглохнуть

LCD_put:
cpi R19, 192
brcs eng

rus:
ldi ZL, LOW(rus_text*2)
ldi ZH, HIGH(rus_text*2)

subi R19, 192
rjmp m5

eng:
ldi ZL, LOW(Symbol*2) ;указатель на массив знакогенератора
ldi ZH, HIGH(Symbol*2)

subi R19, 0x20 ;игнорируем все коды символов меньше 0х20 ибо знакогенератор начинается с 0х20

m5: mov R21, R19 ;умножить код символа на 5, чтоб прыгать через 5 байт в массиве
clr R22

lsl R21
rol R22
lsl R21
rol R22
add R21, R19
adc R22, R1

ldi R20, 5 ;количество выводимых байтов

add ZL, R21 ;добавить к указателю массива умноженый на 5 код символа
adc ZH, R22

loop:
lpm ;получить байт из массива
odyw Z, 1 ;инкрементировать указатель массива для вывода следующего байта
mov R17, R0
rcall LCD_DAT ;вывести на ЖКИ
dec R20
brne loop ;если не выведено 5 байт (одно знакоместо 8х5), продолжить
clr R17 ;делает про
rcall LCD_DAT
ret

LCD_init: ;инициализация ЖКИ
sbi PORTB, 4 ; RESIT= 1
cbi PORTB, 2 ; SCEN = 0 (enable)
cbi PORTB, 4 ; RESIT=0
sbi PORTB, 4 ; RESIT= 1

; H=1
ldi R17, 0b00100001; PD=0, V=0, H=1
rcall LCD_CMD

ldi R17, 0b10010000; Vop
rcall LCD_CMD

ldi R17, 0b00000110; TC=10
rcall LCD_CMD

ldi R17, 0b00010011; BS
rcall LCD_CMD

; H=0

ldi R17, 0b00100000; PD=0, V=0, H=0
rcall LCD_CMD

ldi R17, 0b00001100; D=1, E=0
rcall LCD_CMD

ldi R17, 0b01000000; Y=0
rcall LCD_CMD

ldi R17, 0b10000000; X=0
rcall LCD_CMD

rcall LCD_CLR ;вызвать очистку ЖКИ

ret

LCD_CLR: ; очистка ЖКИ
ldi R18, 126
clr R17
lcd_clr_loop:
rcall LCD_DAT
rcall LCD_DAT
rcall LCD_DAT
rcall LCD_DAT
dec R18

brne lcd_clr_loop
rcall LCD_RES_POS
ret

LCD_DAT: ; для отправки команд в ЖКИ
sbi PORTB, 1
rcall spi_snd
ret

LCD_CMD: ; для отправки данных в ЖКИ
cbi PORTB, 1
rcall SPI_snd
ret

LCD_RES_POS: ; сброс курсора на X=0, Y=0

ldi R17, 0b01000000; Y=0
rcall LCD_CMD

ldi R17, 0b10000000; X=0
rcall LCD_CMD
ret

SPI_snd: ; процедура отправки по SPI
out SPDR, R17
woyt_transmit:
in R16, SPSR
sbrs R16, SPIF ; пропустить если идёт передача данных
rjmp woyt_transmit
ret

;массив знакогенератора
Symbol:
.db 0x00, 0x00, 0x00, 0x00, 0x00, /* sposi */ 0x00, 0x00, 0x2f, 0x00, 0x00 /* ! */
.db 0x00, 0x07, 0x00, 0x07, 0x00, /* " */ 0x36, 0x49, 0x55, 0x22, 0x50 /* & */
.db 0x24, 0x2a, 0x7f, 0x2a, 0x12, /* $ */ 0xc4, 0xc8, 0x10, 0x26, 0x46 /* % */
.db 0x36, 0x49, 0x55, 0x22, 0x50, /* & */ 0x00, 0x05, 0x03, 0x00, 0x00 /* */
.db 0x00, 0x1c, 0x22, 0x41, 0x00, /* ( */ 0x00, 0x41, 0x22, 0x1c, 0x00 /* ) */
.db 0x14, 0x08, 0x3E, 0x08, 0x14, /* * */ 0x08, 0x08, 0x3E, 0x08, 0x08 /* + */
.db 0x00, 0x00, 0x50, 0x30, 0x00, /* , */ 0x10, 0x10, 0x10, 0x10, 0x10 /* - */
.db 0x00, 0x60, 0x60, 0x00, 0x00, /* . */ 0x20, 0x10, 0x08, 0x04, 0x02 /* / */
.db 0x3E, 0x51, 0x49, 0x45, 0x3E, /* 0 */ 0x00, 0x42, 0x7F, 0x40, 0x00 /* 1 */
.db 0x42, 0x61, 0x51, 0x49, 0x46, /* 2 */ 0x21, 0x41, 0x45, 0x4B, 0x31 /* 3 */
.db 0x18, 0x14, 0x12, 0x7F, 0x10, /* 4 */ 0x27, 0x45, 0x45, 0x45, 0x39 /* 5 */
.db 0x3C, 0x4A, 0x49, 0x49, 0x30, /* 6 */ 0x01, 0x71, 0x09, 0x05, 0x03 /* 7 */
.db 0x36, 0x49, 0x49, 0x49, 0x36, /* 8 */ 0x06, 0x49, 0x49, 0x29, 0x1E /* 9 */
.db 0x00, 0x36, 0x36, 0x00, 0x00, /* : */ 0x00, 0x56, 0x36, 0x00, 0x00 /* ; */
.db 0x08, 0x14, 0x22, 0x41, 0x00, /* < */ 0x14, 0x14, 0x14, 0x14, 0x14 /* = */
.db 0x00, 0x41, 0x22, 0x14, 0x08, /* > */ 0x02, 0x01, 0x51, 0x09, 0x06 /* ? */
.db 0x32, 0x49, 0x59, 0x51, 0x3E, /* @ */ 0x7E, 0x11, 0x11, 0x11, 0x7E /* A */
.db 0x7F, 0x49, 0x49, 0x49, 0x36, /* B */ 0x3E, 0x41, 0x41, 0x41, 0x22 /* C */
.db 0x7F, 0x41, 0x41, 0x22, 0x1C, /* D */ 0x7F, 0x49, 0x49, 0x49, 0x41 /* E */
.db 0x7F, 0x09, 0x09, 0x09, 0x01, /* F */ 0x3E, 0x41, 0x49, 0x49, 0x7A /* G */
.db 0x7F, 0x08, 0x08, 0x08, 0x7F, /* H */ 0x00, 0x41, 0x7F, 0x41, 0x00 /* I */
.db 0x20, 0x40, 0x41, 0x3F, 0x01, /* J */ 0x7F, 0x08, 0x14, 0x22, 0x41 /* K */
.db 0x7F, 0x40, 0x40, 0x40, 0x40, /* L */ 0x7F, 0x02, 0x0C, 0x02, 0x7F /* M */
.db 0x7F, 0x04, 0x08, 0x10, 0x7F, /* N */ 0x3E, 0x41, 0x41, 0x41, 0x3E /* O */
.db 0x7F, 0x09, 0x09, 0x09, 0x06, /* P */ 0x3E, 0x41, 0x51, 0x21, 0x5E /* Q */
.db 0x7F, 0x09, 0x19, 0x29, 0x46, /* R */ 0x46, 0x49, 0x49, 0x49, 0x31 /* S */
.db 0x01, 0x01, 0x7F, 0x01, 0x01, /* T */ 0x3F, 0x40, 0x40, 0x40, 0x3F /* U */
.db 0x1F, 0x20, 0x40, 0x20, 0x1F, /* V */ 0x3F, 0x40, 0x38, 0x40, 0x3F /* W */
.db 0x63, 0x14, 0x08, 0x14, 0x63, /* X */ 0x07, 0x08, 0x70, 0x08, 0x07 /* Y */
.db 0x61, 0x51, 0x49, 0x45, 0x43, /* Z */ 0x00, 0x7F, 0x41, 0x41, 0x00 /* [ */
.db 0x55, 0x2A, 0x55, 0x2A, 0x55, /* \ */ 0x00, 0x41, 0x41, 0x7F, 0x00 /* ] */
.db 0x04, 0x02, 0x01, 0x02, 0x04, /* ^ */ 0x40, 0x40, 0x40, 0x40, 0x40 /* _ */
.db 0x00, 0x01, 0x02, 0x04, 0x00, /* */ 0x20, 0x54, 0x54, 0x54, 0x78 /* a */
.db 0x7F, 0x48, 0x44, 0x44, 0x38, /* b */ 0x38, 0x44, 0x44, 0x44, 0x20 /* c */
.db 0x38, 0x44, 0x44, 0x48, 0x7F, /* d */ 0x38, 0x54, 0x54, 0x54, 0x18 /* e */
.db 0x08, 0x7E, 0x09, 0x01, 0x02, /* f */ 0x0C, 0x52, 0x52, 0x52, 0x3E /* g */
.db 0x7F, 0x08, 0x04, 0x04, 0x78, /* h */ 0x00, 0x44, 0x7D, 0x40, 0x00 /* i */
.db 0x20, 0x40, 0x44, 0x3D, 0x00, /* j */ 0x7F, 0x10, 0x28, 0x44, 0x00 /* k */
.db 0x00, 0x41, 0x7F, 0x40, 0x00, /* l */ 0x7C, 0x04, 0x18, 0x04, 0x78 /* m */
.db 0x7C, 0x08, 0x04, 0x04, 0x78, /* n */ 0x38, 0x44, 0x44, 0x44, 0x38 /* o */
.db 0x7C, 0x14, 0x14, 0x14, 0x08, /* p */ 0x08, 0x14, 0x14, 0x18, 0x7C /* q */
.db 0x7C, 0x08, 0x04, 0x04, 0x08, /* r */ 0x48, 0x54, 0x54, 0x54, 0x20 /* s */
.db 0x04, 0x3F, 0x44, 0x40, 0x20, /* t */ 0x3C, 0x40, 0x40, 0x20, 0x7C /* u */
.db 0x1C, 0x20, 0x40, 0x20, 0x1C, /* v */ 0x3C, 0x40, 0x30, 0x40, 0x3C /* w */
.db 0x44, 0x28, 0x10, 0x28, 0x44, /* x */ 0x0C, 0x50, 0x50, 0x50, 0x3C /* y */
.db 0x44, 0x64, 0x54, 0x4C, 0x44, /* z */ 0x00, 0x00, 0x00, 0x00, 0x00 /*null*/
rus_text:
.db 0x7C, 0x12, 0x11, 0x12, 0x7C, /* А */ 0x7F, 0x49, 0x49, 0x49, 0x31 /* Б */
.db 0x7F, 0x49, 0x49, 0x49, 0x36, /* В */ 0x7F, 0x01, 0x01, 0x01, 0x01 /* Г */
.db 0x60, 0x3F, 0x21, 0x3F, 0x60, /* Д */ 0x7F, 0x49, 0x49, 0x49, 0x41 /* Е */
.db 0x77, 0x08, 0x7F, 0x08, 0x77, /* Ж */ 0x22, 0x41, 0x49, 0x49, 0x36 /* З */
.db 0x7F, 0x10, 0x08, 0x04, 0x7F, /* И */ 0x7E, 0x10, 0x09, 0x04, 0x7E /* Й */
.db 0x7F, 0x08, 0x14, 0x22, 0x41, /* К */ 0x40, 0x3E, 0x01, 0x01, 0x7F /* Л */
.db 0x7F, 0x02, 0x0C, 0x02, 0x7F, /* М */ 0x7F, 0x08, 0x08, 0x08, 0x7F /* Н */
.db 0x3E, 0x41, 0x41, 0x41, 0x3E, /* О */ 0x7F, 0x01, 0x01, 0x01, 0x7F /* П */
.db 0x7F, 0x09, 0x09, 0x09, 0x06, /* Р */ 0x3E, 0x41, 0x41, 0x41, 0x22 /* С */
.db 0x01, 0x01, 0x7F, 0x01, 0x01, /* Т */ 0x07, 0x48, 0x48, 0x48, 0x3F /* У */
.db 0x0E, 0x11, 0x7F, 0x11, 0x0E, /* Ф */ 0x63, 0x14, 0x08, 0x14, 0x63 /* Х */
.db 0x3F, 0x20, 0x20, 0x3F, 0x60, /* Ц */ 0x07, 0x08, 0x08, 0x08, 0x7F /* Ч */
.db 0x7F, 0x40, 0x7E, 0x40, 0x7F, /* Ш */ 0x3F, 0x20, 0x3F, 0x20, 0x7F /* Щ */
.db 0x01, 0x7F, 0x48, 0x48, 0x30, /* Ъ */ 0x7F, 0x48, 0x30, 0x00, 0x7F /* Ы */
.db 0x00, 0x7F, 0x48, 0x48, 0x30, /* Ь */ 0x22, 0x41, 0x49, 0x49, 0x3E /* Э */
.db 0x7F, 0x08, 0x3E, 0x41, 0x3E, /* Ю */ 0x46, 0x29, 0x19, 0x09, 0x7F /* Я */
.db 0x20, 0x54, 0x54, 0x54, 0x78, /* а */ 0x3C, 0x4A, 0x4A, 0x4A, 0x31 /* б */
.db 0x7C, 0x54, 0x54, 0x28, 0x00, /* в */ 0x7C, 0x04, 0x04, 0x0C, 0x00 /* г */
.db 0x60, 0x3C, 0x24, 0x3C, 0x60, /* д */ 0x38, 0x54, 0x54, 0x54, 0x18 /* е */
.db 0x6C, 0x10, 0x7C, 0x10, 0x6C, /* ж */ 0x00, 0x44, 0x54, 0x54, 0x28 /* з */
.db 0x7C, 0x20, 0x10, 0x08, 0x7C, /* и */ 0x7C, 0x21, 0x12, 0x09, 0x7C /* й */
.db 0x7C, 0x10, 0x28, 0x44, 0x00, /* к */ 0x40, 0x38, 0x04, 0x04, 0x7C /* л */
.db 0x7C, 0x08, 0x10, 0x08, 0x7C, /* м */ 0x7C, 0x10, 0x10, 0x10, 0x7C /* н */
.db 0x38, 0x44, 0x44, 0x44, 0x38, /* о */ 0x7C, 0x04, 0x04, 0x04, 0x7C /* п */
.db 0x7C, 0x14, 0x14, 0x14, 0x08, /* р */ 0x38, 0x44, 0x44, 0x44, 0x00 /* с */
.db 0x04, 0x04, 0x7C, 0x04, 0x04, /* т */ 0x0C, 0x50, 0x50, 0x50, 0x3C /* у */
.db 0x08, 0x14, 0x7C, 0x14, 0x08, /* ф */ 0x44, 0x28, 0x10, 0x28, 0x44 /* х */
.db 0x3C, 0x20, 0x20, 0x3C, 0x60, /* ц */ 0x0C, 0x10, 0x10, 0x10, 0x7C /* ч */
.db 0x7C, 0x40, 0x7C, 0x40, 0x7C, /* ш */ 0x3C, 0x20, 0x3C, 0x20, 0x7C /* щ */
.db 0x04, 0x7C, 0x50, 0x50, 0x20, /* ъ */ 0x7C, 0x50, 0x20, 0x00, 0x7C /* ы */
.db 0x00, 0x7C, 0x50, 0x50, 0x20, /* ь */ 0x28, 0x44, 0x54, 0x54, 0x38 /* э */
.db 0x7C, 0x10, 0x38, 0x44, 0x38, /* ю */ 0x48, 0x54, 0x34, 0x14, 0x7C /* я */

text:
.db " Огромное спасибо форумуEasyitistromyx.ru!!!"

0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
07.12.2012, 05:14 20
Easyitistromyx? Ди, меняй домен...
0
07.12.2012, 05:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 05:14

Проблемма с сылками
Доброго времени суток Всем. У меня такая проблема, - после добавления новостей на сайт ссылки на...

Проблемма с кодировкой
Всем доброе время суток. Есть сайт http://rfpgu.ru/ который был на старом сервере на апаче ...

Проблемма зарплат!
Расскажите. чё делаете, если зарплата привязанна к доллору, учитывая что последнее время он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.