Купил дисплейчик DataVision 16210 вот думаю как подключить его к контроллеру, чтобы он выводил хотя бы какой-то текст (наприме "ТЕСТ") при замыкании прерывания INT1. Материала по данной теме в инете очень мало... нужна его распиновка, примерная схема подключения к AT90S2313 и пример программы на С под AVRedit.
1 Vss -> GND 2 Vcc -> 5V 3 Vee -> GND (для теста достаточно с массой соединить) 4 RS -> PD4 am AVR 5 RW -> GND 6 E -> PD5 am AVR 7 DB0 -> GND 8 DB1 -> GND 9 DB2 -> GND 10 DB3 -> GND 11 DB4 -> PD0 am AVR 12 DB5 -> PD1 am AVR 13 DB6 -> PD2 am AVR 14 DB7 -> PD3 am AVR
на PORTD0 прицепить светодиод - нехай мигает когда текст вывели. delay подкрограмки подкорректировать под свой кварц... это у меня тут вроде для 10 мгц, т.е. на меньших частостах ОБЯЗАНО уже работать... если не критично - можно и так оставить... комментарии немецкие... переводить всё влом : )
ЗЫ: экранчик управляется в 4-битном режиме... и ТОЛЬКО выводит буквы (RW не используется). программировать свои знаки - сами уж ...
RESET: ldi temp0,RAMEND ;Locate stack out SPL,temp0
ldi temp1, 0x00000001 ;Pin D0 = выход (сюда тестовый светодиод подключить, будет мигать. но не обязательно : ) ) out DDRD, temp1 ldi temp1, 0xFF ;Port B = выход out DDRB, temp1
;sendet ein Datenbyte an das LCD lcd_data: mov temp2, temp1 ;"Sicherungskopie" für ;die Übertragung des 2.Nibbles swap temp1 ;Vertauschen andi temp1, 0b00001111 ;oberes Nibble auf Null setzen sbr temp1, 1<<4 ;entspricht 0b00010000 out PORTB, temp1 ;ausgeben rcall lcd_enable ;Enable-Routine aufrufen ;2. Nibble, kein swap da es schon ;an der richtigen stelle ist andi temp2, 0b00001111 ;obere Hälfte auf Null setzen sbr temp2, 1<<4 ;entspricht 0b00010000 out PORTB, temp2 ;ausgeben rcall lcd_enable ;Enable-Routine aufrufen rcall delay50us ;Delay-Routine aufrufen ret ;zurück zum Hauptprogramm
;sendet einen Befehl an das LCD lcd_command: ;wie lcd_data, nur ohne RS zu setzen mov temp2, temp1 swap temp1 andi temp1, 0b00001111 out PORTB, temp1 rcall lcd_enable andi temp2, 0b00001111 out PORTB, temp2 rcall lcd_enable rcall delay50us ret
;erzeugt den Enable-Puls lcd_enable: sbi PORTB, 5 ;Enable high rcall delay50us cbi PORTB, 5 ;Enable wieder low ret ;Und wieder zurück
;Pause nach jeder Übertragung delay50us: ;50us Pause ; ============================= ; delay loop generator ; ----------------------------- ; delaying 48 cycles: ldi temp1, $11 WGLOOP0: dec temp1 brne WGLOOP0 ; ----------------------------- ; ============================= ret ;wieder zurück
;Längere Pause für manche Befehle delay5ms: ;5ms Pause ;ret ; !!!!!!! ; ============================= ; delay loop generator ; ----------------------------- ; delaying 49995 cycles: ldi temp1, $65 WGLOOP0C: ldi temp2, $A4 WGLOOP1C: dec temp2 brne WGLOOP1C dec temp1 brne WGLOOP0C ; ----------------------------- ; delaying 6 cycles: ldi temp1, $02 WGLOOP2C: dec temp1 brne WGLOOP2C ; ============================= ret ;wieder zurück
;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden lcd_init: ldi temp3,50 powerupwait: rcall delay5ms dec temp3 brne powerupwait ldi temp1, 0b00000011 ;muss 3mal hintereinander gesendet out PORTB, temp1 ;werden zur Initialisierung rcall lcd_enable ;1 rcall delay5ms rcall lcd_enable ;2 rcall delay5ms rcall lcd_enable ;und 3! rcall delay5ms ldi temp1, 0b00000010 ;4bit-Modus einstellen out PORTB, temp1 rcall lcd_enable rcall delay5ms ldi temp1, 0b00101000 ;noch was einstellen... rcall lcd_command ldi temp1, 0b00001100 ;...nochwas... rcall lcd_command ldi temp1, 0b00000100 ;endlich fertig rcall lcd_command ret
;Sendet den Befehl zur Löschung des Displays lcd_clear: ldi temp1, 0b00000001 ;Display löschen rcall lcd_command rcall delay5ms ret
ECHO: cli ; disable global interrupts ldi temp0,0b00000000 ; Timer 1 -> STOP! out TCCR1B,temp0 ; Timer 1 -> STOP! nop nop nop reti