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

📄 adc0.s

📁 周立功《ARM与嵌入式系统基础教程》第5章
💻 S
字号:
;****************************************************************************** 
; 文件名:ADC0.S
; 功能:使用ADC模块的通道0进行电压的测量,然后将转换结果的高8位值输出LED1--LED8
;      显示。
; 说明:由W1调节测量电压值。
;****************************************************************************** 
			INCLUDE		LPC2294.INC
			EXPORT  	MAIN	
	
; 定义PCLK值			
FPCLK			EQU		11059200			
; 定义ADC控制字 (设置通道0进行ADC转换)
ADC_MODE		EQU		  (1 << 0)\
                        | ((FPCLK / 1000000 - 1) << 8)\
                        | (0 << 16)\
                        | (0 << 17)\
                        | (1 << 21)\
                        | (0 << 22)\
          				| (1 << 24)\
          				| (0 << 27)

; 定义SPI控制口
SPI_CS			EQU	    0x00000100		; P0.8
SPI_DATA		EQU	    0x00000040		; P0.6
SPI_CLK			EQU	    0x00000010		; P0.4

SPI_IOCON		EQU	    0x00000150		; SPI接口的I/O设置字
		

			AREA   	LEDDISPC,CODE,READONLY 
		    ENTRY
		    CODE32
		    
MAIN		LDR		SP,=0x40003F00		
		    LDR	    R0,=PINSEL0			
		    MOV	    R1,#0x00000000		
		    STR	    R1,[R0]
		    MOV		R1,#0x00400000		; 设置P0.27连接到AIN0
		    STR	    R1,[R0,#0x04]
		   	BL		SYSCLK_INI			; 设置系统时钟

		    LDR	    R0,=IO0DIR			; 设置SPI控制口为输出				
		    MOV	    R1,#SPI_IOCON		
		    STR	    R1,[R0]

MAIN_LOOP	LDR		R0,=ADCR
		    LDR		R1,=ADC_MODE		
		    STR		R1,[R0]				; 启动ADC转换
			BL		DELAYS
			LDR		R0,=ADDR
			LDR		R1,[R0]
			ANDS	R1,R1,#0x80000000
			BEQ		MAIN_LOOP			; 判断AD转换是否已结束
			
			LDR		R1,[R0]				; 读取ADC转换结果
			MVN		R2,R1,LSR #0x08		; 右移8位后得到8位ADC数据,取反后放入R2
		    BL	    HC595_SENDDAT		; 发送显示
		    B	    MAIN_LOOP

 
;******************************************************************************		
; 名称:SYSCLK_INI
; 功能:设置系统时钟。(M值为4,P值为2)
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1		
;******************************************************************************
SYSCLK_INI	
			LDR		R0,=VPBDIV
			MOV		R1,#0x00
			STR		R1,[R0]					; VPBDIV=0x00
			
			LDR		R0,=PLLCFG
			MOV		R1,#0x23
			STR		R1,[R0]					; PLLCFG=0x23,设置M值为4,P值为2
			LDR		R0,=PLLCON
			MOV		R1,#0x01
			STR		R1,[R0]					; PLLCON=0x01
			LDR		R0,=PLLFEED
			MOV		R1,#0xAA
			STR		R1,[R0]					; PLLFEED=0xAA
			MOV		R1,#0x55
			STR		R1,[R0]					; PLLFEED=0x55
WAIT_OK		LDR		R0,=PLLSTAT				
			LDR		R1,[R0]
			ANDS	R1,R1,#0x0400
			BEQ		WAIT_OK					; 等待PLL锁定
			
			LDR		R0,=PLLCON
			MOV		R1,#0x03
			STR		R1,[R0]
			LDR		R0,=PLLFEED
			MOV		R1,#0xAA
			STR		R1,[R0]
			MOV		R1,#0x55
			STR		R1,[R0]	
			
			MOV		PC,LR		    

;******************************************************************************		
; 名称:HC595_SENDDAT
; 功能:向74HC595发送一字节数据
; 入口参数:R2		待发送的数据,低8位有效
; 出口参数:无
; 占用资源:(R0、R1、R2、R7)
;******************************************************************************
HC595_SENDDAT
		    STMFD	SP!,{R0-R12,LR}		; 寄存器入栈保护
		    LDR	    R0,=IO0CLR		    ; SPI_CS = 0
		    MOV	    R1,#SPI_CS
		    STR	    R1,[R0]
		
		    MOV	    R7,#8
HC595_SDL1	LDR	    R0,=IO0CLR		    ; SPI_CLK = 0
		    MOV	    R1,#SPI_CLK
		    STR	    R1,[R0]
		
		    ANDS	R1,R2,#0x00000080	; 判断要发送的数据位,并设置SPI_DAT
		    LDRNE	R0,=IO0SET
		    LDREQ	R0,=IO0CLR
		    MOV	    R1,#SPI_DATA
		    STR	    R1,[R0]
		    MOV	    R2,R2,LSL #1        ; 数据左移一位
		
		    LDR	    R0,=IO0SET		    ; SPI_CLK = 1
		    MOV	    R1,#SPI_CLK
		    STR	    R1,[R0]
		
		    SUBS	R7,R7,#1
		    BNE	    HC595_SDL1		    ; 若数据未发送完毕,再次发送
		
		    LDR	    R0,=IO0SET		    ; SPI_CS = 1,输出显示数据
		    MOV	    R1,#SPI_CS
		    STR	    R1,[R0]
		
		    LDMFD	SP!,{R0-R12,PC}		; 返回  
		    
		    
;******************************************************************************
; 名称:DELAYS
; 功能:软件延时
; 入口参数:无
; 出口参数:无
; 占用资源:R7
;******************************************************************************
DELAYS	
			MOV		R7,#0x0000FF00		; 延时参数
DELAYS_L1	SUBS	R7,R7,#1		    ; R7 = R7-1
			BNE		DELAYS_L1          	; 判断R7-1结果是否为0,若不为0则跳转
			MOV		PC,LR				; 返回		    
		    
		    LTORG						; 声明文字池	

			END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -