📄 lcddriver.s
字号:
AREA BOOTROM, CODE, READONLY
PIO_BASE EQU 0xFFFF0000
PIO_PDSR EQU 0xFFFF003C
;XXXX 0000
;E(1),R/~W,RS(1 data,0 commmand)
LCD_CW_E EQU 0x80
;100 X
LCD_CR_E EQU 0xC0
;110 X
LCD_DW_E EQU 0xA0
;101 X
LCD_DR_E EQU 0xE0
;111 X
;write to cs4
LCD_CW EQU 0x00
;000 X
LCD_CR EQU 0x40
;010 X
LCD_DW EQU 0x20
;001 X
LCD_DR EQU 0x60
;011 X
;write to cs4
CS4_addr EQU 0x40000000
;r6 command ,r7 data
;r5 CS4
P0_P7MASK EQU 0xFFFFFF00
ENTRY
delay2ms
STMFD sp!,{r0,lr}
ldr r0, =0x00013880
dly2ms
sub r0,r0,#1
bne dly2ms
LDMFD sp!,{r0,PC};Return
delay600ns
STMFD sp!,{lr}
;>=600ns is ok
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
LDMFD sp!,{PC};Return
R0_readP0_P7
STMFD sp!,{r2,lr}
LDR R2,=PIO_PDSR
LDR R0,[R2]
BIC R0,R0,#0xFFFFFF00
LDMFD sp!,{r2,PC};Return
R0_writeP0_P7
STMFD sp!,{r1-r3,lr}
;R0 LOW 8-BIT => PIO0-PIO7
;SET R0 BEFORE CALL
LDR R1,=PIO_BASE
LDR R3,=P0_P7MASK
MOV R2,R0;backup r0
BIC R2,R2,R3
STR R2,[R1,#0x30];SET OUTPUT DATA REGISTER
MVN R2,R0
BIC R2,R2,R3
STR R2,[R1,#0x34];CLEAR OUTPUT DATA REGISTER
LDMFD sp!,{r1-r3,PC};Return
LCD_CommandWrite
STMFD sp!,{r0-r1,lr}
;写指令,r7
;>=140ns? or delay450ns=>600ns
ldrb r0,=LCD_CW_E
ldr r1,=CS4_addr
strb r0,[R1]
mov r0,r7
bl R0_writeP0_P7
bl delay600ns
;write,close E
ldrb r0,=LCD_CW
strb r0,[R1]
bl delay600ns
LDMFD sp!,{r0-r1,PC};Return
LCD_CommandRead
STMFD sp!,{r0-r1,lr}
;读指令
;读BF到C
;读AC到r6 low 8 bit
;>=140ns? or delay450ns=>600ns
ldrb r0,=LCD_CR_E
ldr r1,=CS4_addr
strb r0,[R1]
bl delay600ns
;read,close E
bl R0_readP0_P7
mov r6,r0
mov r0,r0,lsr #8;BF to C flag
ldrb r0,=LCD_CR
strb r0,[R1]
bl delay600ns
LDMFD sp!,{r0-r1,PC};Return
LCD_DataRead
STMFD sp!,{r0-r1,lr}
;读数据,R7
;>=140ns? or delay450ns=>600ns
ldrb r0,=LCD_DR_E
ldr r1,=CS4_addr
strb r0,[R1]
bl delay600ns
;read,close E
bl R0_readP0_P7
mov r7,r0
ldrb r0,=LCD_DR
strb r0,[R1]
bl delay600ns
LDMFD sp!,{r0-r1,PC};Return
LCD_DataWrite
STMFD sp!,{r0-r1,lr}
;写数据,r7
;>=140ns? or delay450ns=>600ns
ldrb r0,=LCD_DW_E
ldr r1,=CS4_addr
strb r0,[R1]
mov r0,r7
bl R0_writeP0_P7
bl delay600ns
;write,close E
ldrb r0,=LCD_DW
strb r0,[R1]
bl delay600ns
LDMFD sp!,{r0-r1,PC};Return
PR1 STMFD sp!,{lr}
;写指令
;preset R7
PR11
bl LCD_CommandRead
bcs PR11
bl LCD_CommandWrite
LDMFD sp!,{PC};Return
PR2 STMFD sp!,{lr}
;写显示数据,
;preset r7
PR21
bl LCD_CommandRead
bcs PR21
bl LCD_DataWrite
LDMFD sp!,{PC};Return
PR3 STMFD sp!,{lr}
;读显示数据,r7
PR31
bl LCD_CommandRead
bcs PR31
bl LCD_DataRead
LDMFD sp!,{PC};Return
INITLCD STMFD sp!,{R7,lr}
;LCD初始化设置子程序
ldr r7,=0x00000030
bl PR1
bl delay2ms
ldr r7,=0x00000030
bl PR1
bl delay2ms
ldr r7,=0x00000030
bl PR1
bl delay2ms
ldr r7,=0x00000038
bl PR1;设置工作方式
ldr r7,=0x00000001
bl PR1;清屏
ldr r7,=0x00000006
bl PR1;设置输入方式
ldr r7,=0x00000000F
bl PR1;设置显示方式
LDMFD sp!,{R7,PC};Return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -