Код: Выделить всё
.include "tn2313def.inc"
; ============
; ТИП МИКРОКОНТРОЛЛЕРА (.device)
; ============
.device ATtiny2313
; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
.def temp = R16
; ====
; МАССИВЫ И Т.Д. (.eseg) EEPROM (.db, .dw)
; ====
.eseg
; ******************************
; НАЧАЛО ПРОГРАММЫ (.cseg) FLASH
; ******************************
.cseg
; ------------------
; ВЕКТОРЫ ПРЕРЫВАНИЙ
; ------------------
rjmp RESET ; Reset Handler
rjmp INT_0 ; External Interrupt0 Handler
rjmp INT_1 ; External Interrupt1 Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp USART0_RXC ; USART0 RX Complete Handler
rjmp USART0_DRE ; USART0,UDR Empty Handler
rjmp USART0_TXC ; USART0 TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp PCINT ; Pin Change Interrupt
rjmp TIMER1_COMPB ; Timer1 Compare B Handler
rjmp TIMER0_COMPA ; Timer0 Compare A Handler
rjmp TIMER0_COMPB ; Timer0 Compare B Handler
rjmp USI_START ; USI Start Handler
rjmp USI_OVERFLOW ; USI Overflow Handler
rjmp EE_READY ; EEPROM Ready Handler
rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
;RESET ; Reset Handler
INT_0: ; External Interrupt0 Handler
INT_1: ; External Interrupt1 Handler
TIM1_CAPT: ; Timer1 Capture Handler
TIM1_COMPA: ; Timer1 CompareA Handler
TIM1_OVF: ; Timer1 Overflow Handler
TIM0_OVF: ; Timer0 Overflow Handler
USART0_RXC: ; USART0 RX Complete Handler
USART0_DRE: ; USART0,UDR Empty Handler
USART0_TXC: ; USART0 TX Complete Handler
ANA_COMP: ; Analog Comparator Handler
PCINT: ; Pin Change Interrupt
TIMER1_COMPB: ; Timer1 Compare B Handler
TIMER0_COMPA: ; Timer0 Compare A Handler исправил в ТН2313ДЕФ.ИНК
TIMER0_COMPB: ; Timer0 Compare B Handler исправил в ТН2313ДЕФ.ИНК
USI_START: ; USI Start Handler
USI_OVERFLOW: ; USI Overflow Handler
EE_READY: ; EEPROM Ready Handler
WDT_OVERFLOW: ; Watchdog Overflow Handler
reti ; Выход из прерываний, которые не используются
; ----------------------
; ОБРАБОТЧИКИ ПРЕРЫВАНИЙ
; ----------------------
; **************************************************************************************************
; ИНИЦИАЛИЗАЦИЯ МК (логическое начало основной программы) ******************************************
; **************************************************************************************************
; --------- конфигурация портов -----------------------------------------------
Reset:
; ---------- начальные значения переменных, массивы ---------------------------
; ----- конфигурация прерываний, стека, аналогового компаратора, таймеров -----
ldi temp, 0xFF ; Сбросить флаги внешних прерываний
out EIFR, temp
ldi temp, RAMEND ; Загрузка указателя стека
out SPL, temp
ldi temp, 1<<ACD ; Выключаем аналоговый компаратор (для меньшего потребления)
out ACSR, temp
rcall INIT_LCD
ldi R18, 0x34
rcall SYMBOL
;ADDRESS 1,2
; SYMBOL 0x33
; SYMBOL 0x37
; SYMBOL 0x36
; SYMBOL 0x31
;ADDRESS 1,8
; SYMBOL 0x4d
; SYMBOL 0x48
; SYMBOL 0x7a
;ADDRESS 1,12
; SYMBOL 0x6b
; SYMBOL 0x48
; SYMBOL 0x7a
;ADDRESS 2,2
; SYMBOL 0x34
; SYMBOL 0x33
; SYMBOL 0x37
; SYMBOL 0x36
; SYMBOL 0x31
;ADDRESS 2,8
; SYMBOL 0x4d
; SYMBOL 0xa1
; SYMBOL 0xe5
;ADDRESS 2,12
;
; SYMBOL 0xba
; SYMBOL 0xa1
; SYMBOL 0xe5
; SYMBOL 0x70
; SYMBOL 0xc3
; SYMBOL 0xb3
; SYMBOL 0x61
; SYMBOL 0xb9
;ADDRESS 2,12
; ---------- разрешение прерываний --------------------------------------------
sei ; Разрешаем прерывания
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************
Start:
rjmp Start ; Конец программы, переход на начало
; ***************************************************************************************************
; ПОДПРОГРАММЫ **************************************************************************************
; ***************************************************************************************************
;SYMBOL:
; OUT PORTB,R18
;вывод старшей тетрады
; SWAP R18
; OUT PORTB,R18
;вывод младшей тетрады
;RET
; ret
;INIT_LCD:
; ret
;*****************************************************************************************************************************
.equ DB7port = PORTB ; Указать порт,к которому подключен вывод DB7 дисплея
.equ DB7ddr = DDRB ; Указать регистр напраавления порта, к которому подключен DB7 дисплея
.equ DB7_PIN = PINB
.equ DB7pin = 1 ; Указать номер бита порта, к которому подключен DB7 дисплея
.equ DB6port = PORTB
.equ DB6ddr = DDRB
.equ DB6_PIN = PINB
.equ DB6pin = 4
.equ DB5port = PORTB
.equ DB5ddr = DDRB ; Аналогично (см. выше)
.equ DB5_PIN = PINB
.equ DB5pin = 2
.equ DB4port = PORTB
.equ DB4ddr = DDRB
.equ DB4_PIN = PINB
.equ DB4pin = 3
.equ RSport = PORTD
.equ RSddr = DDRD
.equ RSpin = 6
.equ R_Wport = PORTD
.equ R_Wddr = DDRD
.equ R_Wpin = 5
.equ Eport = PORTB
.equ Eddr = DDRB
.equ Epin = 0
.equ SPEED = 4
;****************************************************************************************************************************
INIT_LCD:
sbi RSddr, RSpin
cbi RSport, RSpin
sbi R_Wddr, R_Wpin
cbi R_Wport, R_Wpin ; Запись в дисплей RW
sbi Eddr, Epin
cbi Eport, Epin ; Опустили строб E
rcall OUT_PORT ;
rcall CLR_PORT
rcall DELAY_13107 ; Первая задержка в районе более 20 мс (после включения питания)
rcall DELAY_13107
rcall DELAY_13107
rcall DELAY_13107
;-----------------------------------------------------
ldi R18, 0b00110000 ; Команда установки 8 линий для инициализации (первый раз)
rcall DB_LINE ; Вызываем подпрограмму, которая отправит команду (тетраду)
rcall STROBE
rcall DELAY_13107 ; Вторая задержка больше 5 мс
;-----------------------------------------------------
rcall STROBE ; Команду на выходе никто не менял, значит просто строб
rcall DELAY_102 ; Задержка в 100 мкс
;-----------------------------------------------------
rcall STROBE
rcall DELAY_102 ; Задержка в 100 мкс
;-----------------------------------------------------
cbi RSport, RSpin ; Идет команда
ldi R18, 0b00100000 ; Команда установки 4 линии для инициализации (четвертый раз)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rcall DB_LINE ; Вызываем подпрограмму, которая отправит команду (тетраду)
rcall STROBE
rcall DELAY_102 ; Задержка в 100 мкс
;---------------------------------------------------------------------------------------------
cbi RSport, RSpin ; Идет команда
ldi R18, 0b00101000 ; Команда установки 4 линии и две строки (наконец-то прошла и вторая тетрада) (уже нормалный порядок битов в команде)
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ldi R18, 0b00001000 ; Выключение дисплея
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ldi R18, 0b00000001 ; Очистка дисплея
rcall CMD_WR ; Вызываем подпрограмму отправки команды
rcall DELAY_13107
ldi R18, 0b00000110 ; Установка режима вывода данных (сдвиг курсора вправо)
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ldi R18, 0b00001101 ; Включаем дисплей, курсор в виде квадрата
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ret
;==============
STROBE:
sbi Eport, Epin ; Подняли строб
rcall DELAY ; Задержка более 500 нс
cbi Eport, Epin ; Опустили строб
rcall DELAY ; Задержка более 500 нс
ret
;----------------------------------------------
SYMBOL: ; Символ (код символа)
;ldi R18, @0
rcall DATA_WR
;.ENDM
ret
;----------------------------------------------
; .MACRO ADDRESS ; Адерс в формате Адрес (х,у) , где х - строка (1 или 2), у - позиция в строке (0...16)
; ldi R18, @0
; cpi R18, 1
; breq RAVNO ; Перейти, если равно, т.е. выбрана 1 строка
; ldi R18, (192+@1) ; А если выбрана 2 строка, то прибавляем к ее адресу (и команде) позицию
; rjmp W
; RAVNO: ldi R18, (128+@1) ; А если первая строка, то прибавляем к ее команде позиции
; W: rcall CMD_WR
; .ENDM
;*************************************************************************************************************
; ПРОЦЕДУРА записи байта команды в дисплей
CMD_WR:
; cli
; rcall BUSY ; Ждем готовности
cbi RSport, RSpin ; Идет команда
rjmp WRITE
;-----------------------------------------------------------------------------------------
; ПРОЦЕДУРА записи байта данных в дисплей
DATA_WR:
; cli
; rcall BUSY ; Ждем готовности
sbi RSport, RSpin ; Идут данные
;-----------------------------------------------------------------------------------------
WRITE:
rcall DB_LINE ; Вызываем подпрограмму, которая выведет значение тетрады в порт(ы)
rcall STROBE
swap R18 ; Перевернем тетрады местами
nop
rcall DB_LINE ;
rcall STROBE
rcall DELAY_102
;sei
ret
;===================
DB_LINE: ; Выводим тетраду в линии дисплея
rcall CLR_PORT
sbrc R18, 4 ; Пропустить слудующую, еслли бит сброшен
sbi DB4port, DB4pin ; Ставим бит
sbrc R18, 5 ; Пропустить слудующую, еслли бит сброшен
sbi DB5port, DB5pin ; Ставим бит
sbrc R18, 6 ; Пропустить слудующую, еслли бит сброшен
sbi DB6port, DB6pin ; Ставим бит
sbrc R18, 7 ; Пропустить слудующую, еслли бит сброшен
sbi DB7port, DB7pin ; Ставим бит
ret
;=====================
; BUSY: ; Ожидание флага занятости контроллера дисплея
; ; RCALL PORT_IN ; Порты на вход
;
; cbi RSport, RSpin ; Идет Команда!
; sbi R_Wport, R_Wpin ; Чтение!
;
; BusyLoop: sbi Eport, Epin ; Подняли строб
; rcall DELAY ; Задержка более 500 нс
; clr R18 ; Очистить переменную
; ;---------------------------------------------
;
; sbic DB7_PIN, DB7pin ; Пропустить следующую команду, если пин очищен = 0
; rjmp S1
; ldi R18, 0x00 ; Если очищен, делаем нулями
; rjmp Z1 ; и выходим
; S1: ldi R18, 0xFF ; А если не очищен, то делаем R17 единиц
; ;----------------------------------------------
; Z1: cbi Eport, Epin ; Опустили строб
; rcall DELAY ; Задержка более 500 нс
;
; sbi Eport, Epin ; Подняли строб (Дальше строб идет, но вторую тетраду мы не читаем,на нее пофиг)
; rcall DELAY ; Задержка более 500 нс
;
; cbi Eport, Epin ; Опустили строб
; rcall DELAY ; Задержка более 500 нс
;
; cpi R18,0x00 ; сравниваем флаг = 0? Дисплей свободен?
; brne BusyLoop ; Если нет, то переход
; ret
;------------------------------------------------------------------------------
DELAY_102:
ldi R16, 255 ; Задержка ~102,4 mkсек
ldi R17, 1
Loop2: subi R16, 1
sbci R17, 0
brcc Loop2
ret
;----------------------------------------------
DELAY_13107:
ldi R16, 255 ; Задержка ~13.107 mсек
ldi R17, 255
Loop1: subi R16, 1
sbci R17, 0
brcc Loop1
ret
;-----------------------------------------------------------
DELAY:
ldi R16, SPEED
loop: dec R16
brne loop
ret
;------------------------------------------------------------------
CLR_PORT:
cbi DB4port, DB4pin
cbi DB5port, DB5pin
cbi DB6port, DB6pin
cbi DB7port, DB7pin
ret
;---------------------------------------------------------------
OUT_PORT:
sbi DB4ddr, DB4pin ; Задаем направление порта на ВЫХОД
sbi DB5ddr, DB5pin
sbi DB6ddr, DB6pin
sbi DB7ddr, DB7pin
ret
;.include "LCD4.inc"
.exit