📄 push.s
字号:
/* include symbol file */.include "push.h"/* define symbols of program */.set IRQ0, 0x00000001.set IRQ6, 0x00000040.set IRQ7, 0x00000080.set DELAY_CNT, 0xffff.set MODE_USR, 0x10.set MODE_IRQ, 0x12.set MODE_SVC, 0x13.set I_BIT, 0x80.set F_BIT, 0x40.set LCM_WR_1, 0x00000010.set LCM_WR_0, 0xffffffef.set LCM_RS_1, 0x00000020.set LCM_RS_0, 0x000000df.set LCM_E_1, 0x00000020.set LCM_E_0, 0xffffffdf.set LCM_FUNC_SET, 0x38.set LCM_DISP_ON, 0x0e.set LCM_DISP_OFF, 0x08.set LCM_DISP_CLR, 0x01.set LCM_ENTRY_SET, 0x06/* define symbols for memory management */.set IRQ_STACK, 0x08031000.set USR_STACK, 0x08030f00.set SVC_STACK, 0x08030e00.set LED_STATUS, 0x08030000.set LCM_STATUS, 0x08030001.global _start_start:.text.code 32exception_vector: b reset_handler b undefined_handler b swi_handler b prefetch_handler b abort_handler nop b irq_handler b fiq_handler /* reset exception handler */reset_handler:/* allocate stack for supervisor mode */ ldr sp, =SVC_STACK/* initialize variable LED_STATUS */ ldr r0, =LED_STATUS mov r1, #0x01 strb r1, [r0]/* initialize variable LCM_STATUS */ ldr r0, =LCM_STATUS mov r1, #0 strb r1, [r0]/* setup PORT A */ ldr r0, =PORTA_DIR mov r1, #0 str r1, [r0] ldr r0, =PORTA_MUX ldr r1, =0x3fff str r1, [r0]/* setup PORT 7 */ ldr r0, =PORT7_DIR mov r1, #0xcf str r1, [r0] ldr r0, =PORT7_MUX mov r1, #0x30 str r1, [r0] /* setup PORT B */ ldr r0, =PORTB_DIR mov r1, #0 str r1, [r0] ldr r0, =PORTB_DATA mov r1, #0 str r1, [r0] ldr r0, =PORTB_MUX ldr r1, =0x00000faa str r1, [r0]/* setup PORT 9 */ ldr r0, =PORT9_DIR mov r1, #0 str r1, [r0] ldr r0, =PORT9_DATA mov r1, #0 str r1, [r0] ldr r0, =PORT9_MUX ldr r1, =0x00000140 str r1, [r0]/* initialize LCM */ adr r6, string_init mov r8, #5 lcm_init_loop: ldrb r1, [r6] ldr r2, =LCM_RS_0 bl lcm_write add r6, r6, #1 subs r8, r8, #1 bne lcm_init_loop/* setup interrupt controller */ ldr r0, =TRIGGER_MODE ldr r1, =0x01000000 str r1, [r0] ldr r0, =TRIGGER_POLAR ldr r1, =0x01000000 str r1, [r0] ldr r0, =INT_DIR mov r1, #0 str r1, [r0] ldr r0, =FIQ_MASK ldr r1, =0x01ffffff str r1, [r0] ldr r0, =IRQ_MASK ldr r1, =0x01ffffbe str r1, [r0] ldr r0, =INT_STATUS_CLR ldr r1, =0x00000041 str r1, [r0] ldr r0, =GLOBAL_MASK ldr r1, =0x01ffffbe str r1, [r0] /* chnage to irq mode and allocate stack */ mov r0, #MODE_IRQ | I_BIT | F_BIT msr cpsr_c, r0 ldr sp, =IRQ_STACK /* change to user mode and allocate stack */ mov r0, #MODE_USR msr cpsr_c, r0 ldr sp, =USR_STACK/* jump to main program */ b start/* undefined exception handler */undefined_handler: movs pc, lr/* swi exception handler */swi_handler: movs pc, lr/* prefetch abort exception handler */prefetch_handler: subs pc, lr, #4/* data abort exception handler */abort_handler: subs pc, lr, #8/* irq exception handler */irq_handler: sub lr, lr, #4 stmfd sp!, {r0-r12,lr} ldr r0, =IRQ_STATUS ldrt r4, [r0] tst r4, #IRQ0 blne irq0_handler tst r4, #IRQ6 blne irq6_handler ldmfd sp!, {r0-r12,pc}^/* irq0 handler */ irq0_handler: ldr r0, =INT_STATUS_CLR ldr r1, =0x00000001 strt r1, [r0] ldr r0, =LED_STATUS ldrbt r1, [r0] cmp r1, #0x00000080 movne r1, r1, LSL #1 moveq r1, #1 strb r1, [r0] mvn r1, r1 ldr r0, =PORTA_DATA strt r1, [r0] mov pc, lr /* irq 6 handler */irq6_handler: mov r3, lr ldr r0, =INT_STATUS_CLR ldr r1, =0x00000040 strt r1, [r0] ldr r1, =LCM_DISP_CLR ldr r2, =LCM_RS_0 bl lcm_write ldr r0, =LCM_STATUS ldrb r1, [r0] cmp r1, #9 subeq r1, r1, r1 addne r1, r1, #1 strb r1, [r0] add r1, r1, #0x30 ldr r2, =LCM_RS_1 bl lcm_write mov lr, r3 mov pc, lr /* fiq exception handler */fiq_handler: subs pc, lr, #4/* declare constants */.poolstring_init:.byte LCM_FUNC_SET, LCM_DISP_OFF, LCM_DISP_CLR, LCM_DISP_ON, LCM_ENTRY_SET/* main program */start:/* display first LED */ ldr r0, =LED_STATUS ldrb r1, [r0] mvn r1, r1 ldr r0, =PORTA_DATA str r1, [r0] /* LCM display char 0 */ ldr r0, =LCM_STATUS ldrb r1, [r0] add r1, r1, #0x30 ldr r2, =LCM_RS_1 bl lcm_write/* program wait here */stop: b stop/* lcm write subroutine */lcm_write: stmfd sp!, {r0-r7, lr} mov r3, #0 mov r5, #0 ldr r0, =PORT9_DATA ldr r4, =LCM_E_0 and r3, r3, r4 str r3, [r0] ldr r0, =0x1fff bl delay ldr r0, =PORT7_DATA orr r5, r5, r2 str r5, [r0] ldr r0, =PORT9_DATA ldr r4, =LCM_WR_0 and r3, r3, r4 str r3, [r0] ldr r0, =0x1fff bl delay ldr r0, =PORT9_DATA ldr r4, =LCM_E_1 orr r3, r3, r4 str r3, [r0] ldr r0, =0x1fff bl delay ldr r0, =PORTB_DATA str r1, [r0] ldr r0, =0x1fff bl delay ldr r0, =PORT9_DATA ldr r4, =LCM_E_0 and r3, r3, r4 str r3, [r0] ldr r0, =0x1fff bl delay ldmfd sp!, {r0-r7, lr} mov pc, lr /* delay subroutine */delay: subs r0, r0, #1 bne delay mov pc, lr.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -