Взял программку. Прикрутил дисплей. Но ничего не работает.
Код(не мой):
Файл протеуса ниже.
Что не так?
Код(не мой):
Спойлер
Код: Выделить всё
.include "m16def.inc" ; ?????????? ATMega16
.CSEG
.ORG 0x0000 ; погналт
JMP Reset ; на сброс.
//нафиг тут ненужные вектора
.ORG INT0addr ; External Interrupt Request 0т
RETI
.ORG INT1addr ; External Interrupt Request 1
RETI
.ORG OC2addr ; Timer/Counter2 Compare Match
RETI
.ORG OVF2addr ; Timer/Counter2 Overflow
RETI
.ORG ICP1addr ; Timer/Counter1 Capture Event
RETI
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RETI
.ORG OC1Baddr ; Timer/Counter1 Compare Match B
RETI
.ORG OVF1addr ; Timer/Counter1 Overflow
RETI
.ORG OVF0addr ; Timer/Counter0 Overflow
RETI
.ORG SPIaddr ; Serial Transfer Complete
RETI
.ORG URXCaddr ; USART, Rx Complete
RETI
.ORG UDREaddr ; USART Data Register Empty
RETI
.ORG UTXCaddr ; USART, Tx Complete
RETI
.ORG ADCCaddr ; ADC Conversion Complete
RETI
.ORG ERDYaddr ; EEPROM Ready
RETI
.ORG ACIaddr ; Analog Comparator
RETI
.ORG TWIaddr ; 2-wire Serial Interface
RETI
.ORG SPMRaddr ; Store Program Memory Ready
RETI
// DATA_PORT шана данных
// CMD_PORT[0..2] линия управления
//(0-E (строб); 1-R/W (0-запись,1-чтение); 2-RS (0-?команда, 1-данные))
.equ CMD_PORT = PORTA
.equ CMD_PORT_DDR = DDRA
.equ E = 1
.equ RW = 2
.equ RS = 3
.equ DATA_PORT = PORTB
.equ DATA_PORT_DDR = DDRB
.equ DATA_PORT_PIN = PINB
.ORG INT_VECTORS_SIZE ; ????? ??????? ??????????
Reset:
LDI R16,low(RAMEND) ; стек для прерываний
OUT SPL,R16 ;
LDI R16,High(RAMEND) ;
OUT SPH,R16 ; push / pop
CALL DPORT_In ; понт шины данных на вход
SBI CMD_PORT_DDR, E ; ноги управляющих сигналов на выход
SBI CMD_PORT_DDR, RW ; ?????????
SBI CMD_PORT_DDR, RS ; ?? ?????
CBI CMD_PORT,E ; убрали управляющие сигналы
CBI CMD_PORT,RW ; ???????????
CBI CMD_PORT,RS ; ???????
// науза перед стартом 0,5 сек
CALL wait_05 ;
// начали инициализацию 16*2, (???.8???)
// команда 8 бит 2 строки
CALL DPORT_Out ; порт шины данных на выход
CBI CMD_PORT,RS ; команда RS=0
CBI CMD_PORT,RW ; будем записывать R/W=0
LDI R16,0x38 ; 8бит 2 строки
OUT DATA_PORT,R16 ; данные в порт
NOP
CALL strob ; стробтрующтй импульс
CALL wait_4mkc ; пауза 4мс(как по датишу)
// ??? ??????? 8??? 2 ??????
CALL DPORT_Out ; порты шины данных
CBI CMD_PORT,RS ; бедет команда RS=0
CBI CMD_PORT,RW ; будем писать данные R/W=0
LDI R16,0x38 ; 8бит 2 строки
OUT DATA_PORT,R16 ; выставили данные в порт
NOP
CALL strob ; стробирующий импульс
// режим указали, готовим дисплей к выводу информации
// команда очистки экрана
CALL LCD_busy ; проверка готовности
CALL DPORT_Out ; порт шины данных на выход
CBI CMD_PORT,RS ; будет команда RS=0
CBI CMD_PORT,RW ; будем писать данные R/W=0
LDI R16,0x01 ; ?очистить экран (код 01h)
OUT DATA_PORT,R16 ; выставили данные в порт
NOP
CALL strob ; стрибирующий импульс
// команда включения экрана
CALL LCD_busy ; проверяем готовность
CALL DPORT_Out ; порт шины данных на выход
CBI CMD_PORT,RS ; будет команда RS=0
CBI CMD_PORT,RW ; будем писать данные R/W=0
LDI R16,0x0C ; вкл. экран (код 0Ch)
OUT DATA_PORT,R16 ; выставили данные в порт
NOP
CALL strob ; строб
// задаем режим смешения курсора
CALL LCD_busy ; проверим режим готовности ЖКИ
CALL DPORT_Out ; порт шины данных
CBI CMD_PORT,RS ; ????? ??????? RS=0
CBI CMD_PORT,RW ; ????? ?????? ?????? R/W=0
LDI R16,0x06 ; включаем экран (??? 06)
OUT DATA_PORT,R16 ; выставить данные в порт
NOP
CALL strob
// команда $80 (датиш)
CALL LCD_busy ; проверка занятости
CALL DPORT_Out ; поррт шины данных на выход
CBI CMD_PORT,RS ; ????? ??????? RS=0
CBI CMD_PORT,RW ; ????? ?????? ?????? R/W=0
LDI R16,0x80 ;
OUT DATA_PORT,R16 ; ?дынные в порт
NOP
CALL strob ; стробирующий импульс
// инициализация закончена
// шлем данные
CALL LCD_busy ; проверка занятости
CALL DPORT_Out ; порт данных на выход
SBI CMD_PORT,RS ; ????? ?????? RS=1
CBI CMD_PORT,RW ; ????? ?????? ?????? R/W =0
LDI R16,'A' ; код буквы A
OUT DATA_PORT,R16 ; выставить в порт
NOP
CALL strob
// посылаем букву
CALL LCD_busy ; проверка готовности
CALL DPORT_Out ;порт шины данных на выход
SBI CMD_PORT,RS ; будут данные RS=1
CBI CMD_PORT,RW ; ????? ?????? ?????? R/W =0
LDI R16,'a' ; код быквы a
OUT DATA_PORT,R16 ; ?посылаем буквы
NOP
CALL strob
// ???????? ??? ?????
CALL LCD_busy ; проверка занятости
CALL DPORT_Out ; шина данных на выход
SBI CMD_PORT,RS ; ????? ?????? RS=1
CBI CMD_PORT,RW ; ????? ?????? ?????? R/W =0
LDI R16,0x41 ; ??? ????? A
OUT DATA_PORT,R16 ; выставляем в порт
NOP
CALL strob
// собствеено символы на экране...
// порт в исходном состоянии
CALL DPORT_In ; порт шины данных на вход
loop: NOP
; CALL LED_blink ; тупо 5 portD
NOP
RJMP loop ;
////////////////////////////////////////////////////////////////////////
DPORT_In:
// ???? ???? ?????? ?? ????
LDI R16,0x00
OUT DATA_PORT_DDR, R16 ; порт шину данных на вход
LDI R16,0xFF
OUT DATA_PORT, R16 ;запись Pull-up
RET
DPORT_Out:
// порт шины данных на выход
LDI R16,0x00 ;
OUT DATA_PORT,R16 ; ?????????? ????
LDI R16,0xFF ;
OUT DATA_PORT_DDR,R16 ; ???? ?? ?????
RET
strob:
// стробирующий импульс
SBI CMD_PORT,E ; выключаем стробирующий импульс
CALL delay ; ждем
CBI CMD_PORT,E ; выключаем
CALL delay ; ждем
RET
LCD_busy:
// проверка готовности ЖКИ
CALL DPORT_In ; порт шины данных на выход
busy:
CBI CMD_PORT,RS ; ????? ??????? RS=0
SBI CMD_PORT,RW ; ????? ?????? ?????? R/W=1
SBI CMD_PORT,E ; стробирующий импульс
CALL delay ; ???????? ?????
IN R16,DATA_PORT_PIN ; ?????? ??????
CBI CMD_PORT,0 ; ???????????? ??????? ????.
ANDI R16,0x80 ; проверяем флаг
BRNE Busy ; если нет, крутимся в цикле
RET
delay:
// ????? ?????? ~500????.
LDI R17,0x04
d0: DEC R17
BRNE d0
RET
wait_05:
// ?задержка 0,5 сек (?????????? ?????????? AVRdelayloop3.exe)
; ===========
; delay loop generator
; 4000000 cycles:
; -----------------------------
; delaying 3999996 cycles:
ldi R17, $24
WGLOOP0: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 3 cycles:
ldi R17, $01
WGLOOP3: dec R17
brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
nop
; ===========
RET
wait_4mkc:
; ===========
; delay loop generator
; 32 cycles:
; -----------------------------
; delaying 30 cycles:
ldi R17, $0A
WGLOOP4: dec R17
brne WGLOOP4
; -----------------------------
; delaying 2 cycles:
nop
nop
; ===========
RET
LED_blink:
SBI PORTD,5 ; ???. ????????? ?? PORTD.5 (??? PINBoard)
CALL wait_05
CBI PORTD,5 ; ????. ????????? ?? PORTD.5 (??? PINBoard)
CALL wait_05
RET
Что не так?
- Вложения
-
- LCD.rar
- (26.72 КБ) 178 скачиваний
