Код: Выделить всё
.include "m16def.inc" ; ATMega16
//----------
.DSEG
.def temp=R16
.equ LCD_PORT = PORTA
.equ LCD_DDR = DDRA
.equ LCD_PIN = PINA
.equ D4 = 0
.equ D5 = 1
.equ D6 = 2
.equ D7 = 3
.equ RS = 4
.equ EN = 5
//----------
//----------
.CSEG
.ORG $0000
RJMP INIT
//Инициализация МК-------------------------------
;INIT:
//Инициализация стека----------
ldi r16,low(RAMend)
out SPL,r16
ldi r16,high(RAMend)
out SPH,r16
//----------
//Инициализация дисплея
RCALL LCD_INIT
RCALL WAIT_100us
OUT_LCD:
LDI temp, 'A'
RCALL WrData
RCALL WAIT_100us
LDI temp, '7'
RCALL WrData
RCALL WAIT_100us
STOP:
NOP
RJMP STOP
//----------
//Подпрограммы------------------------------------
//----------
LCD_INIT:
RCALL WAIT_20ms
sbi LCD_DDR, D4 ;Ножки порта на выход
sbi LCD_DDR, D5
sbi LCD_DDR, D6
sbi LCD_DDR, D7
sbi LCD_DDR, RS
sbi LCD_DDR, EN
cbi LCD_PORT, RS ;оистить значение RS, EN
cbi LCD_PORT, EN
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;Начальная инициализация
RCALL WAIT_5ms
LDI temp, 0b00000011
RCALL One ;вызывается
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;три раза
RCALL WAIT_100us
LDI temp, 0b00000010 ;установить разрядность интерфейса (4 бита)
RCALL One
RCALL WAIT_100us
//----------
LDI temp, 0x28
RCALL Two ;2 строки 5х7
; RCALL One
RCALL WAIT_100us
;***********************************************************************
LDI temp, 0x06 ; автоинкремент счетчика DDRAM
RCALL Two
RCALL WAIT_100us
LDI temp, 0x0C ;дисплей вкл, курсор выкл.
RCALL Two
RCALL WAIT_100us
LDI temp, 0x01 ;очистить LCD
RCALL Two
RCALL WAIT_5ms ; КОМАНДА ОЧИСТКИ ДИСПЛЕЯ ДЛИТСЯ 1,5МС
; RCALL WAIT_100us
RET
;***********************************************************************
; LDI temp, 0x08 ;установить разрядность интерфейса (4 бита)
; RCALL Two ;2 строки 5х7
; RCALL WAIT_100us
; LDI temp, 0x01 ;дисплей вкл, курсор выкл.
; RCALL Two
; RCALL WAIT_100us
; LDI temp, 0x06 ;очистить LCD
; RCALL Two
; RCALL WAIT_100us
; RET
;***********************************************************************
//----------
WrData:
SBI LCD_PORT, RS
Two:
NOP ;Записать в дисплей
PUSH R16
SWAP R16
ANDI temp, 0b00001111
OUT LCD_PORT, temp ; ЭТОЙ КОМАНДОЙ ПРОИСХОДИТ СБРОС БИТА RS
NOP
NOP
NOP
SBI LCD_PORT, EN
NOP
NOP
NOP
NOP
NOP
CBI LCD_PORT, EN
; RCALL WAIT_100us
NOP
POP R16
ANDI temp, 0b00001111
One:
OUT LCD_PORT, temp
NOP
NOP
NOP
SBI LCD_PORT, EN
NOP
NOP
NOP
CBI LCD_PORT, EN
; RCALL WAIT_100us
RET
//----------
WAIT_20ms: ;Расчет делался в программе
LDI R18,104 ;калькуляторе AVR DELAY LOOP
LDI R19,228
L1:
DEC R19
BRNE L1
DEC R18
BRNE L1
RET
//----------
WAIT_5ms: ;Расчет делался в программе
LDI R18,26 ;калькуляторе AVR DELAY LOOP
LDI R19,248
L3:
DEC R19
BRNE L3
DEC R18
BRNE L3
RET
//----------
WAIT_100us:
LDI R18,133
L2:
DEC R18
BRNE L2
NOP
RET