переделай под свой проц
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =mse= 19 марта 2004 г. 13:56
В ответ на: графический индикатор PG320240 (SED1335F) отправлено KIT 19 марта 2004 г. 10:35

.ABSOLUTE

.SUBTITLE LCD CONTOLLER ROUTINES
.PAGE
; SUBROUTINE TO INITIALIZE LCD CONTROLLER
INIT_LCD:
; SYSTEM SET COMMAND
LDA #$40 ; INIT COMMAND
JSR CMDOUT
LDA #$30 ; PRT=0, IV=1, W/S=0, M0-M2=0
JSR DATOUT
LDA #$87 ; WF=1, FX=0
JSR DATOUT
LDA #$07 ; FY=7
JSR DATOUT
LDA #39 ; C/R=CHAR/LINE-1
JSR DATOUT
LDA #46 ; TC/R=46 FOR ~50 HZ FRAME RATE @ 4.915MHZ XTAL
JSR DATOUT
LDA #239 ; L/F=TOTAL SCAN LINES - 1
JSR DATOUT
LDA #40 ; APL=ADDRESS UNITS OF VIRTUAL SCREEN (C/R+1) LOWER BYTE
JSR DATOUT
LDA #0 ; APH=ADDRESS UNITS OF VIRTUAL SCREEN (C/R+1) UPPER BYTE
JSR DATOUT

; SCROLL COMMAND ( SETS SCREEN STARTING ADDRESSES AND LENGTHS )
LDA #$44 ; SCROLL COMMAND
JSR CMDOUT
; FIRST SCREEN PARAMETERS
LDA #0 ; SETS START ADDRESS TO 0000H
JSR DATOUT
LDA #0
JSR DATOUT
LDA #240 ; SETS THE NUMBER OF LINES DISPLAYED
JSR DATOUT
; SECOND SCREEN PARAMETERS
LDA #$00 ; SETS START ADDRESS TO 1000H
JSR DATOUT
LDA #$10
JSR DATOUT
LDA #240 ; SETS THE NUMBER OF LINES DISPLAYED
JSR DATOUT

; HDOT SCR COMMAND
LDA #$5A ; HORIZONTAL SCROLL POSITION
JSR CMDOUT
LDA #$00 ; 0 FOR NO SCROLL OFFSET
JSR DATOUT

; OVERLAY COMMAND
LDA #$5B ; DEFINE SCREEN OVERLAY INFO
JSR CMDOUT
LDA #%00000001 ; 2 LAYERS, OV=0, 1-TEXT, 2-GRAPH
JSR DATOUT

; DISPLAY ON/OFF COMMAND
LDA #$58 ;
JSR CMDOUT
LDA #%00010110 ; SCREENS 1,2 = ON, ; $16
JSR DATOUT

JSR CLRGR ; CLEAR GRAPHICS SCREEN
JSR CLRTX ; CLEAR TEXT SCREEN

; CSRFORM COMMAND
LDA #$5D ; SET CURSOR SIZE AND DISPLAY MODE
JSR CMDOUT
LDA #$04 ; CRX=CURSOR WIDTH-1
JSR DATOUT
LDA #$86 ; BLOCK CURSOR AND CURSOR HEIGHT-1
JSR DATOUT

; DISPLAY ON/OFF COMMAND
LDA #$59 ;
JSR CMDOUT
LDA #%00010110 ;
JSR DATOUT

RTS

; CLEAR TEXT SCREEN AND LEAVE CURSOR AT FIRST POSITION
CLRTX:
; CSRW COMMAND - SET CURSOR ADDRESS TO START OF TEXT SCREEN
LDA #$46 ; SET CURSOR ADDRESS TO LAYER 1
JSR CMDOUT
LDA #0
JSR DATOUT
LDA #0
JSR DATOUT
LDA #$4C ; CURSOR MOVEMENT RIGHT
JSR CMDOUT
LDA #$42 ; LCD MEMORY WRITE COMMAND
JSR CMDOUT
LDA #30 ; 30 LINES OF TEXT ON SCREEN
STA COUNT2
TX1:
LDA #40 ; 40 CHAR PER LINE
STA COUNT1
TX2: LDA #$20 ; ASCII SPACE
JSR DATOUT
DEC COUNT1
BNE TX2
DEC COUNT2
BNE TX1
; CSRW COMMAND - PUT CURSOR BACK TO START OF TEXT SCREEN
LDA #$46 ; SET CURSOR ADDRESS TO LAYER 1
JSR CMDOUT
LDA #0
JSR DATOUT
LDA #0
JSR DATOUT
RTS

; CLEAR GRAPHICS SCREEN AND LEAVE CURSOR AT FIRST POSITION
CLRGR:
LDA #$FF
STA GRMODE
BRSET 6,PORTC,XOR ; OPTION SWITCH 3 - NORMAL OR REVERSE VIDEO
LDA #0
STA GRMODE ; SET MODE TO CLEAR SCREEN
XOR:
; CSRW COMMAND - SET CURSOR ADDRESS TO START OF GRAPHICS SCREEN
LDA #$46 ; SET CURSOR ADDRESS TO LAYER 3
JSR CMDOUT
LDA #$00
JSR DATOUT
LDA #$10
JSR DATOUT
LDA #$4C ; CURSOR MOVEMENT RIGHT
JSR CMDOUT
LDA #$42 ; LCD MEMORY WRITE COMMAND
JSR CMDOUT
LDA #240 ; 240 SCAN LINES OF GRAPHICS SCREEN
STA COUNT2
GR1:
LDA #40 ; 40 BYTES PER LINE
STA COUNT1
GR2: LDA GRMODE ; WRITE ALL 1 OR ALL 0 TO MEMORY
JSR DATOUT
DEC COUNT1
BNE GR2
DEC COUNT2
BNE GR1
RTS

; OUTPUT A COMMAND BYTE TO LCD CONTROLLER
; ENTER WITH BYTE TO SEND IN A REG
CMDOUT: BSET 3,PORTB ; SET A0 (REGISTER SELECT) HIGH
STA PORTA ; WRITE DATA TO LCD CONTROLLER
BCLR 1,PORTB ; SET WRITE STROBE ACTIVE
BSET 1,PORTB ; CLEAR WRITE STROBE
BCLR 3,PORTB ; CLEAR A0
RTS

; OUTPUT A DATA BYTE TO LCD CONTROLLER
; ENTER WITH BYTE TO SEND IN A REG
DATOUT: STA PORTA ; WRITE DATA TO LCD CONTROLLER
BCLR 1,PORTB ; SET WRITE STROBE ACTIVE
BSET 1,PORTB ; CLEAR WRITE STROBE
RTS

; INPUT A DATA BYTE FROM LCD CONTROLLER
DATIN:
BSET 3,PORTB ; SET A0 LINE
LDA #$00 ; PORT A ALL INPUTS
STA PADDR
BCLR 0,PORTB ; SET READ STROBE ACTIVE
LDA PORTA ; READ DATA BYTE FROM CONTROLLER
STA CHAR
BSET 0,PORTB ; CLEAR READ STROBE
LDA #$FF ; PORT A ALL OUTPUTS
STA PADDR
BCLR 3,PORTB ; LEAVE A0 LINE LOW
LDA CHAR
RTS


; routine to print string to lcd screen
; enter with offset to message in x reg
PRINT: LDA #$42 ; LCD MEMORY WRITE
JSR CMDOUT
MSG1A: LDA MESSAGES,X ; get char from message
CMP #ETX ; check for ETX
BEQ MSG1B
JSR DATOUT
INC X
JMP MSG1A
MSG1B: RTS

; ROUTINE TO SET TEXT CURSOR AT ROW, COL
TXCURS: LDA #$46 ; SET CURSOR ADDRESS COMMAND
JSR CMDOUT

LDA ROW ; ROW * 40 + COL
LDX #40
MUL
ADD COL
STA COUNT1 ; SAVE LOWER 8 BITS

TXA
ADC #0 ; ADD IN CARRY FROM LOWER ADD
STA COUNT2 ; SAVE UPPER 8 BITS

LDA COUNT1
JSR DATOUT

LDA COUNT2
JSR DATOUT

RTS

; ROUTINE TO SET A PIXEL AT PIXX,PIXY
SETDOT: JSR PIXADD
LDA #$46
JSR CMDOUT
LDA COUNT1
JSR DATOUT ; OUTPUT LOWER ADDRESS
LDA COUNT2
JSR DATOUT ; OUTPUT UPPER ADDRESS
; NOW POINTING TO BYTE IN GRAPHICS MEMORY
LDA PIXX ; GET PIXEL X ADDRESS
AND #$7 ; USE ONLY LOWER 3 BITS
TAX ; SAVE AS POINTER IN X REG
LDA #$43
JSR CMDOUT ; READ LCD MEMORY COMMAND

JSR DATIN ; READ BYTE AT CURRENT ADDRESS

BRSET 6,PORTC,SETDOT1 ; OPTION SWITCH 3 - NORMAL OR REVERSE VIDEO
ORA SETMASK,X ; SET THE BIT
BRA SETDOT2
SETDOT1:
AND CLRMASK,X ; CLEAR THE BIT
SETDOT2:
STA CHAR ; SAVE IT
LDA #$46 ; SET CURSOR ADDRESS COMMAND
JSR CMDOUT
LDA COUNT1
JSR DATOUT
LDA COUNT2
JSR DATOUT
LDA #$42 ; MEMORY WRITE COMMAND
JSR CMDOUT
LDA CHAR
JSR DATOUT
RTS

; ROUTINE TO CLEAR PIXEL AT PIXX,PIXY
CLRDOT: JSR PIXADD
LDA #$46
JSR CMDOUT
LDA COUNT1
JSR DATOUT ; OUTPUT LOWER ADDRESS
LDA COUNT2
JSR DATOUT ; OUTPUT UPPER ADDRESS
; NOW POINTING TO BYTE IN GRAPHICS MEMORY
LDA PIXX ; GET PIXEL X ADDRESS
AND #$7 ; USE ONLY LOWER 3 BITS
TAX ; SAVE AS POINTER IN X REG

LDA #$43
JSR CMDOUT ; READ LCD MEMORY COMMAND

JSR DATIN ; READ BYTE AT CURRENT ADDRESS

BRSET 6,PORTC,CLRDOT1 ; OPTION SWITCH 3 - NORMAL OR REVERSE VIDEO
AND CLRMASK,X ; CLEAR THE BIT
BRA CLRDOT2
CLRDOT1:
ORA SETMASK,X ; SET THE BIT
CLRDOT2:
STA CHAR ; SAVE IT
LDA #$46 ; SET CURSOR ADDRESS COMMAND
JSR CMDOUT
LDA COUNT1
JSR DATOUT
LDA COUNT2
JSR DATOUT
LDA #$42 ; MEMORY WRITE COMMAND
JSR CMDOUT
LDA CHAR
JSR DATOUT
RTS

PIXADD: LDA PIXY ; PIXEL Y * 40 BYTES PER LINE
LDX #40
MUL
STA COUNT1 ; SAVE LOWER

LDA PIXX ; PIXEL X ADDRESS / 8 TO GET BYTE NUMBER
LSRA
LSRA
LSRA
ADD COUNT1 ; FINALLY HAVE (Y*40) + (X/8)
STA COUNT1 ; SAVE LOWER VALUE FOR CURSOR ADDRESSING

TXA ; GET UPPER VALUE
ADC #$10 ; ADD UPPER OFFSET TO GRAPHICS MEMORY + CARRY
STA COUNT2 ; SAVE UPER VALUE FOR CURSOR ADDRESSING

RTS

SETMASK: FCB %10000000
FCB %01000000
FCB %00100000
FCB %00010000
FCB %00001000
FCB %00000100
FCB %00000010
FCB %00000001

CLRMASK: FCB %01111111
FCB %10111111
FCB %11011111
FCB %11101111
FCB %11110111
FCB %11111011
FCB %11111101
FCB %11111110

BIGADD: LDA PIXY ; PIXEL Y * 40 BYTES PER LINE
LDX #40
MUL
STA COUNT1 ; SAVE LOWER

LDA BIGX ; BIGNUM CURSOR X * 2 TO GET BYTE NUMBER
ADD BIGX
ADD COUNT1 ; FINALLY HAVE (Y*40) + (BIGX*2)
STA COUNT1 ; SAVE LOWER VALUE FOR CURSOR ADDRESSING

TXA ; GET UPPER VALUE
ADC #$10 ; ADD UPPER OFFSET TO GRAPHICS MEMORY + CARRY
STA COUNT2 ; SAVE UPPER VALUE FOR CURSOR ADDRESSING
INC BIGX ; BUMP CURSOR POS FOR NEXT TIME

RTS


; SUBROUTINE TO DISPLAY BIG NUMBERS ON SCREEN
; THE NUMBERS MUST GO ON BYTE BOUNDRIES
; ENTER WITH BIGX (0-19), PIXY (0-239) POINTING TO UPPER LEFT BIG NUMBER CHAR POSITION
; CHARNUM=NUMBER TO DISPLAY INDEX (0123456789-)
;
BIGNUM:
LDA #$4F
JSR CMDOUT ; SET CURSOR DIRECTION TO DOWNWARD
; SET CURSOR ADDRESS
JSR BIGADD ; GENERATE PIXEL ADDRESS
LDA #$46
JSR CMDOUT
LDA COUNT1
JSR DATOUT ; OUTPUT LOWER ADDRESS
LDA COUNT2
JSR DATOUT ; OUTPUT UPPER ADDRESS
; NOW POINTING TO BYTE IN GRAPHICS MEMORY
LDA #$42 ; MEMORY WRITE COMMAND
JSR CMDOUT
LDX #0

; WRITE FIRST COLUMN OF BYTES FROM CHARACTER TO LCD MEMORY
LDA #21 ; 21 BYTES PER COLUMN
STA NUMCOUNT
JSR BIGMOVE

; WRITE SECOND COLUMN OF BYTES FROM CHARACTER TO LCD MEMORY
; SET CURSOR ADDRESS FOR SECOND COLUMN OF BYTES
LDA #$46
JSR CMDOUT
LDA COUNT1
INCA ; INCREMENT TO NEXT BYTE
JSR DATOUT ; OUTPUT LOWER ADDRESS
LDA COUNT2
JSR DATOUT ; OUTPUT UPPER ADDRESS
; NOW POINTING TO BYTE IN GRAPHICS MEMORY
LDA #$42 ; MEMORY WRITE COMMAND
JSR CMDOUT

LDA #21 ; 21 BYTES PER COLUMN
STA NUMCOUNT
JSR BIGMOVE

; RESTORE CURSOR DIRECTION
LDA #$4C
JSR CMDOUT ; SET CURSOR DIRECTION TO RIGHTWARD
RTS


; SUBROUTINE TO BLOCK TRANSFER DATA FROM CHAR GEN ROM TO LCD MEMORY
BIGMOVE:
;
; NOTE: THERE HAS TO BE A BETTER WAY TO DO THIS!!
;
LDA CHARNUM
BNE BIGNUM1
BIGNUM0A:
LDA BIG0,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM0A
RTS
BIGNUM1:
CMP #1
BNE BIGNUM2
BIGNUM1A:
LDA BIG1,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM1A
RTS
BIGNUM2:
CMP #2
BNE BIGNUM3
BIGNUM2A:
LDA BIG2,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM2A
RTS
BIGNUM3:
CMP #3
BNE BIGNUM4
BIGNUM3A:
LDA BIG3,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM3A
RTS
BIGNUM4:
CMP #4
BNE BIGNUM5
BIGNUM4A:
LDA BIG4,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM4A
RTS
BIGNUM5:
CMP #5
BNE BIGNUM6
BIGNUM5A:
LDA BIG5,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM5A
RTS
BIGNUM6:
CMP #6
BNE BIGNUM7
BIGNUM6A:
LDA BIG6,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM6A
RTS
BIGNUM7:
CMP #7
BNE BIGNUM8
BIGNUM7A:
LDA BIG7,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM7A
RTS
BIGNUM8:
CMP #8
BNE BIGNUM9
BIGNUM8A:
LDA BIG8,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM8A
RTS
BIGNUM9:
CMP #9
BNE BIGNUMD
BIGNUM9A:
LDA BIG9,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUM9A
RTS
BIGNUMD:
CMP #10
BNE BIGNUMSP
BIGNUMDA:
LDA BIGD,X ; GET BYTE FROM ROM CHAR GEN
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUMDA
RTS
BIGNUMSP:
; NOTE: ANYTHING ELSE DEFAULTS TO A SPACE
LDA #0 ; ALL PIXELS CLEAR FOR SPACE CHAR
JSR DATOUT ; WRITE TO LCD MEMORY
INC X
DEC NUMCOUNT ; DEC BYTE COUNT FOR THIS COLUMN
BNE BIGNUMSP
RTS

.END


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru