Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
- инит дисплэйчика:
;rcall lcd_init ;Display init
- очистить экранчик
;rcall lcd_clear ;Display clear
- поставить курсор на первое место
;ldi temp1,0b10000000 ;
;rcall lcd_command ; set cursor home
- хз, не помню ...
;ldi temp1,0b00000110 ;
;rcall lcd_command ; increment DDRAM, display not shift
- перейти на вторую строку.
;ldi temp1,0b11000000 ;
;rcall lcd_command ; goto second line
- отправить символ (сохранённый в регистре темп1)
;ldi temp1,0x6F ; ="o"
;rcall lcd_data ;Zeichen anzeigen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LCD-Routinen ;;
;; ============ ;;
;; (c)andreas-s@web.de ;;
;; ;;
;; 4bit-Interface ;;
;; DB4-DB7: PB0-PB3 ;;
;; RS: PB4 ;;
;; E: PB5 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;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; 0b00001111
out PORTB, temp1
rcall lcd_enable
andi temp2, 0b00001111 ; 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
; 500 cycles:
; -----------------------------
; delaying 498 cycles:
ldi temp0, $A6
WGLOOP0S: dec temp0
brne WGLOOP0S
; -----------------------------
; delaying 2 cycles:
nop
nop
; =============================
ret ;wieder zurьck
;Lдngere Pause fьr manche Befehle
delay5ms: ;5ms Pause
; =============================
; delay loop generator
; 50000 cycles:
; -----------------------------
; delaying 49995 cycles:
ldi temp0, $65
WGLOOP0A: ldi temp2, $A4
WGLOOP1A: dec temp2
brne WGLOOP1A
dec temp0
brne WGLOOP0A
; -----------------------------
; delaying 3 cycles:
ldi temp0, $01
WGLOOP2A: dec temp0
brne WGLOOP2A
; -----------------------------
; delaying 2 cycles:
nop
nop
; =============================
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 ; 5x8 dots
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
;#############