⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demolcd.s

📁 at91arm7处理器的启动源码
💻 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 + -