;AVR AT90S2313 Test Program - Example #4 ;written 2001 Nov 06 ;by Kenrick Chin ;This program displays a message on the LCD screen ********************************************************* * Hardware Definitions ********************************************************* R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 R16 EQU 16 R17 EQU 17 R18 EQU 18 R19 EQU 19 R20 EQU 20 R21 EQU 21 R22 EQU 22 R23 EQU 23 R24 EQU 24 R25 EQU 25 R26 EQU 26 R27 EQU 27 R28 EQU 28 R29 EQU 29 R30 EQU 30 R31 EQU 31 ********************************************************* * Application Register Assignments ********************************************************* ;also known as A EQU 16 B EQU 17 char EQU 16 ;index registers X EQU 26 XHI EQU 27 Y EQU 28 YHI EQU 29 Z EQU 30 ZHI EQU 31 ********************************************************* * Hardware I/O Definitions ********************************************************* ;I/O addresses for AT90S2313 UBRRHI EQU $03 ;N/A on AT90S2313 ADCL EQU $04 ;N/A on AT90S2313 ADCH EQU $05 ;N/A on AT90S2313 ADCSR EQU $06 ;N/A on AT90S2313 ADMUX EQU $07 ;N/A on AT90S2313 ACSR EQU $08 UBRR EQU $09 UCR EQU $0A USR EQU $0B UDR EQU $0C ;N/A on AT90S2313 SPCR EQU $0D ;N/A on AT90S2313 SPSR EQU $0E ;N/A on AT90S2313 SPDR EQU $0F ;N/A on AT90S2313 PIND EQU $10 DDRD EQU $11 PORTD EQU $12 PINC EQU $13 DDRC EQU $14 PORTC EQU $15 PINB EQU $16 DDRB EQU $17 PORTB EQU $18 EECR EQU $1C EEDR EQU $1D EEAR EQU $1E WDTCR EQU $21 ICR1L EQU $24 ;$26 on AT90S4433 ICR1H EQU $25 ;$27 on AT90S4433 OCR1L EQU $2A OCR1H EQU $2B TCNT1L EQU $2C TCNT1H EQU $2D TCCR1B EQU $2E TCCR1A EQU $2F TCNT0 EQU $32 TCCR0 EQU $33 MCUSR EQU $34 ;N/A on AT90S2313 MCUCR EQU $35 TIFR EQU $38 TIMSK EQU $39 GIFR EQU $3A GIMSK EQU $3B SP EQU $3D SREG EQU $3F ;ASCII values SPACE EQU $20 ********************************************************* * INTERRUPT VECTORS ********************************************************* ORG $0000 JMP reset ********************************************************* * CODE SEGMENT ********************************************************* ORG $0010 mess1 FCS "Atmel AT90S2313 Tests" mess2 FCS "Example 4" ********************************************************* * Start of main program ********************************************************* reset LDI A $DF OUT SP A ;initialize SP CLR XHI CLR YHI CLR ZHI CALL LCDinit ;initialize LCD LDI Z mess1 CALL LCDtext CALL Line2 LDI Z mess2 CALL LCDtext main BRA main ********************************************************* * LCD 4-bit Interface ********************************************************* ;LCD interface RS EQU 4 ;PB4 RW EQU 5 ;PB5 E EQU 6 ;PD6 ;initialize LCD in 4-bit mode ;unchanged: A,B,X,Y LCDinit PUSH A SBI DDRB RS ;set control outputs SBI DDRB RW SBI DDRD E CBI PORTD E CBI PORTB RS CBI PORTB RW LDI A $28 ;dual line, 4 bits BSR LCDir LDI A $06 ;increment mode BSR LCDir LDI A $0C ;cursor turned OFF BSR LCDir LDI A $10 ;move cursor right BSR LCDir LDI A $01 ;clear display BSR LCDir PULL A RTS ;LCD clear display ;unchanged: A,B,X,Y LCDclr PUSH A LDI A $01 BSR LCDir PULL A RTS ;LCD home ;unchanged: A,B,X,Y LCDhome PUSH A LDI A $02 BSR LCDir PULL A RTS ;LCD spaces ;enter with B = number of spaces ;unchanged: A,B,X,Y LCDsps PUSH B PUSH A LDI A SPACE LCDsp1 JSR LCDdr DEC B BNE LCDsp1 PULL A PULL B RTS ;display at line #1 and clear line ;unchanged: A,B,X,Y Line1 PUSH B PUSH A LDI A $80 BSR LCDir LDI B 16 BSR LCDsps LDI A $80 BSR LCDir PULL A PULL B RTS ;display at line #2 and clear line ;unchanged: A,B,X,Y Line2 PUSH B PUSH A LDI A $C0 BSR LCDir LDI B 16 BSR LCDsps LDI A $C0 BSR LCDir PULL A PULL B RTS ;display at line #3 and clear line ;unchanged: A,B,X,Y Line3 PUSH B PUSH A LDI A $94 BSR LCDir LDI B 16 BSR LCDsps LDI A $94 BSR LCDir PULL A PULL B RTS ;display at line #4 and clear line ;unchanged: A,B,X,Y Line4 PUSH B PUSH A LDI A $D4 BSR LCDir LDI B 16 BSR LCDsps LDI A $D4 BSR LCDir PULL A PULL B RTS ;display at any position ;enter with A = LCD position (0-79) ;unchanged: A,B,X,Y LCDpos PUSH A PUSH B CPI A 40 BLO LCDp1 LDI B 24 ADD A B LCDp1 ORI A $80 BSR LCDir PULL B PULL A RTS ;output to LCD instruction register ;Enter: A = 8 bits ;unchanged: A,B,X,Y LCDir PUSH A PUSH A BSR LCDrdy ;wait for LCD ready CBI PORTB RS ;set RS = 0 (PB4) CBI PORTB RW ;set R/W = 0 (PB5) SBI DDRB 0 ;data bits are output SBI DDRB 1 SBI DDRB 2 SBI DDRB 3 SWAP A ANDI A $0F OUT PORTB A ;output MS 4 bits NOP SBI PORTD E ;pulse E (PD6) NOP CBI PORTD E PULL A ANDI A $0F OUT PORTB A ;output LS 4 bits NOP SBI PORTD E ;pulse E (PD6) NOP CBI PORTD E PULL A RTS ;output to LCD data register ;Enter: A = 8 bits ;unchanged: A,B,X,Y LCDdr PUSH A PUSH A BSR LCDrdy ;wait for LCD ready SBI PORTB RS ;set RS = 1 (PB4) CBI PORTB RW ;set R/W = 0 (PB5) SBI DDRB 0 ;data bits are outputs SBI DDRB 1 SBI DDRB 2 SBI DDRB 3 SWAP A ANDI A $0F ORI A %00010000 ;RS = 1, R/W = 0 OUT PORTB A ;output MS 4 bits NOP SBI PORTD E ;pulse E (PD6) NOP CBI PORTD E PULL A ANDI A $0F ORI A %00010000 OUT PORTB A ;output LS 4 bits NOP SBI PORTD E ;pulse E (PD6) NOP CBI PORTD E PULL A RTS ;wait for LCD ready ;unchanged: A,B,X,Y LCDrdy PUSH A CBI DDRB 0 ;data is input CBI DDRB 1 CBI DDRB 2 CBI DDRB 3 SBI PORTB RW ;set R/W = 1 (PB5) CBI PORTB RS ;set RS = 0 (PB4) LCD1 SBI PORTD E ;pulse E (PD6) NOP IN A PINB ;read back PORTB CBI PORTD E SBI PORTD E ;pulse E (PD6) NOP CBI PORTD E SBRC A 3 ;test if busy BRA LCD1 PULL A RTS ;LCD text display from code memory ;enter with Z = byte address of string ;!!! NOTE: ZHI = 0 is assumed ;updated: Z LCDtext PUSH char PUSH R0 LCDtxt1 LPM TST R0 BEQ LCDtxt0 MOV char R0 JSR LCDdr ADIW Z 1 JMP LCDtxt1 LCDtxt0 PULL R0 PULL char RET ********************************************************* * END OF CODE SEGMENT ********************************************************* END