📄 dz9664emc.asm
字号:
MOV A,CONTRAST ; Low
AND A,#0b00001111
OR A,#ELECTRONICVOLUMELOWER
CALL WRITE_LCD_1BYTE
WRITEOR #REREGISTERSET,#0b00000000 ;SET RE FLAG 000--> INSTRUCTION bank 0
RET
;========= Set electronic volume (RF 000~100) =============
LCD_RF_OUTPUT:
WRITEOR #REREGISTERSET,#0b00000100 ;SET RE FLAG 100--> INSTRUCTION bank 4
MOV A,RFSELECT ; High
AND A,#0b00000111
OR A,#SELECTRF
CALL WRITE_LCD_1BYTE
RET
;========= NORMAL DISPLAY RET INDEX =============
DIS_NORMAL_FUN1:
JE A,#1,PICF_1
JE A,#2,PICF_2
JE A,#3,PICF_3
JE A,#4,PICF_4
JE A,#5,PICF_5
JE A,#6,PICF_6
JE A,#7,PICF_7
JE A,#8,PICF_8
RET
PICF_1:
TBPTL #GRP1*2 ; Data index
TBPTM #GRP1/0x80
TBPTH #GRP1/0x8000
RET
PICF_2:
TBPTL #GRP2*2 ; Data index
TBPTM #GRP2/0x80
TBPTH #GRP2/0x8000
RET
PICF_3:
TBPTL #GRP3*2 ; Data index
TBPTM #GRP3/0x80
TBPTH #GRP3/0x8000
RET
PICF_4:
TBPTL #GRP4*2 ; Data index
TBPTM #GRP4/0x80
TBPTH #GRP4/0x8000
RET
PICF_5:
TBPTL #GRP5*2 ; Data index
TBPTM #GRP5/0x80
TBPTH #GRP5/0x8000
RET
PICF_6:
TBPTL #GRP6*2 ; Data index
TBPTM #GRP6/0x80
TBPTH #GRP6/0x8000
RET
PICF_7:
TBPTL #GRP7*2 ; Data index
TBPTM #GRP7/0x80
TBPTH #GRP7/0x8000
RET
PICF_8:
TBPTL #GRP8*2 ; Data index
TBPTM #GRP8/0x80
TBPTH #GRP8/0x8000
RET
;----------- DZ9664 initial function ----------------
; Describe: EM66567 LCD driver initialition
; Funtion: 1.
;------------------------------------------------
DZ9664_INI:
WRITEOR #REREGISTERSET,#0b00000000 ;SET RE FLAG 000--> INSTRUCTION bank 0
WRITEOR #POWERCONTROL,#0b00000001 ;ACL(B0) =1 initialization ON
MOV A,#50 ;WAIT 50ms FOR DZ9664 INITIAL SETTING
CALL WAIT_A_MS
WRITEOR #BOOSTERSET,#0b00000011 ;BOOSTER x 4 (B1 ,B0 = 1 1)
WRITEOR #POWERCONTROL,#0b00001010 ;BOOSTER CIRCUIT(B1) ON; OPAMP(B3) ON
WRITEOR #BIASRATIOCONTROL,#0b00000100 ;BIAS =1/5 (B2,B1,B0=100)
NOP
WRITEOR #LCDDUTYSET,#0b00000111 ;LCD Duty Set 1/66 DUTY (B2,B1,B0=111)
WRITEOR #INCREMENTCONTROL,#0b00000011 ; X (B0) INCREMENT ; Y(B1) INCREMENT
WRITEOR #DISPLAYSTARTLINELOWER,#0b00000000 ;SET Display Start LOWER Line=0
WRITEOR #DISPLAYSTARTLINEUPPER,#0b00000000 ;SET Display Start UPPER Line=0
WRITEOR #XADDRESSLOWER,#0b00000000 ;SET X Add=0
WRITEOR #XADDRESSUPPER,#0b00000000
WRITEOR #YADDRESSLOWER,#0b00000000 ;SET Y Add=0
WRITEOR #YADDRESSUPPER,#0b00000000
WRITEOR #DISPLAYCONTROL1,#0b00001000 ;DISPLAY(B0) OFF ; SHIFT(B3) = '1'
WRITEOR #DISPLAYCONTROL2,#0b00000010 ;
WRITEOR #REREGISTERSET,#0b00000100 ;SET RE FLAG 100--> INSTRUCTION bank 4
WRITEOR #ELECTRONICVOLUMELOWER,#0b00001111 ;SET ELECTRONIC LOWER TO MAX 1111
WRITEOR #ELECTRONICVOLUMEUPPER,#0b00000111 ;SET ELECTRONIC UPPER TO MAX 0111
WRITEOR #ELECTRONICVOLUMELOWER,#0b00001111 ;SET ELECTRONIC LOWER TO MAX 1111
WRITEOR #COMMONSTARTLINESET,#0b00000100 ;SET COMMON START FROM COM 32
WRITEOR #STATICPICTGRAPHCONTROL,#0b00000000 ;Static Pictograph Control =000
WRITEOR #DISPLAYSELECTCONTROL,#0b00000000 ;PWM (B3)=1 8-gradation fixed display
WRITEOR #RAMDATALENGTHSET,#0b00000000 ;WLS=0(B0) 8-BIT WIDTH MODE
WRITEOR #DISCHARGECONTROL,#0b00000000 ;Discharge(B0) off; High power mode(B1) off
WRITEOR #REREGISTERSET,#0b00000000 ;SET RE FLAG 000--> INSTRUCTION bank 0
RET
;----------- LCD Initialize SETUP ----------------
; Describe: LCD Initialize after power on reset
; Funtion: 1. Set Port G output
; 2. Set Port B 0~2 output
; 3. /CS1 = 0 Chip select
; 4. A0 = 0 instruction input
; 5. CLK0 ENABLE = 21.845K
; 6. LAHEN ENABLE
; 7. PORT E low nibble output
; 8. PORT D all input (Keyin port)
; 9. Timer 0 generate clock to PE.2
;-------------------------------------------------
LCD_INI_SETUP:
MOV A,#122 ;SET PLL FREQUENCY=8MHz
MOV PFS,A
MOV A,#0b00000000 ;PORT C (DATA BUS) PORT_G DEFINE OUTPUT
AND DCRC,A
MOV A,#0b00111100 ;PORT K (KEYIN BUS) PORT_D ALL INPUT
OR DCRJK,A
BC DCRB,4
BC DCRB,3
BC DCRB,2
BC DCRHI,4
BS PBCON,4
BS PORTB,4 ;SET /WR=1 WRITE DISABLE (PC.5)
BS PORTB,3 ;SET /RD=1 READ ENABLE (PB.2)
BC PORTI,2 ;SET LCD /CS = 0 LCD CHIP ENABLE (PB.0)
BS PORTI,3 ;SET LCD RS = 1 INSTRUCTION OUTPUT (PB.1)
MOV A,#9
MOV TRLIR,a
BC TR2CON,6
BC TR2CON,7
BS TR01CON,3
RET
;----------- LCD DISPLAY DATA RAM WRITE ------------
; Funtion: 1. SET TABPTR
; 2. WRITE DATA TO LCD RAM
;---------------------------------------------------
DATA_WRITE_9664:
BS PORTI,3 ; LCD RS = 1 INSTRUCTION OUTPUT
WRITEOR #XADDRESSLOWER,#0b00000000 ;SET X Add=0
WRITEOR #XADDRESSUPPER,#0b00000000
WRITEOR #YADDRESSLOWER,#0b00000000 ;SET Y Add=0
WRITEOR #YADDRESSUPPER,#0b00000000
;MOV A,#0b10101010
;MOV TEMPDATA,A ;#0b10101111
MOV A,#LINE_Y_MAX ;COMMON = 3FH (63)
MOV DRAMX,A
DATA_W1:
MOV A,#LINE_X_MAX ;SEGMENT = 5fh (95)
MOV DRAMY,A
BC PORTI,3 ;SET LCD RS=0 DATA READ/WRITE
DATA_W2:
TBRD 01,ACC ;WRITE LCD SCREEN FROM DATA INDEX
;MOV A,#0b111111111 ;COMMON = 0FH (15)
;MOV A,TEMPDATA ;#0b10101111 COMMON = 0FH (15)
CALL WRITE_LCD_1BYTE
;MOV A,#0b01010101 ;COMMON = 0FH (15)
;CALL WRITE_LCD_1BYTE
DEC DRAMY
JBS STATUSR,FC,DATA_W2
;COM TEMPDATA ;#0b10101111
DEC DRAMX
JBS STATUSR,FC,DATA_W1
BS PORTI,3 ;LCD RS = 1 INSTRUCTION OUTPUT
RET
;---------------- Write 1 byte to LCD driver ------------------
;
;INPUT
; Acc : Data
; LAHEN : C.5 latch Auto(1) or not(0)
; TEST M68 MODE LAHEN IS DISABEL
;OUTPUT
; None
;
;MODIFY
; Acc, Status
;
;CONDITION
; Port-B, C.5 : Port-G is write data or command state to LCD DRIVER
; Do "LCD_OPEN_WRITE" before.
;----------------------------------------------------------------------
WRITE_LCD_1BYTE:
; JBS DCRJK,F_LAHEN,WRITE_LCD_1BYTE_1 ;DEFINE LAHEN =1
BC PORTB,4 ;SET /WR=0 ENABLE WRITE
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV PORTC,A ;MOVE A==> PORT_C
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BS PORTB,4 ;SET /WR=1 DISABLE WRITE
NOP
NOP
NOP
NOP
NOP
NOP
; RET
;WRITE_LCD_1BYTE_1:
; MOV PORTC,A ;MOVE A==> PORT_C
RET
; ELSE
;----------- READ 1 BYTE ----------------
READ_LCD_1BYTE:
IFDEF M86
BC PORTB,3 ;SET /RD=0 READ ENABLE
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV A,PORTC ;MOVE PORT_C ==> A
NOP
NOP
NOP
BS PORTB,3 ;SET /RD=1 READ DISABLE
NOP
NOP
NOP
ELSE
BS PORTB,4
NOP
BS PORTB,3 ; /RD=0
NOP
MOV A,PORTC ;MOVE PORT_C ==> A
NOP
BC PORTB,3 ;/RD=1
NOP
NOP
ENDIF
RET
;%%%%%%%%%%
;WAIT_A_10MS
;%%%%%%%%%%
WAIT_A_MS:
MOV PRODL,A ;A=20
MOV A,#1
MOV TRL0L,A
CLR TRL0H
BC TR01CON,T0CS
BS TR01CON,T0PSR1
BC TR01CON,T0PSR0
BS TR2CON,T0FNEN0 ;1:16
BC TR2CON,T0FNEN1
BS INTCON,TMR0IE
WAIT_A_MS_1:
BC INTSTA,TMR0I
BC INTSTAP,TMR0I
WAIT_A_MS_2:
NOP
JBC INTSTAP,0,WAIT_A_MS_2
BC INTSTAP,0
JDNZ PRODL,WAIT_A_MS_1
BC INTCON,TMR0IE
BC TR2CON,T0FNEN0
RET
/*;-------------------------------------------------------------------
; Waiting sub-routine
; Use timer 1 (Previous vision(EPL65132,EPL43102) used Timer 0)
; Put ms in A
;-------------------------------------------------------------------
WAIT_A_MS:
MOV PRODL,A ;SET A ms INTERVAL
MOV A,#7 ;A==>7 (32K/4/8=1ms)
MOV TRL1,A ;A==>TIMER1 RELOAD REG
BS TR01CON,T1EN ;ENABLE TIMER1 COUNTER
BS INTCON,TMR1IE ;SET TIMER1 INTERRUPT
WAIT_A_MS_1:
BC INTSTA,TMR1I ;CLEAR BIT.0 IF UNDERFLOW HAPPENED
BC INTSTAP,1 ;CLEAR BIT.0 OF REG_INTSTAP WHICH USER DEFINED
WAIT_A_MS_2:
JBC INTSTAP,1,WAIT_A_MS_2 ;WAIT FOR TIMER1 INTERRUPT
JDNZ PRODL,WAIT_A_MS_1 ;REPEAT THE LOOP UNTIL SETTING TIME OVER
BC INTCON,TMR1IE ;RELEASE TIMER1 INTERRUPT
BC TR01CON,T1EN ;DISABLE TIMER1 COUNTER
RET
*/
;==================== LCD DISPLAY PATTERN ==================
include "zzz.dat"
;End of LCD_test.asm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -