AVR 8515
Download avr8515.zip (enthält
lcdmda.asm)
zurück zum Inhalt
;********************************************************************
;* LCDMDA.ASM Version 0.80 (latest) *
;* last change: 23.04.2001 *
;********************************************************************
.include "8515def.inc"
;Port A-Pins
.equ A0 =0
.equ A1 =1
.equ A2 =2
.equ A3 =3
.equ A4 =4
.equ A5 =5
.equ A6 =6
.equ BSY =7
;Port B-Pins
.equ RDWR =0 ;ReaD or WRite for LCD-Display
.equ CODA =1 ;COntrol or DAta for LCD-Display
.equ UPPER =2 ;Enable for UPPER DisplayLines
.equ LOWER =3 ;Enable for LOWER DisplayLines
.equ KEY =4 ;Input für KEYPad
;Port D-Pins
.equ RESET =4 ;Counter RESET for ispLsi
.equ STEP =5 ;Counter STEP for ispLsi
.equ UPREQ =6 ;µP REQuest for Address
.equ UPENA =7 ;µP ENAble for Address
;Key-Defines (Maske A-Port)
.equ K_ENTER =0x7F ;Bit der Enter-Taste
.equ K_UP =0xEF ;Bit der Move-UP-Taste
.equ K_DOWN =0xF7 ;Bit der Move-DOWN-Taste
.equ K_RIGHT =0xFB ;Bit der Move-Right-Taste
.equ K_LEFT =0xFD ;Bit der MOVE-LEFT-Taste
rjmp SPINIT ;reset handle
reti ;External Interrupt0 Vector Address
reti ;External Interrupt1 Vector Address
reti ;Input Capture1 Interrupt Vector Address
reti ;Output Compare1A Interrupt Vector Address
reti ;Output Compare1B Interrupt Vector Address
reti ;Overflow1 Interrupt Vector Address
reti ;Overflow0 Interrupt Vector Address
reti ;SPI Interrupt Vector Address
reti ;UART Receive Complete Interrupt Vector Address
reti ;UART Data Register Empty Interrupt Vector Address
reti ;UART Transmit Complete Interrupt Vector Address
reti ;Analog Comparator Interrupt Vector Address
;********************************************************************
;* Initialisierung (Beginn) *
;********************************************************************
SPINIT: ldi temp,high(RAMEND)
out SPH,temp ;init Stack Pointer
ldi temp,low(RAMEND)
out SPL,temp
;Portinitialisierung IN/OUT
ser temp ;r16=0xff
out ddra,temp ;porta all pins out
ldi temp,0x6f
out ddrb,temp ;portb pin 0-6 out, pin 4,7 in
ldi temp,0x7f
out ddrd,temp ;portd pin 0-6 out, pin 7 in
ldi temp,0
out ddrc,temp ;portc all pins in
;Portinitialisierung DATA
out porta,temp ;out porta 0x00, no pull-up
out portc,temp ;out portc 0x00, no pull-up
out portd,temp ;out portd 0x00, no pull-up
;Initialisierung Interrupt
out gimsk,temp ;disable external int
;Pull-up B4
ldi temp,0x10
out portb,temp
;Initialisierung LCD
rcall lcinit
rcall cginit ;Sonderzeichen laden
rcall lcinit
;********************************************************************
;* Initialisierung (Ende) *
;********************************************************************
;********************************************************************
;* Usercode *
;********************************************************************
;Ausgabe einiger Zeichen(hintereiander)
ldi r21,0
ldi r23,80
sp1: rcall wb1data
inc r21
dec r23
brbc 1,sp1
ldi r21,80
ldi r23,80
sp2: rcall wb2data
inc r21
dec r23
brbc 1,sp2
rcall wkpet ;warten auf ENTER
ldi temp,1
mov r10,temp ;R10 Zeilenregister
mov r11,temp ;R11 Spaltenregister;
ldi temp,64
mov r12,temp ;R12 Pausenzähler zwischen den Key's
;********************************************************************
;* BSRAM-Ausleseschleife *
;********************************************************************
lo1: rcall lc1_res ;upper LCD home
rcall lc2_res ;lower LCD home
rcall keypad ;Keypad abfragen
mov r21,r10
rcall ct_lgo ;Zeile einstellen
mov r21,r11
rcall ct_cgo ;Spalte einstellen
;----- 1.BS-Zeile -----
ldi r24,40 ;40 Zeichen Nutzinformation
lom1: rcall bs1read
rcall ct_step
rcall ct_step
dec r24
brbc 1,lom1
ldi r24,40 ;40 Zeichen Zeilenrest
lom1r: dec r24
rcall ct_step
rcall ct_step
brbc 1,lom1r
;----- 2.BS-Zeile -----
ldi r24,40 ;40 Zeichen Nutzinformation
lom2: rcall bs1read
rcall ct_step
rcall ct_step
dec r24
brbc 1,lom2
ldi r24,40 ;40 Zeichen Zeilenrest
lom2r: dec r24
rcall ct_step
rcall ct_step
brbc 1,lom2r
;----- 3.BS-Zeile -----
ldi r24,40 ;40 Zeichen Nutzinformation
lom3: rcall bs2read
rcall ct_step
rcall ct_step
dec r24
brbc 1,lom3
ldi r24,40 ;40 Zeichen Zeilenrest
lom3r: dec r24
rcall ct_step
rcall ct_step
brbc 1,lom3r
;----- 4.BS-Zeile -----
ldi r24,40 ;40 Zeichen Nutzinformation
lom4: rcall bs2read
rcall ct_step
rcall ct_step
dec r24
brbc 1,lom4
ldi r24,40 ;40 Zeichen Zeilenrest
lom4r: dec r24
rcall ct_step
rcall ct_step
brbc 1,lom4r
ldi r24,10
lp2: rcall del3 ;~ 10 * 5 ms warten
dec r24
brbc 1,lp2
rjmp lo1
rjmp lo1
;********************************************************************
;* Funktionen *
;********************************************************************
;************************************************************
;* LCD-INIT Initialisierung des LCD-Displays
;* DESTROY: R21,(R22 in del3)
;************************************************************
lcinit: rcall del3 ;15ms warten
rcall del3
rcall del3
ldi r21,0x30 ;30h an LCD "8 Bit"
rcall wr_ctrl
rcall del3
ldi r21,0x30 ;30h an LCD "8 Bit"
rcall wr_ctrl
rcall del2
ldi r21,0x30 ;30h an LCD "8 Bit"
rcall wb1ctrl
rcall wb2ctrl
ldi r21,0x3F ;3Fh an LCD "2 lines 5x10"
rcall wb1ctrl
rcall wb2ctrl
ldi r21,0x08 ;08h an LCD "Disp off,Cur off,Blink off"
rcall wb1ctrl
rcall wb2ctrl
ldi r21,1 ;01h an LCD "Clear and Home"
rcall wb1ctrl
rcall wb2ctrl
ldi r21,6 ;06h an LCD "Increment, no shift"
rcall wb1ctrl
rcall wb2ctrl
ldi r21,0x0C ;0Ch an LCD "Disp on,Cur off,Blink off"
rcall wb1ctrl ;0Eh an LCD "Disp on,Cur on, Blink off"
rcall wb2ctrl
ret
;************************************************************
;* CG-INIT Initialisierung der Sonderzeichen des LCD-Displays
;* DESTROY: R21,R25,R26
;************************************************************
cginit: ldi r21,0x40 ;Adresse für Zeichen-Code 00
rcall wb1ctrl ;adr ausgeben (upper)
rcall wb2ctrl ;adr ausgeben (lower)
ldi r26,0
ldi r25,64
cg1: rcall rd_eepr
rcall wb1data ;Bitzeile ausgeben (upper)
rcall wb2data ;Bitzeile ausgeben (lower)
inc r26
dec r25
brbc 1,cg1
ret
;************************************************************
;* RD_EEPR Lesen aus EEPROM
;* PARM: R26 Adresse
;* RETURN: R21 Daten
;************************************************************
rd_eepr:ldi temp,0
out eearh,temp
out eearl,r26
sbi eecr,0
rd_lp: sbic eecr,0
rjmp rd_lp
in r21,eedr
ret
;************************************************************
;* Delay1 Zeitschleife (r21 40h loop) ca 48µs
;* DESTROY: R21
;************************************************************
del1: ldi r21,0x40
d1_lp: dec r21
brbc 1,d1_lp
ret
;************************************************************
;* Delay2 Zeitschleife (r21 88h loop) ca 100µs
;* DESTROY: R21
;************************************************************
del2: ldi r21,0x88
d2_lp: dec r21
brbc 1,d2_lp
ret
;************************************************************
;* DELAY3 Zeitschleife (r22 1Ch outloop, r21 FFh inloop) ca 5ms
;* DESTROY: R21,R22
;************************************************************
del3: ldi r22,0x1c
d3_olp: ldi r21,0
d3_ilp: dec r21
brbc 1,d3_ilp ;Sprung, wenn Z-Bit=0 (solange r21 !=0)
dec r22
brbc 1,d3_olp ;Sprung, wenn Z-Bit=0 (solange r22 !=0)
ret
;************************************************************
;* write_control_byte ohne BSY (RW=low (B0),CD=low (B0))
;* PARM: R21 auszugebendes Byte
;************************************************************
wr_ctrl:out porta,r21
nop ;Einschwingen
sbi portb,UPPER ;setzen Bit2 (Enable upper Rows)
sbi portb,LOWER ;setzen Bit3 (Enable lower Rows)
nop
nop
nop
nop
cbi portb,UPPER ;rücksetzen Bit2
cbi portb,LOWER ;rücksetzen Bit3
ret
;************************************************************
;* write_1_busy_control_byte mit BSY (RW=low (B0),CD=low (B0))
;* PARM: R21 auszugebendes Control-Byte
;************************************************************
wb1ctrl:cbi ddra,7 ;pin A7 auf Input setzen
sbi portb,RDWR ;RW auf READ
nop ;einschwingen READ
sbi portb,UPPER ;setzen Bit2 (Enable upper Rows)
nop ;einschwingen Enable
wbc1lo: sbic pina,7 ;warten auf BSY Ready
rjmp wbc1lo
cbi portb,UPPER ;Enable wieder rücksetzen
nop ;ausschwingen Enable
sbi ddra,BSY ;pin A7 wieder auf Output setzen
cbi portb,RDWR ;RW auf WRITE
nop ;einschwingen write
out porta,r21 ;Ausgabe Control-Byte
nop ;Einschwingen
sbi portb,UPPER ;setzen Bit2 (Enable upper Rows)
nop
nop
nop
nop
cbi portb,UPPER ;rücksetzen Bit2
ret
;************************************************************
;* write_2_busy_control_byte mit BSY (RW=low (B0),CD=low (B0))
;* PARM: R21 auszugebendes Control-Byte
;************************************************************
wb2ctrl:cbi ddra,BSY ;pin A7 auf Input setzen
sbi portb,RDWR ;RW auf READ
nop ;einschwingen READ
sbi portb,LOWER ;setzen Bit3 (Enable lower Rows)
nop ;einschwingen Enable
wbc2lo: sbic pina,BSY ;warten auf BSY Ready
rjmp wbc2lo
cbi portb,LOWER ;Enable wieder rücksetzen
nop ;ausschwingen Enable
sbi ddra,BSY ;pin A7 wieder auf Output setzen
cbi portb,RDWR ;RW auf WRITE
nop ;einschwingen write
out porta,r21 ;Ausgabe Control-Byte
nop ;Einschwingen
sbi portb,LOWER ;setzen Bit3 (Enable lower Rows)
nop
nop
nop
nop
cbi portb,LOWER ;rücksetzen Bit3
ret
;************************************************************
;* write_1_busy_data_byte mit BSY (RW=low (B0),CD=high (B0))
;* PARM: R21 auszugebendes Daten-Byte
;************************************************************
wb1data:cbi ddra,BSY ;pin A7 auf Input setzen
sbi portb,RDWR ;RW auf READ
nop
sbi portb,UPPER ;setzen Bit3 (Enable upper Rows)
nop
wbd1lo: sbic pina,BSY ;warten auf BSY Ready
rjmp wbd1lo
cbi portb,UPPER ;Enable wieder rücksetzen
nop
sbi ddra,BSY ;pin A7 wieder auf Output setzen
cbi portb,RDWR ;RW auf WRITE
nop
sbi portb,CODA ;setzen Bit1 (DATA)
nop
out porta,r21 ;Ausagabe Daten-Byte
nop ;Einschwingen
sbi portb,UPPER ;setzen Bit B2 (Enable upper Rows)
nop
nop
nop
nop
cbi portb,UPPER ;rücksetzen Bit B2
nop
cbi portb,CODA ;rücksetzen Bit1 (CONTROL)
ret
;************************************************************
;* write_2_busy_data_byte mit BSY (RW=low (B0),CD=high (B0))
;* PARM: R21 auszugebendes Daten-Byte
;************************************************************
wb2data:cbi ddra,BSY ;pin A7 auf Input setzen
sbi portb,RDWR ;RW auf READ
nop
sbi portb,LOWER ;setzen Bit3 (Enable lower Rows)
nop
wbd2lo: sbic pina,BSY ;warten auf BSY Ready
rjmp wbd2lo
cbi portb,LOWER ;Enable wieder rücksetzen
nop
sbi ddra,BSY ;pin A7 wieder auf Output setzen
cbi portb,RDWR ;RW auf WRITE
nop
sbi portb,CODA ;setzen Bit1 (DATA)
nop
out porta,r21 ;Ausgabe Daten-Byte
nop ;Einschwingen
sbi portb,LOWER ;setzen Bit B3 (Enable lower Rows)
nop
nop
nop
nop
cbi portb,LOWER ;rücksetzen Bit B3
nop
cbi portb,CODA ;rücksetzen Bit1 (CONTROL)
ret
;************************************************************
;* lc1_res LCd_1_RESet löschen oberes LCD, Cursor auf Position 0
;* DESTROY: R21
;************************************************************
lc1_res:ldi r21,2 ;02h an LCD "Home"
rcall wb1ctrl
ret
;************************************************************
;* lc2_res LCd_2_RESet löschen unteres LCD, Cursor auf Position 0
;* DESTROY: R21
;************************************************************
lc2_res:ldi r21,2 ;02h an LCD "Home"
rcall wb2ctrl
ret
;************************************************************
;* ct_res CounTer_RESet setzen Zähler in ispLSI auf (Adresse=0)
;************************************************************
ct_res :cbi portd,RESET ;rücksetzen Bit D4 (RESET)
nop
nop
sbi portd,RESET ;setzen Bit D4
nop
nop
ret
;************************************************************
;* ct_lgo CounTer_Line_GOto setzen Zähler in ispLSI auf Zeilenanfang
;* DESTROY: R22
;* PARM: R21 Nummer der Zeile, zu deren Anfang gesprungen
;* werden soll
;************************************************************
ct_lgo :rcall ct_res ;rücksetzen Counter
dec r21 ;Korrektur Zielzeile
brne ct_lgo1
ret
ct_lgo1:ldi r22,80 ;1 Zeile
ct_lgo2:dec r22
rcall ct_step
rcall ct_step
brbc 1,ct_lgo2
dec r21
brbc 1,ct_lgo1
ret
;************************************************************
;* ct_cgo CounTer_Column_GOto setzen Zähler in ispLSI auf Spalte
;* PARM: R21 Nummer der Spalte, zu deren Anfang gesprungen
;* werden soll
;************************************************************
ct_cgo: dec r21 ;Korrektur Zielspalte
brne ct_cgo1 ;bei Spalte 1 sofort zurück
ret
ct_cgo1:rcall ct_step
rcall ct_step
dec r21
brbc 1,ct_cgo1
ret
;************************************************************
;* ct_step CounTer_STEP Increment Zähler in ispLSI (Adresse++)
;************************************************************
ct_step:sbi portd,STEP ;setzen Bit B5 (CLOCK)
nop
nop
cbi portd,STEP ;rücksetzen Bit B5
nop
nop
ret
;************************************************************
;* bs1read BildSpeicher_1_READ lesen eine Zeichens aus BS
;* DESTROY: R21
;************************************************************
bs1read:sbi portd,UPREQ ;setzen Bit6 (UPREQ) Anforderungsbit
nop
nop
cbi portd,UPREQ ;rücksetzen Bit6
nop
nop
;die folgenden zwei Zeilen blokieren Prog !!
;bs1rw: sbis pind,UPENA ;warten auf UPENA aktiv
; rjmp bs1rw
in r21,pinc ;einlesen Byte
; sbis pind,UPENA ;UPENA noch aktiv ?
; rjmp bs1read
rcall conv ;Zeichen-Code konvertieren
rcall wb1data ;Ausgabe Zeiche an LCD
ret
;************************************************************
;* bs2read BildSpeicher_2_READ lesen eine Zeichens aus BS
;* DESTROY: R21
;************************************************************
bs2read:sbi portd,UPREQ ;setzen Bit B6 (UPREQ) Anforderungsbit
nop
nop
cbi portd,UPREQ ;rücksetzen Bit B6
nop
nop
;bs2rw: sbis pind,UPENA ;warten auf UPENA aktiv
; rjmp bs2read
in r21,pinc ;einlesen Byte
; sbis pind,UPENA ;UPENA noch aktiv ?
; rjmp bs2read
rcall conv ;Zeichen-Code konvertieren
rcall wb2data ;Ausgabe Zeiche an LCD
ret
;************************************************************
;* conv CONVert Zeichencode (DOS -> LCD)
;* DESTROY: R22,R0
;* PARM: R21 Einganscode
;* RESULT: R21 übersetzter Code
;************************************************************
conv:
;--- Test auf Pseudografik
cpi r21,176 ;untere Grenze
brlt conv0
cpi r21,224 ;obere Grenze+1
brge conv0
ldi r21,0xff
ret
;--- Ubersetzung mit Tabelle
conv0: ldi r22,10 ;Länge Tabelle
ldi zh,high(itab*2)
ldi zl,low(itab*2)
conv1: lpm ;z->r0
cp r0,r21
brne conv3
;--- zeichen umwandeln
adiw zl,1 ;1 Byte weiter
lpm
mov r21,r0 ;überstztes Byte laden
ret
conv3: adiw zl,1 ;1 Byte weiter
adiw zl,1 ;1 Byte weiter
dec r22
brbc 1,conv1
ret
;--- Länge Tabelle 10 Worte
itab: .DB 148,0xEF ;'ö'
.DB 153,0xEF ;'Ö'
.DB 132,0xE1 ;'ä'
.DB 142,0xE1 ;'Ä'
.DB 129,0xF5 ;'ü'
.DB 154,0xF5 ;'Ü'
.DB 21 ,5 ;'§'
.DB 126,6 ;'~'
.DB 92 ,7 ;'\'
.DB 225,0xE2 ;'ß'
;************************************************************
;* wkpet Wait for KeyPress EnTer
;* DESTROY: R25
;************************************************************
wkpet: ldi r25,K_ENTER
out porta,r25 ;Ausgabe Key-Maske
wkpet1: sbic pinb,KEY ;warten auf KEY -> Low
rjmp wkpet1
ret
;************************************************************
;* keypad Keypad abfragen (Move-Tasten)
;* DESTROY: R25
;************************************************************
keypad: ldi r25,K_UP
out porta,r25
nop
nop
sbis pinb,KEY
rjmp kp_up
ldi r25,K_DOWN
out porta,r25
nop
nop
sbis pinb,KEY
rjmp kp_down
ldi r25,K_RIGHT
out porta,r25
nop
nop
sbis pinb,KEY
rjmp kp_right
ldi r25,K_LEFT
out porta,r25
nop
nop
sbis pinb,KEY
rjmp kp_left
ldi r25,K_ENTER
out porta,r25
nop
nop
sbis pinb,KEY
rjmp kp_et
ret
kp_up: ldi temp,1
cp r10,temp
breq kp_end
dec r10
rjmp kp_end
kp_down:ldi temp,22
cp r10,temp
breq kp_end
inc r10
rjmp kp_end
kp_left:ldi temp,1
cp r11,temp
breq kp_end
dec r11
rjmp kp_end
kp_right:ldi temp,41
cp r11,temp
breq kp_end
inc r11
rjmp kp_end
kp_et: ldi temp,1
mov r10,temp
mov r11,temp
kp_end: ret
;********************************************************************
;* EEPROM-Segment *
;********************************************************************
.eseg
UCHR1: .DB 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00 ;6 benutzerdef. Zeichen
UCHR2: .DB 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x1f
UCHR3: .DB 0x00,0x00,0x00,0x00,0x1f,0x00,0x1f,0x1f
UCHR4: .DB 0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f,0x1f
UCHR5: .DB 0x00,0x00,0x1f,0x00,0x1f,0x1f,0x1f,0x1f
UCHR6: .DB 0x08,0x06,0x0a,0x04,0x02,0x04,0x00,0x0C ;5 '§'
UCHR7: .DB 0x00,0x00,0x15,0x08,0x00,0x02,0x00,0x00 ;6 '~'
UCHR8: .DB 0x10,0x00,0x04,0x08,0x01,0x02,0x00,0x00 ;7 '\'
zurück zum Inhalt
© 2001 by Thomas Wagner, Mail: thomas at wagner-ibw dot de (aktuallisiert: 29.04.2001)