;******************************************************************************
; 文件名:ADC0.S
; 功能:使用ADC模块的通道0进行电压的测量,然后将转换结果的高8位值输出LED1--LED8
; 显示。
; 说明:由W1调节测量电压值。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
; 定义PCLK值
FPCLK EQU 11059200
; 定义ADC控制字 (设置通道0进行ADC转换)
ADC_MODE EQU (1 | ((FPCLK / 1000000 - 1) | (0 | (0 | (1 | (0 | (1 | (0
; 定义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