📄 demolcd.s
字号:
;初始化后COL1…COL4锁成0
;PIO中断时处理键的扫描、去抖、处理
;100X XXXX,读写键盘,防止对LCD操作
;LCD的操作中
;XXXX 1111,还可以禁止键盘
AREA BOOTROM, CODE, READONLY
ARM_MODE_SYS EQU 0x1F
ARM_MODE_IRQ EQU 0x12
I_BIT EQU 0x80
Mode_USR EQU 0x10
Mode_FIQ EQU 0x11
Mode_IRQ EQU 0x12
Mode_SVC EQU 0x13
Mode_ABT EQU 0x17
Mode_UND EQU 0x1B
I_Bit EQU 0x80
F_Bit EQU 0x40
AIC_BASE EQU 0xFFFFF000
AIC_EOICR EQU 0x0130
;PIO IRQ
AIC_SMR0 EQU 0xFFFFF000
AIC_SVR0 EQU 0xFFFFF080
AIC_SMR1 EQU 0xFFFFF004
AIC_SVR1 EQU 0xFFFFF084
AIC_SMR8 EQU 0xFFFFF020
AIC_SVR8 EQU 0xFFFFF0A0
AIC_IECR EQU 0xFFFFF120
AIC_IDCR EQU 0xFFFFF124
PIO_ISR EQU 0xFFFF004C
PIO_PDSR EQU 0xFFFF003C
PIO_BASE EQU 0xFFFF0000
P0_P7MASK EQU 0xFFFFFF00
USART0 EQU 0xFFFD0000
USART1 EQU 0xFFFCC000
CS4_addr EQU 0x40000000
;LCD and keyboard
FLASHROM_addr EQU 0x01000000
;ON Chip RAM
send_bufffer EQU 0x00000E00;
receive_bufffer EQU 0x00000D00;
cur_addr_download_end EQU 0x00000F84;end address of cur sector
addr_download EQU 0x00000F88;start address of download
secsize_download EQU 0x00000F8C;sector size of download
debug_SP_Start EQU 0x00000F90;sector size of download
debug_SP_End EQU 0x00000F94;sector size of download
s_addr_display EQU 0x00000F98;start address of download
LCDparam EQU 0x00000F00;????????????????????
RAM_Limit EQU 0x02080000 ;SRAM end
IRQ_Stack EQU RAM_Limit ; 1K IRQ stack at top of memory
SVC_Stack EQU RAM_Limit-2048 ; followed by SVC stack 0x1F7FF
USR_Stack EQU SVC_Stack-2048 ; followed by USR stack 0x1EFFF
FIQ_Stack EQU USR_Stack-2048 ; followed by USR stack 0x1EFFF
;XXXX 0000
;E(1),R/~W,RS(1 data,0 commmand)
LCD_CW_E EQU 0x01
;100 X
LCD_CR_E EQU 0x03
;110 X
LCD_DW_E EQU 0x05
;101 X
LCD_DR_E EQU 0x07
;111 X
;write to cs4
LCD_CW EQU 0x00
;000 X
LCD_CR EQU 0x02
;010 X
LCD_DW EQU 0x04
;001 X
LCD_DR EQU 0x06
;011 X
;write to cs4
Zero EQU 0
ReadC EQU 256
WriteI EQU 512
ENTRY
lcd_main STMFD sp!,{r5,lr}
BL INITLCD
LDR R5,=my_wel_str
BL WRIstring
LDMFD sp!,{r5,pc};Return
CPL_P0P7
STMFD sp!,{r0-r3,lr}
;PIO_ODSR EQU 0xFFFF0038
LDR R1,=PIO_BASE
LDR R3,=P0_P7MASK
LDR r0,[r1,#0x38]
MVN r0,r0
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!,{r0-r3,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
LIGHTLED STMDB sp!,{R0-R3,lr}
LDR R2,=0x0;COUNT
LDRB R3,=0x04
LIGHTLED_LOOP
bl CPL_P0P7
bl delay1s
ADD R2,R2,#1
CMP R2,R3
BNE LIGHTLED_LOOP
LDMIA sp!,{R0-R3,PC};Return
delay1s
STMFD sp!,{r0,lr}
ldr r0, =0x007c0e21
dly1s
sub r0,r0,#1
CMP R0,#0
bne dly1s
LDMFD sp!,{r0,PC};Return
delay8s
STMFD sp!,{r0,lr}
ldr r0, =0x03e07108
dly8s
sub r0,r0,#1
CMP R0,#0
bne dly8s
LDMFD sp!,{r0,PC};Return
;---------------------------------------------------------
delay7us
;24M
STMFD sp!,{r0,lr}
ldr r0, =0x00000040
dly7us
sub r0,r0,#1
CMP R0,#0
bne dly7us
LDMFD sp!,{r0,PC};Return
delay20ms
;24M
STMFD sp!,{r0,lr}
ldr r0, =0x000208d5
dly20ms
sub r0,r0,#1
CMP R0,#0
bne dly20ms
LDMFD sp!,{r0,PC};Return
delay2ms
STMFD sp!,{r0,lr}
ldr r0, =0x00013880
dly2ms
sub r0,r0,#1
CMP R0,#0
bne dly2ms
LDMFD sp!,{r0,PC};Return
delay1ms
STMFD sp!,{r0,lr}
ldr r0, =0x00000880
dly1ms
sub r0,r0,#1
CMP R0,#0
bne dly1ms
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
;new
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
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}
;读指令
LDR R0,=PIO_BASE
LDR R1,=0xFFFFFFFF
STR R1,[R0,#0x14];PIO_ODR,all pins as input
LDR R1,=0x00000000
STR R1,[R0,#0x10];PIO_OER
;读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
;change for new,2001.10.11
bl R0_readP0_P7
mov r6,r0
mrs r1,CPSR
bic r1,r1,#0x20000000
msr CPSR,r1;clr C
mov r0,r0,ROR #8;BF to C flag
;???????????????????????????????????????
LDR R0,=PIO_BASE
LDR R1,=0xFFFFFF00
STR R1,[R0,#0x14];PIO_ODR,p0-p7 output
LDR R1,=0x000000ff
STR R1,[R0,#0x10];PIO_OER
ldrb r0,=LCD_CR
ldr r1,=CS4_addr
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 delay2ms
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
bl delay1ms
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;设置工作方式8-bit,
bl delay2ms
ldr r7,=0x00000001
bl PR1;清屏
bl delay2ms
ldr r7,=0x00000006
bl PR1;设置输入方式
bl delay2ms
ldr r7,=0x00000000F
bl PR1;设置显示方式
bl delay2ms
LDMFD sp!,{R7,PC};Return
DISPLAY_CHAR STMFD sp!,{r1,R7,lr}
;hex to char
;WRITE R3 LOW 4 BIT BEFORE CALL
;R3 LOW 4-BIT
LDR R1,=hex_to_char_tab;hex->char
LDRB R7,[R1,R3]
bl PR2
LDMFD sp!,{r1,R7,PC};Return
DISPLAY_R0 STMFD sp!,{R1-R3,lr}
;DISPLAY R0
;WRITE R0 BEFORE
LDR R2,=0x1C;右移位数
LDR R1,=0x0FFFFFFF
DIS_R0_LOOP
BIC R3,R0,R1
MOV R3,R3,LSR R2
BL DISPLAY_CHAR;
CMP R2,#0
BEQ DIS_R0_END
MOV R1,R1,ROR #4
SUB R2,R2,#4
B DIS_R0_LOOP
DIS_R0_END
LDMFD sp!,{R1-R3,PC};Return
DISPLAYRAM STMFD sp!,{R0-R2,lr}
;r1 start addr
; LDR R1,=0x02000000;START ADDRESS TO DISPLAY
;以0xFFFFFFFF结尾
SUB R1,R1,#4
LDR R2,=0xFFFFFFFF;END OF DISP
DISPRAMLOOP LDR R0,[R1,#4]!
CMP R0,R2
BEQ DISPRAMEND
BL DISPLAY_R0
B DISPRAMLOOP
DISPRAMEND
LDMFD sp!,{R0-R2,PC};Return
WRIstring STMFD sp!,{r0,r7,lr}
;正常显示字符串,以0x00结尾
;入口:r5=字符串首地址!
LDR R0,=0x0;COUNT
WRIachar LDRB R7,[R5,R0]
CMP R7,#0
BEQ WRIstrend
BL PR2
ADD R0,R0,#1
;swi 0
bl CPL_P0P7
B WRIachar
WRIstrend LDMFD sp!,{r0,r7,pc};Return
test_DISPLAY_R0
STMFD sp!,{r0,lr}
ldr r0,=0xa5a5a5a5
bl DISPLAY_R0
LDMFD sp!,{r0,pc};Return
my_wel_str
DCB 'W','e','l','c';"Welcome!-Happy Long"
DCB 'o','m','e','!'
DCB '-','H','a','p'
DCB 'p','y',' ','L'
DCB 'o','n','g',' '
DCD 0x00000000;C7D6 NO
hex_to_char_tab
DCB "0","1","2","3"
DCB "4","5","6","7"
DCB "8","9","A","B"
DCB "C","D","E","F"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -