?? adc0.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 + -