Код: Выделить всё
;******************************************************
.include "8515def.inc" ;файл определений AT90S8515
.def temp=r16 ;временная переменная
.def lcd=r22 ;регистр LCD (ЖК-дисплея)
.equ rs=5 ; (RS=1) - данные, (RS=0) - команды
.equ rw=4 ; (RW=1) - чтение LCD, (RW=0) - запись в LCD
.equ e=3 ;строб сигналов на шине команды/данные
.org $000
rjmp init
.org $007
rjmp scankeys ;обработка клавиатуры
;Инициализация
init:
ldi temp,low(RAMEND) ;Инициализация
out spl,temp ;указателя стека
ldi temp,high(RAMEND)
out sph,temp
;Инициализация портов
ser temp
out DDRA,temp ;порт РА на вывод
ldi temp,$30
out DDRC,temp ; конфигурируем биты 4, 5 порта C на вывод.
ldi temp,$38 ;линии порта PD4-PD5 на вывод,
out DDRD,temp
ldi temp,$0F ;PC0-PC3 на ввод
out PORTC,temp
;Инициализация таймера 0
ldi temp,$05
out TCCR0,temp ;коэффициент деления 1024
ldi temp, (1<<TOIE0)
out TIMSK, temp ;разрешение прерываний от таймера
;Инициализация ЖК-дисплея
rcall delay2ms
ldi lcd,$38 ;8-битовый режим вывода,
rcall lcdcom ;2 строки, шрифт 5х7
ldi lcd,$06 ;Направление сдвига курсора вправо, без сдвига дисплея
rcall lcdcom
ldi lcd,$0C ;включить дисплей
rcall lcdcom ;погасить курсор
ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию
rcall lcdcom
rcall delay2ms
sei ;разрешение прерываний
loop: rjmp loop
;Подпрограмма обработки клавиатуры
scankeys:
cbi PORTD,5 ; установить бит 5 порта C в «0»
sbi PORTD,4 ; установить бит 4 порта C в «1»
ldi lcd,0x31 ; загрузить цифру "1" в регистр lcd
SBIC PINC,0 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x32 ; загрузить цифру "2" в регистр lcd
SBIC PINC,1 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x33 ; загрузить цифру "3" в регистр lcd
SBIC PINC,2 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x34 ; загрузить цифру "4" в регистр lcd
SBIC PINC,3 ; если сброшен пропустить следующую команду
rcall lcddat
cbi PORTD,4 ; установить бит 4 порта C в «0»
sbi PORTD,5 ; установить бит 5 порта C в «1»
ldi lcd,0x35 ; загрузить цифру "5" в регистр lcd
SBIC PINC,0 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x36 ; загрузить цифру "6" в регистр lcd
SBIC PINC,1 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x37 ; загрузить цифру "7" в регистр lcd
SBIC PINC,2 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x38 ; загрузить цифру "8" в регистр lcd
SBIC PINC,3 ; если сброшен пропустить следующую команду
rcall lcddat
reti
;Подпрограмма вывода на дисплей байта команды
lcdcom:
out PORTA,lcd ;вывод команды
ldi temp,0x08 ;установка режима записи команд
out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба
rcall delay40us
ret
;Подпрограмма вывода на дисплей байта данных
lcddat:
out PORTA,lcd ;вывод символа
ldi temp,0x20 ;установка режима записи данных
out PORTC,temp
ldi temp,0x08 ;установка режима записи данных
out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба
rcall delay40us
ret
