war4one 0 21 ноября, 2010 Опубликовано 21 ноября, 2010 · Жалоба GPS GSM трекер. Трекер отправляет хозяину SMS со своими координатами, определенными при помощи GPS приемника. SMS отправляются периодически, в соответствии с заранее определенным интервалом. Схема + программа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sansnotfor 0 7 декабря, 2010 Опубликовано 7 декабря, 2010 (изменено) · Жалоба Драйвер светодиодного семисегментного 4-ех разрядного индикатора. Работает с любым компилятором. Легко настраивается для индикаторов с общим катодом, анодом, включенных напрямую или через транзисторы. 7seg_driver.rar Изменено 7 декабря, 2010 пользователем sansnotfor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aleksey_gregul 0 16 декабря, 2010 Опубликовано 16 декабря, 2010 · Жалоба Может кому нибудь понадобится... Драйвер трех шаговиков с шагом 1 градус (можно изменить, поменяв таблицу синусов-косинусов). Задействован только один таймер и 6 линий одного порта. Как-то пришлось переделать автомобильный щиток с тремя двухобмоточными шговыми движками в качестве показометров одометра, спидометра и уровня топлива. Какой-то масочный процессор, рулящий этим хозяйством, имеющий 12 PWM-выходов, не показывал никаких признаков жизни. Упростил схему включения (прилагается) движков, выйдя на 6 PWM-выходов. Немного потерял в крутящем моменте, но для стрелок пойдет. Таблица синусов-косинусов рассчитана с учетом некоторой нелинейности угла поворота роторов движков. Сопротивление обмоток двигателей было более 2 килоом. Подключил прямо к ATMEGA162. Сделано под ИАР. Легко ложится на любой контроллер, имеющий 1 таймер и 6 выходов одного порта. motor.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lsd2k 0 28 января, 2011 Опубликовано 28 января, 2011 · Жалоба Реализация мастера и клиента для Wake протокола. Пример использования там же. Готовый проект под EWAVR - модуль управления вентилятором охлаждения. 3 ступени температуры, 3 датчика DS18B20, гистерезис. wake.rar fancontrol.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Леонид Иванович 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба Примеры реализации WAKE для AVR (EWAVR) и PC (C++ Builder). Старая и новая версии. В прежних реализациях Wake были две ошибки: 1. При передаче ответа микроконтроллером CRC вычислялась для адреса с установленным старшим битом, а не для истинного адреса, как требует спецификация. Ошибка не проявляется, если используется только нулевой адрес, который в пакете не передается. 2. При передаче ответа микроконтроллером всегда передавался установленный адрес устройства, даже если обратились по нулевому адресу (адрес коллективного вызова). А надо отвечать с тем же адресом, по которому обратились. Ошибка не проявляется, если используется только нулевой адрес. Wake.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aleksey_gregul 0 18 марта, 2011 Опубликовано 18 марта, 2011 · Жалоба Может кому-то пригодится... Сделал для себя небольшой графический визуализатор логов и стимулов Аврстудии. Показывает графиком состояния любых двух пинов из лога или стимула. Позволяет редактировать. После редактирования нажмите REPAINT. Поддерживает имя открываемого файла из коммандной строки. При любых манипуляциях с верхним графиком (увеличение, смещение вправо-влево, изменении размера окна...), нижний график по координатам подстраивается под верхний. Манипуляции с нижним-независимы. Думаю, будет полезным для анализа (к примеру) последовательных протоколов, шимов... VISILOG.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SZ0 0 1 апреля, 2011 Опубликовано 1 апреля, 2011 · Жалоба Сделал для себя небольшой графический визуализатор логов и стимулов Аврстудии. В своё время хотел подобное, но только для ввода данных для симулятора. Чтобы по графику генерировался файл и его скармливать студии. Вам осталось только инвертировать работы вашей программы :) В вашей программе предлагаю расширить до 8 полос графики, т.е. для 8 бит. И сделать так, чтобы пользователь мог задавать их кол-во от 1 до 8. А черодование выводимых ножка/график оставить так же, т.е. выбор бита в окне. Ещё можно добавить в настройки соответствие цикла частоте. И выводить время на графике. При этом при наведении перекрестия курсора показывать время, где стоит курсор. А для выделенного участка показывать его длительность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ветерок 0 1 апреля, 2011 Опубликовано 1 апреля, 2011 · Жалоба Исходник DELPHI программатора для ATMEL типа ATmega48 Собран на одной микрухе FT232rl +3 кондёра,частотка тож от неё Пример заточень под ATmega48 но быстро переделывается под любой другой с подобными сигнатарами так же показывает принципы работы FT232rl и помогает разобраться в протоколах программирования AVR микроконтроллеров Если отсюда файл пропадёт можно скачать отсюда: http://izhbazar.ru/viewtopic.php?f=48&t=43#p389 FT232Prog.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavel-pervomaysk 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Код дл работы с 44780 на асме // 25.04.2011 // Двухстрочный ЖКИ 16 х 2 (20 х 4) контроллер 44780 режим 4 бита 5 х 7 точек // Выставляем нужные пины // tmp1 - РОН // data - передача данных / команд в ЖКИ // loop - счетчик цикла при выводе текста // Z - указатель адреса // Частота МК 4 000 000 Hz // если частота выше, в подпрограмме wait_lcd нужно вставить чуть больше nop-ов при дергании пинов .equ rs = PC1 // Выбор регистра ЖКИ .equ rw = PC2 // Чтение_запись данных в ЖКИ .equ e = PC3 // Включение разрешения команд .equ bf = PC7 // Флаг занятости ЖКИ .equ LCD = PORTC // порт ЖКИ .equ LCD_DDR = DDRC // направление порта ЖКИ .equ LCD_PIN = PINC // вход порта ЖКИ .equ Line1 = 0x80 // Адрес начала первой строки ЖКИ .equ Line2 = 0xC0 // Адрес начала второй строки ЖКИ .equ celsiy = 0x00 // код символа градуса цельсия .equ antena = 0x01 // код символа антена USER: // пользовательские символы ( максимум 8 штук ) .db 0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00 // символ градуса цельсия 0х00 .db 0x15,0x15,0x0E,0x04,0x04,0x04,0x04,0x00 // символ антены 0х01 init_lcd: // Инициализация ЖКИ cbi LCD,rw // RW -> 0 nop // cbi LCD,e // E -> 0 nop // cbi LCD,rs // RS -> 0 rcall wait_20ms // ждем 20 милисекунд ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки rcall lcd_cmd_i // передаем команду в ЖКИ rcall wait_20ms // ждем 20 милисекунд ldi data,0x0C // 4 бита режим 5 х 7 точек 2 строки rcall lcd_cmd_i // передаем команду в ЖКИ rcall wait_20ms // ждем 20 милисекунд ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки rcall lcd_cmd_i // передаем команду в ЖКИ rcall wait_20ms // ждем 20 милисекунд rcall clr_lcd // очищаем жки rcall set_simvols // Установка пользовательских символов ret // выход set_simvols: // Установка пользовательских символов для вывода на ЖКИ ldi data,0x40 // загружаем константу rcall lcd_cmd // посылаем команду адреса начала пользовательских символов ldi zl,low (user*2) // загружаем адрес данных L ldi zh,high(user*2) // загружаем адрес данных H ldi loop,16 // загружаем количество символов * 8 celsiy_c: // начало цикла загрузки пользовательских символов lpm data,Z+ // загружаем байт из FLASH с постинкрементом указателя адреса Z rcall print_char // записываем байт в память ЖКИ dec loop // счетчик цикла - 1 brne celsiy_c // если счетчик не = 0, то переходим на начало цикла ret // выход wait_lcd: // Готовность ЖКИ к приему in tmp1,LCD_DDR // читаем andi tmp1,0x0F // выделяем старшую тетраду out LCD_DDR,tmp1 // выводы 4 5 6 7 порта ЖКИ - входы cbi LCD,rs // RS -> 0 nop // холостой такт sbi LCD,rw // RW -> 1 nop // холостой такт lcd_busy: // E -> 1 sbi LCD,e // E -> 1 nop // холостой такт in tmp1,LCD_PIN // Прочитать содержимое порта ЖКИ cbi LCD,e // E -> 0 nop // холостой такт sbi LCD,e // E -> 1 nop // холостой такт cbi LCD,e // E -> 0 nop // холостой такт sbrc tmp1,BF // пропуск след команды если сброшен BF флаг rjmp lcd_busy // перейти на метку lcd_busy cbi LCD,rw // RW -> 0 in tmp1,LCD_DDR // Прочитать содержимое порта ЖКИ ori tmp1,0xF0 // выделяем младшую тетраду out LCD_DDR,tmp1 // выводы 4 5 6 7 порта ЖКИ - выходы ret // выход clr_lcd: // Очистка ЖКИ ldi data,0x01 // загружаем данные для очистки rjmp lcd_cmd // подаем команду и очищаем ЖКИ clr_line1: // Очистка line1 rcall lcd_line1 // выбираем начальный адрес очистки строки 1 ldi loop,16 // загружаем количество символов в строке ldi data,' ' // загружаем пробел 0х20 rjmp clr_l // очищаем строку clr_line2: // Очистка line2 rcall lcd_line2 // выбираем начальный адрес очистки строки 2 ldi loop,16 // загружаем количество символов в строке ldi data,' ' // загружаем пробел 0х20 clr_l: // начало цикла очистки rcall print_char // выводим на жки dec loop // счетчик цикла -1 brne clr_l // если не = 0, переходим к началу цикла ret // выход print_char: // Вывод данных на ЖКИ rcall wait_lcd // ждем готовности ЖКИ sbi LCD,rs // RS -> 1 rjmp send_byte // передаем байт в ЖКИ send_nibble: // Передача полубайта в ЖКИ sbi LCD,e // E -> 1 in tmp1,LCD // прочитать содержимое порта andi tmp1,0x0F // и выделить старшую тетраду andi data,0xF0 // выделить младшую тетраду в регистре or data,tmp1 // смешать регистр с данными out LCD,data // выдать в порт ЖКИ результат cbi LCD,e // E -> 0 ret // выход lcd_line1: // Выбор адреса первой строки данных ldi data,line1 // загружаем данные rjmp lcd_cmd // передаем команду lcd_line2: // Выбор адреса второй строки данных ldi data,line2 // загружаем данные rjmp lcd_cmd // передаем команду lcd_cmd: // передача команды в ЖКИ rcall wait_lcd // ждем готовности ЖКИ lcd_cmd_i: // передача команды в ЖКИ при ините cbi LCD,rs // RS -> 0 send_byte: // Передача байта в ЖКИ push data // сохранить data в STACK push data // сохранить data в STACK rcall send_nibble // вызвать передачу полубайта pop data // извлечь data из STACK swap data // поменять нибблы местами rcall send_nibble // вызвать передачу полубайта pop data // извлечь data из STACK ret // выход out_text: // Вывод текста из флеш проца lpm data,Z+ // загружаем ячейку памяти из флэш с постинкрементом адреса rcall print_char // выводим данные на ЖКИ dec loop // отнимаем 1 от счетчика brne out_text // перейти если не равно ret // выход Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiaS 0 10 июня, 2011 Опубликовано 10 июня, 2011 · Жалоба Работа с графическим дисплеем MT-12232 на ATmega8. mt_12232b.rar Кто пробовал запускать ? Вроде косячок сразу нашел. bool ReadByte(bool cd, bool l, bool r) { char b; if ((l==1)&&(r==1)) return 0; //Читать одновременно из обоих кристаллов недопустимо! //При необходимости настроить здесь шину данных на ввод DDRD = 0x00; //LCD.RW=1; LCD.A0=cd; //Будем читать байт как команду или данные PORTB_Bit1 = 1; PORTB_Bit6 = cd; //Delay(>40ns); //Это время предустановки адреса (tAW) __delay_cycles(1); //LCD.E1=l; LCD.E2=r; //Выдать нужный строб в индикатор PORTB_Bit7 = l; PORTB_Bit0 = r; //Delay(>300ns); //Минимально допустимая длительность сигнала E=1 (время доступа (tACC) попало сюда) __delay_cycles(1); //b=LCD.D; //Прочитать данные с шины индикатора (они на ней уже минимум 120нс) b = PINB; Непонятно что читает? //LCD.E1=LCD.E2=0; //Сбросить сигналы E1 и E2 PORTB_Bit7 = PORTB_Bit0 = 0; //Delay(>(2000ns-40ns-300ns)); //Минимально допустимый интервал между сигналами E=1 __delay_cycles(2); return b; //Вернуть прочитанный байт } //Прочитать байт данных из левой половины индикатора bool ReadDataL(void){ return ReadByte(1,1,0); } //Прочитать байт данных из правой половины индикатора bool ReadDataR(void){ return ReadByte(1,0,1); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zumanah 0 1 июля, 2011 Опубликовано 1 июля, 2011 · Жалоба Нормальные уроки по AVR с кодами программ. Примеры по процессорам AVR c кодами программ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 21 июля, 2011 Опубликовано 21 июля, 2011 · Жалоба Поскольку примеры от Atmel занимают много памяти в контроллерах, для которых они предназначены, простора для творчества практически не остается. На основе библиотеки Atmel сделал одну кнопочку на Tiny45. Можно что-то включать/выключать и донавернуть до простейшего интерфейса пользователя, например переходить в режим настройки при длительном удержании. Размер кода 2684 байта. QT_t45.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Леонид Иванович 0 13 сентября, 2011 Опубликовано 13 сентября, 2011 · Жалоба Помехоустойчивый декодер RC-5: RC5.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sansnotfor 0 17 сентября, 2011 Опубликовано 17 сентября, 2011 · Жалоба Программный модуль позволяющий добавить функцию воспроизведения мелодий или последовательностей звуков практически в любой проект на микроконтроллере AVR. - простая интеграция с готовым проектом - задействован только 8-ми разрядный таймер т2, при этом остается возможность использовать его для опроса или формирования временных интервалов - модуль настраивается практически на любую частоту тактового генератора - высота нот задается в виде символических констант (С0, А2 и т.д) или в Герцах - длительности задаются в стандартном виде (четверти, восьмые и т.д.) или в миллисекундах - имеется возможность задавать темп воспроизведения мелодии и количество ее повторений - в процессе воспроизведения мелодия может быть поставлена на паузу подробное описание http://chipenable.ru/index.php/programming...uka-na-avr.html Исходники для трех компиляторов - IAR, GCC, CV SoundLib.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavel-pervomaysk 0 3 октября, 2011 Опубликовано 3 октября, 2011 · Жалоба Последняя версия для работы с ЖКИ NOKIA 1110i / 1112i Подключение ЖКИ на картинке ниже // pavel-pervomaysk // Final version Nokia 1110i LCD module // Time 03.10.2011 // Lcd controller по командам частично совместимый с PCF8814 // SET X adress lcd // 0x10,0x00 начало строки с 0 го адреса строки // количество столбцов ЖКИ 96 , штук адрес установки с 0 - 95 // адрес столбца нам нужен 39 , 39 -> HEX = 0x27. // Установка адреса будет иметь такой вид 0x12,0x07 // 3 старших бита адреса передаются в первой команде // 4 младших бита адреса передаются во второй команде // SET Y adress lcd // Всего 8 полных строк и 9й не полный // установка адреса Y происходит подачей команд // 0xB0 первая - 0xB8 девятая строки. // Дополнительные команды для управления и инициализации ЖКИ // Сдвиг всей области ЖКИ вверх на 1 0x41 // Сдвиг всей области ЖКИ вверх на 2 0x42 // Сдвиг всей области ЖКИ вверх на 4 0x43 // Сдвиг всей области ЖКИ вверх на 8 0x44 // Сдвиг всей области ЖКИ вверх на 10 0x45 // Сдвиг всей области ЖКИ вверх на 16 0x48 // Сдвиг всей области ЖКИ вниз на 21 0x65 // Контрастность ЖКИ 0x90 ... 0x9F установка по дисплею в проекте // Очистка картинки (данные соханяются) 0xA2 // Реверсное изображение с низу к верху 0xC8 // Позитивное изображение ЖКИ 0xA6 // Негативное изображение ЖКИ 0xA7 // Заполнение строки с лева на право 0xA1 // ||||||||||||||||||||||||||||||||| // lsb adress -> // Заполнение строки с права на лево 0xA9 // ||||||||||||||||||||||||||||||||| // <- lsb adress // Начальное значение курсора строка 0 0xAC // ЖКИ выключен 0xAE // ЖКИ включен 0xAF // RESET lcd 0xE2 // Температурная компенсация включена 0xEB // DSEG data reserved .dseg // RAM .org 0x70 // Set Ram adress begin line_x: .byte 1 // Lcd line select cmd_xll: .byte 1 // X address low byte cmd_xlh: .byte 1 // X address high byte cmd_yl: .byte 1 // X address low byte next string cmd_yh: .byte 1 // X address high byte next string display: .byte 864 // массив для вывода на ЖКИ .cseg // FLASH // LCD names pinouts .equ LCD = PORTC // Порт ЖКИ .equ dat = PC4 // вывод данных в ЖКИ .equ clk = PC3 // вывод тактов в ЖКИ .equ cs = PC5 // выбор чипа .equ line1 = 0xB0 // 1 .equ line2 = 0xB1 // 2 .equ line3 = 0xB2 // 3 .equ line4 = 0xB3 // 4 .equ line5 = 0xB4 // 5 .equ line6 = 0xB5 // 6 .equ line7 = 0xB6 // 7 .equ line8 = 0xB7 // 8 init_lcd: // Инициализация ЖКИ модуля ldi tmp,0xE2 // Internal reset rcall lcd_cmd // выводим команду на ЖКИ ldi tmp,0xEB // температурная компенсация включена rcall lcd_cmd // выводим команду на ЖКИ ldi tmp,0x2F // режим питания rcall lcd_cmd // выводим команду на ЖКИ ldi tmp,0xA1 // направление LSB -> MSB rcall lcd_cmd // выводим команду на ЖКИ ldi tmp,0x9F // Контрастность ЖКИ 0х90 ... 0х9F rcall lcd_cmd // выводим команду на ЖКИ ldi tmp,0xA4 // очистить все пиксели жки rcall lcd_cmd // выводим команду на ЖКИ ldi tmp,0xA6 // позитивное изображение ;ldi tmp,0xA7 // негативное изображение rcall lcd_cmd // выводим команду на ЖКИ ldi tmp,0xAF // включить дисплей rcall lcd_cmd // выводим команду на ЖКИ rcall clr_lcd // Очищаем ЖКИ от случайного мусора ret // на выход clr_line: // Очистка линии ЖКИ ldi xl,low (96) // загружаем количество столбцов ldi xh,high(96) // ldi tmp,0 // загружаем данные rjmp clr_c // очищаем их clr_lcd: // Очистка ЖКИ rcall lcd_line1 // выбираем начало ЖКИ ldi xl,low (864) // количество столбцов ЖКИ = 864 ldi xh,high(864) // ldi tmp,0 // загружаем данные clr_c: // цикл очистки ЖКИ rcall lcd_data // выводим данные на ЖКИ sbiw xl,1 // счетчик цикла - 1 brne clr_c // если не равно 0 - то переходим к началу ret // выход print_data: // выводим 864 байта из RAM в ЖКИ rcall lcd_line1 // выбираем начало ЖКИ ldi xl,low (864) // количество байт ЖКИ = 864 ldi xh,high(864) // ldi yl,low (display) // загружаем адрес L начала блока RAM ldi yh,high(display) // загружаем адрес H начала блока RAM print_c: // цикл вывода данных в ЖКИ ld tmp,Y+ // загружаем данные в регистр из RAM с постинкрементом адреса rcall lcd_data // выводим данные на ЖКИ sbiw xl,1 // счетчик цикла - 1 brne print_c // если не равно 0 - то переходим к началу ret // выход lcd_cmd: // передача команды на ЖКИ cbi lcd,cs // CS -> 0 cbi lcd,dat // DAT -> 0 sbi lcd,clk // CLK -> 1 cbi lcd,clk // CLK -> 0 rjmp out_byte // вывести 8 битов lcd_data: // передача данных на ЖКИ cbi lcd,cs // выбор чипа sbi lcd,dat // DAT -> 1 sbi lcd,clk // CLK -> 1 cbi lcd,clk // CLK -> 0 out_byte: // вывод 8 битов из регистра ldi loop,8 // bit counter out_c: // цикл clc // очищаем кари флаг rol tmp // tmp << 1 brcc d_zer // если флаг очищен , до значит данные DATA -> 0 sbi lcd,dat // если установлен DATA -> 1 rjmp d_one // d_zer: // cbi lcd,dat // DATA=0 d_one: // sbi lcd,clk // CLK -> 1 импульс cbi lcd,clk // CLK -> 0 dec loop // счетчик цикла - 1 brne out_c // sbi lcd,cs // CS -> 1 ret // выход print_char: // Вывод на ЖКИ символа ASCII 5 х 7 push zl // сохранить zl регистр в стеке push zh // сохранить zh регистр в стеке (последним зашел , первым вышел) ldi tmp,5 // загрузить значение первого множителя muls xl,tmp // Multiply signed xh and tmp movw xl,r0 // Copy result back in xl:xh ldi tmp,160 // загрузить число 160 DEC в регистр sub xl,tmp // отнять от пары число 160 0x00 - 0x1F ненужная дата 0x1F * 5 (количество байтов в символе) = 160. sbc xh,zero // число 160 - это количество сэкономленых и ненужных байт в флэш мк ldi ZH,high(Code*2) // загрузить старший адрес строки данных ldi ZL,low (Code*2) // загрузить младший адрес строки данных add ZL,xl // выбираем нужный символ в строке adc ZH,xh // путем прибавления данных к адресу строки ldi tmp1,5 // загружаем счетчик цикла flash_rc: // Чтение символа ASCII в цикле lpm tmp,Z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z rcall lcd_data // вывести байт на ЖКИ dec tmp1 // счетчик - 1 brne flash_rc // если не = 0 то опять по кругу clr tmp // вывести пробел после символа rcall lcd_data // вывести байт на ЖКИ pop zh // извлечь zh из стека pop zl // извлечь zl из стека ret // выход out_text: // Вывод текста из данных флэши lpm xl,Z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z rcall print_char // вывести символ на ЖКИ dec loop2 // счетчик символов - 1 brne out_text // если не равно 0 то опять все повторяем ret // выход print_char_b: // вывод на ЖКИ символа 9 х 14. lds tmp,line_x // загружаем данные начальной строки вывода sts cmd_yl,tmp // сохраняем данные команды адреса верхней строки inc tmp // данные строки + 1 sts cmd_yh,tmp // сохраняем данные команды адреса нижней строки lds tmp,cmd_xlh // загружаем старший байт адреса Х rcall lcd_cmd // выводим команду lds tmp,cmd_xll // загружаем младший байт адреса Х rcall lcd_cmd // выводим команду lds tmp,cmd_yl // загружаем адрес Y rcall lcd_cmd // выводим команду ldi tmp,18 // загрузить значение первого множителя muls xl,tmp // Multiply signed xh and tmp movw xl,r0 // Copy result back in xl:xh ldi zh,high(Cod*2) // загрузить старший адрес строки данных ldi zl,low (Cod*2) // загрузить младший адрес строки данных add zl,xl // выбираем нужный символ в строке adc zh,xh // путем прибавления данных к адресу строки adiw xl,9 // прибавляем к адресу чтения данных 9 ldi tmp1,9 // загружаем счетчик цикла flash_rc1: // Чтение символа ASCII в цикле lpm tmp,z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z rcall lcd_data // вывести байт на ЖКИ dec tmp1 // счетчик - 1 brne flash_rc1 // если не = 0 то опять по кругу lds tmp,cmd_xlh // загружаем старший байт адреса Х rcall lcd_cmd // выводим команду lds tmp,cmd_xll // загружаем младший байт адреса Х rcall lcd_cmd // выводим команду lds tmp,cmd_yh // загружаем адрес Y+1 rcall lcd_cmd // выводим команду ldi zh,high(Cod*2) // загрузить старший адрес строки данных ldi zl,low (Cod*2) // загрузить младший адрес строки данных add zl,xl // выбираем нужный символ в строке adc zh,xh // путем прибавления данных к адресу строки ldi tmp1,9 // загружаем счетчик цикла flash_rc2: // Чтение символа ASCII в цикле lpm tmp,z+ // загрузить в регистр данные по адресу Z с прибавлением 1 к Z andi tmp,0x3F // чистим 2 ненужных бита rcall lcd_data // вывести байт на ЖКИ dec tmp1 // счетчик - 1 brne flash_rc2 // если не = 0 то опять по кругу ret // выход lcd_line1: // 1я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB0 // rcall lcd_cmd // ret // lcd_line2: // 2я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB1 // rcall lcd_cmd // ret // lcd_line3: // 3я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB2 // rcall lcd_cmd // ret // lcd_line4: // 4я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB3 // rcall lcd_cmd // ret // lcd_line5: // 5я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB4 // rcall lcd_cmd // ret // lcd_line6: // 6я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB5 // rcall lcd_cmd // ret // lcd_line7: // 7я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB6 // rcall lcd_cmd // ret // lcd_line8: // 8я Линия ЖКИ для вывода информации rcall lcd_line // ldi tmp,0xB7 // rcall lcd_cmd // ret // lcd_line: // ldi tmp,0x10 // rcall lcd_cmd // ldi tmp,0x00 // rcall lcd_cmd // ret // simvol_1: // установка адреса 1 символа 1 ldi tmp,0x10 // sts cmd_xlh,tmp // ldi tmp,0x01 // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход simvol_2: // установка адреса 13 символа 2 ldi tmp,0x10 // sts cmd_xlh,tmp // ldi tmp,0x0d // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход simvol_3: // установка адреса 25 символа 3 ldi tmp,0x11 // sts cmd_xlh,tmp // ldi tmp,0x09 // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход simvol_4: // установка адреса 37 символа 4 ldi tmp,0x12 // sts cmd_xlh,tmp // ldi tmp,0x05 // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход simvol_5: // установка адреса 49 символа 5 ldi tmp,0x13 // sts cmd_xlh,tmp // ldi tmp,0x01 // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход simvol_6: // установка адреса 61 символа 6 ldi tmp,0x13 // sts cmd_xlh,tmp // ldi tmp,0x0d // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход simvol_7: // установка адреса 73 символа 7 ldi tmp,0x14 // sts cmd_xlh,tmp // ldi tmp,0x09 // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход simvol_8: // установка адреса 85 символа 8 ldi tmp,0x15 // sts cmd_xlh,tmp // ldi tmp,0x05 // sts cmd_xll,tmp // rcall print_char_b // вывести символ 9 х 14 на ЖКИ ret // выход demonstration: // Вывод текста из FLASH на ЖКИ rcall lcd_line2 // выбираем строку ldi zh,high(txt1*2) // загружаем начальный адрес строки текста ldi zl,low (txt1*2) // умножаем указатель адреса на 2 ldi loop2,16 // загружаем количество символов в строке rcall out_text // выводим текст на ЖКИ rcall lcd_line4 // выбираем строку ldi zh,high(txt2*2) // загружаем начальный адрес строки текста ldi zl,low (txt2*2) // умножаем указатель адреса на 2 ldi loop2,16 // загружаем количество символов в строке rcall out_text // выводим текст на ЖКИ rcall lcd_line6 // выбираем строку ldi zh,high(txt3*2) // загружаем начальный адрес строки текста ldi zl,low (txt3*2) // умножаем указатель адреса на 2 ldi loop2,16 // загружаем количество символов в строке rcall out_text // выводим текст на ЖКИ rcall lcd_line8 // выбираем строку ldi zh,high(txt4*2) // загружаем начальный адрес строки текста ldi zl,low (txt4*2) // умножаем указатель адреса на 2 ldi loop2,16 // загружаем количество символов в строке rcall out_text // выводим текст на ЖКИ ;rcall wait_075s rcall wait_075s rcall clr_lcd // очистка ЖКИ ret // выход Txt1: // Текст 1 .db "pavel-pervomaysk" Txt2: // Текст 2 .db "www.cnc-lab.com " Txt3: // Текст 3 .db "ATmega8A-PU cpu " Txt4: // Текст 4 .db "Nokia 1110i LCD " // ASCII CODE from lcd 5 x 7 pixels. Один символ = 5 байт Code:.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00 ; 0x20 ' ' ; 0x21 '!' .db 0x00,0x07,0x00,0x07,0x00,0x14,0x7f,0x14,0x7f,0x14 ; 0x22 '"' ; 0x23 '#' .db 0x24,0x2a,0x7f,0x2a,0x12,0x23,0x13,0x08,0x64,0x62 ; 0x24 '$' ; 0x25 '%' .db 0x36,0x49,0x55,0x22,0x50,0x00,0x05,0x03,0x00,0x00 ; 0x26 '&' ; 0x27 '' .db 0x00,0x1c,0x22,0x41,0x00,0x00,0x41,0x22,0x1c,0x00 ; 0x28 '(' ; 0x29 ')' .db 0x14,0x08,0x3e,0x08,0x14,0x08,0x08,0x3e,0x08,0x08 ; 0x2A '*' ; 0x2B '+' .db 0x00,0x50,0x30,0x00,0x00,0x08,0x08,0x08,0x08,0x08 ; 0x2C ',' ; 0x2D '-' .db 0x00,0x60,0x60,0x00,0x00,0x20,0x10,0x08,0x04,0x02 ; 0x2E '.' ; 0x2F '/' .db 0x3e,0x51,0x49,0x45,0x3e,0x00,0x42,0x7f,0x40,0x00 ; 0x30 '0' ; 0x31 '1' .db 0x42,0x61,0x51,0x49,0x46,0x21,0x41,0x45,0x4b,0x31 ; 0x32 '2' ; 0x33 '3' .db 0x18,0x14,0x12,0x7f,0x10,0x27,0x45,0x45,0x45,0x39 ; 0x34 '4' ; 0x35 '5' .db 0x3c,0x4a,0x49,0x49,0x30,0x01,0x71,0x09,0x05,0x03 ; 0x36 '6' ; 0x37 '7' .db 0x36,0x49,0x49,0x49,0x36,0x06,0x49,0x49,0x29,0x1e ; 0x38 '8' ; 0x39 '9' .db 0x00,0x36,0x36,0x00,0x00,0x00,0x56,0x36,0x00,0x00 ; 0x3A ':' ; 0x3B ';' .db 0x08,0x14,0x22,0x41,0x00,0x14,0x14,0x14,0x14,0x14 ; 0x3C '<' ; 0x3D '=' .db 0x00,0x41,0x22,0x14,0x08,0x02,0x01,0x51,0x09,0x06 ; 0x3E '>' ; 0x3F '?' .db 0x32,0x49,0x79,0x41,0x3e,0x7e,0x11,0x11,0x11,0x7e ; 0x40 '' ; 0x41 'A' .db 0x7f,0x49,0x49,0x49,0x36,0x3e,0x41,0x41,0x41,0x22 ; 0x42 'B' ; 0x43 'C' .db 0x7f,0x41,0x41,0x22,0x1c,0x7f,0x49,0x49,0x49,0x41 ; 0x44 'D' ; 0x45 'E' .db 0x7f,0x09,0x09,0x09,0x01,0x3e,0x41,0x49,0x49,0x7a ; 0x46 'F' ; 0x47 'G' .db 0x7f,0x08,0x08,0x08,0x7f,0x00,0x41,0x7f,0x41,0x00 ; 0x48 'H' ; 0x49 'I' .db 0x20,0x40,0x41,0x3f,0x01,0x7f,0x08,0x14,0x22,0x41 ; 0x4A 'J' ; 0x4B 'K' .db 0x7f,0x40,0x40,0x40,0x40,0x7f,0x02,0x0c,0x02,0x7f ; 0x4C 'L' ; 0x4D 'M' .db 0x7f,0x04,0x08,0x10,0x7f,0x3e,0x41,0x41,0x41,0x3e ; 0x4E 'N' ; 0x4F 'O' .db 0x7f,0x09,0x09,0x09,0x06,0x3e,0x41,0x51,0x21,0x5e ; 0x50 'P' ; 0x51 'Q' .db 0x7f,0x09,0x19,0x29,0x46,0x46,0x49,0x49,0x49,0x31 ; 0x52 'R' ; 0x53 'S' .db 0x01,0x01,0x7f,0x01,0x01,0x3f,0x40,0x40,0x40,0x3f ; 0x54 'T' ; 0x55 'U' .db 0x1f,0x20,0x40,0x20,0x1f,0x3f,0x40,0x38,0x40,0x3f ; 0x56 'V' ; 0x57 'W' .db 0x63,0x14,0x08,0x14,0x63,0x07,0x08,0x70,0x08,0x07 ; 0x58 'X' ; 0x59 'Y' .db 0x61,0x51,0x49,0x45,0x43,0x00,0x7f,0x41,0x41,0x00 ; 0x5A 'Z' ; 0x5B '[' .db 0x02,0x04,0x08,0x10,0x20,0x00,0x41,0x41,0x7f,0x00 ; 0x5C '' ; 0x5D ']' .db 0x04,0x02,0x01,0x02,0x04,0x40,0x40,0x40,0x40,0x40 ; 0x5E '^' ; 0x5F '_' .db 0x00,0x01,0x02,0x04,0x00,0x20,0x54,0x54,0x54,0x78 ; 0x60 '' ; 0x61 'a' .db 0x7f,0x48,0x44,0x44,0x38,0x38,0x44,0x44,0x44,0x20 ; 0x62 'b' ; 0x63 'c' .db 0x38,0x44,0x44,0x48,0x7f,0x38,0x54,0x54,0x54,0x18 ; 0x64 'd' ; 0x65 'e' .db 0x08,0x7e,0x09,0x01,0x02,0x0c,0x52,0x52,0x52,0x3e ; 0x66 'f' ; 0x67 'g' .db 0x7f,0x08,0x04,0x04,0x78,0x00,0x44,0x7d,0x40,0x00 ; 0x68 'h' ; 0x69 'i' .db 0x20,0x40,0x44,0x3d,0x00,0x7f,0x10,0x28,0x44,0x00 ; 0x6A 'j' ; 0x6B 'k' .db 0x00,0x41,0x7f,0x40,0x00,0x7c,0x04,0x18,0x04,0x78 ; 0x6C 'l' ; 0x6D 'm' .db 0x7c,0x08,0x04,0x04,0x78,0x38,0x44,0x44,0x44,0x38 ; 0x6E 'n' ; 0x6F 'o' .db 0x7c,0x14,0x14,0x14,0x08,0x08,0x14,0x14,0x18,0x7c ; 0x70 'p' ; 0x71 'q' .db 0x7c,0x08,0x04,0x04,0x08,0x48,0x54,0x54,0x54,0x20 ; 0x72 'r' ; 0x73 's' .db 0x04,0x3f,0x44,0x40,0x20,0x3c,0x40,0x40,0x20,0x7c ; 0x74 't' ; 0x75 'u' .db 0x1c,0x20,0x40,0x20,0x1c,0x3c,0x40,0x30,0x40,0x3c ; 0x76 'v' ; 0x77 'w' .db 0x44,0x28,0x10,0x28,0x44,0x0c,0x50,0x50,0x50,0x3c ; 0x78 'x' ; 0x79 'y' .db 0x44,0x64,0x54,0x4c,0x44,0x00,0x08,0x36,0x41,0x00 ; 0x7A 'z' ; 0x7B '{' .db 0x00,0x00,0x7f,0x00,0x00,0x00,0x41,0x36,0x08,0x00 ; 0x7C '|' ; 0x7D '}' .db 0x10,0x08,0x08,0x10,0x08,0x06,0x09,0x09,0x06,0x00 ; 0x7E '->'; 0x7F ' ' градус цельсия // ASCII CODE from lcd 9 x 14 pixels. Один символ = 18 байт Cod: .db 0xff,0xff,0x03,0x03,0x03,0x03,0x03,0xff,0xff,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x3f,0x3f ; '0' .db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3f,0x3f ; '1' .db 0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x30,0x30 ; '2' .db 0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x30,0x30,0x30,0x30,0x30,0x30,0x30, 0x3f,0x3f ; '3' .db 0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3f,0x3f ; '4' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x30,0x30,0x30,0x30,0x30,0x30,0x30, 0x3f,0x3f ; '5' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x3f,0x3f ; '6' .db 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3f,0x3f ; '7' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x3f,0x3f ; '8' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0x30,0x30,0x30,0x30,0x30,0x30,0x30, 0x3f,0x3f ; '9' .db 0xfc,0xfe,0xc3,0xc3,0xc3,0xc3,0xc3,0xfe,0xfc,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00, 0x3f,0x3f ; 'A' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0x3c,0x3c,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x0f,0x0f ; 'B' .db 0xfc,0xfc,0x03,0x03,0x03,0x03,0x03,0x0c,0x0c,0x0f,0x0f,0x30,0x30,0x30,0x30,0x30, 0x0c,0x0c ; 'C' .db 0xff,0xff,0x03,0x03,0x03,0x03,0x03,0xfc,0xfc,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x0f,0x0f ; 'D' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x30,0x30 ; 'E' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 ; 'F' .db 0xfc,0xfe,0x03,0x03,0x83,0x83,0x83,0x8e,0x8c,0x0f,0x1f,0x30,0x30,0x31,0x31,0x31, 0x1f,0x0f ; 'G' .db 0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xff,0xff,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00, 0x3f,0x3f ; 'H' .db 0x00,0x03,0x03,0xff,0xff,0x03,0x03,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30, 0x00,0x00 ; 'I' .db 0x00,0x00,0x00,0x03,0x03,0xff,0xff,0x03,0x03,0x0c,0x1c,0x30,0x30,0x30,0x1f,0x0f, 0x00,0x00 ; 'J' .db 0xff,0xff,0xc0,0xe0,0x30,0x18,0x0c,0x07,0x03,0x3f,0x3f,0x00,0x01,0x03,0x06,0x0c, 0x38,0x30 ; 'K' .db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30, 0x30,0x30 ; 'L' .db 0xff,0xff,0x06,0x0c,0x18,0x0c,0x06,0xff,0xff,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00, 0x3f,0x3f ; 'M' .db 0xff,0xff,0x30,0x60,0xc0,0x80,0x00,0xff,0xff,0x3f,0x3f,0x00,0x00,0x00,0x01,0x03, 0x3f,0x3f ; 'N' .db 0xfc,0xfe,0x03,0x03,0x03,0x03,0x03,0xfe,0xfc,0x0f,0x1f,0x30,0x30,0x30,0x30,0x30, 0x1f,0x0f ; 'O' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0x7e,0x3c,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 ; 'P' .db 0xfc,0xfe,0x03,0x03,0x03,0x03,0x03,0xfe,0xfc,0x0f,0x1f,0x30,0x30,0x34,0x2c,0x18, 0x37,0x2f ; 'Q' .db 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0x7e,0x3c,0x3f,0x3f,0x01,0x03,0x06,0x0c,0x18, 0x30,0x20 ; 'R' .db 0x3c,0x7e,0xc3,0xc3,0xc3,0xc3,0xc3,0x83,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30, 0x1f,0x0f ; 'S' .db 0x03,0x03,0x03,0xff,0xff,0xff,0x03,0x03,0x03,0x00,0x00,0x00,0x3f,0x3f,0x3f,0x00, 0x00,0x00 ; 'T' .db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0f,0x1f,0x30,0x30,0x30,0x30,0x30, 0x1f,0x0f ; 'U' .db 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x07,0x0c,0x18,0x30,0x18,0x0c, 0x07,0x03 ; 'V' .db 0xff,0xff,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0x0f,0x1f,0x30,0x30,0x1f,0x30,0x30, 0x1f,0x0f ; 'W' .db 0x07,0x0f,0x18,0xf0,0xe0,0xf0,0x18,0x0f,0x07,0x38,0x3c,0x06,0x03,0x01,0x03,0x06, 0x3c,0x38 ; 'X' .db 0x3f,0x7f,0xc0,0xc0,0xc0,0xc0,0xc0,0x7f,0x3f,0x00,0x00,0x00,0x3f,0x3f,0x3f,0x00, 0x00,0x00 ; 'Y' .db 0x03,0x03,0x03,0x83,0xc3,0x63,0x33,0x1f,0x0f,0x3c,0x3e,0x33,0x31,0x30,0x30,0x30, 0x30,0x30 ; 'Z' .db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 ; ' ' .db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00, 0x00,0x00 ; '.' .db 0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x00, 0x00,0x00 ; ':' .db 0x00,0x1c,0x3e,0x63,0x63,0x63,0x3e,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 ; 'o' градус цельсия .db 0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 ; '-' минус .db 0xc0,0xc0,0xc0,0xf8,0xf8,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00, 0x00,0x00 ; '+' плюс .db 0x80,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x01,0x01, 0x01,0x00 ; '~' переменка ; .db 0x,0x,0x,0x,0x,0x,0x,0x,0x, ; здесь добавляем свои символы 9 х 14 ; .db 0x,0x,0x,0x,0x,0x,0x,0x,0x ; ' ' Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться