?? i2cdisp.s
字號(hào):
;******************************************************************************
; 文件名:I2CDISP.S
; 功能:使用硬件I2C對(duì)ZLG7290進(jìn)行操作,使用查詢方式操作。
; 說(shuō)明:將跳線器JP5短接。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
I2C_BASE EQU 0xE001C000
ZLG7290 EQU 0x70 ; 定義ZLG7290從地址
AREA I2CDISPC,CODE,READONLY
ENTRY
MAIN LDR SP,=0x40003F00 ; 設(shè)置堆棧指針SP
LDR R0,=PINSEL0 ; 設(shè)置I2C控制口有效
MOV R1,#0x50
STR R1,[R0]
BL SYSCLK_INI ; 設(shè)置系統(tǒng)時(shí)鐘
; 設(shè)置I2C時(shí)鐘為30KHz (Fpclk=11.0592MHz)
LDR R0,=I2C_BASE
MOV R1,#184
STR R1,[R0,#0x10] ; I2SCLH=184
STR R1,[R0,#0x14] ; I2SCLL=184
BL ZLG7290_DISP ; 顯示"LPC2210F"
HALT B HALT
;******************************************************************************
; 名稱:ZLG7290_DISP
; 功能:發(fā)送顯示數(shù)據(jù)到ZLG7290顯示。
; 入口參數(shù):無(wú)
; 出口參數(shù):無(wú)
; 占用資源:(R2、R3、R4、R5)
;******************************************************************************
ZLG7290_DISP
STMFD SP!,{R0-R7,LR}
MOV R2,#ZLG7290 ; 設(shè)置從機(jī)地址
MOV R3,#0x10 ; 指定子地址
LDR R4,=DISP_DAT ; 指定數(shù)據(jù)發(fā)送區(qū)
MOV R5,#8 ; 發(fā)送8個(gè)數(shù)據(jù)
BL IWRNBYTE ; 調(diào)用IWRNBYTE
LDMFD SP!,{R0-R7,PC}
; 定義特殊字模,字段格式:a b c d e f g h
Sa EQU (1<<7)
Sb EQU (1<<6)
Sc EQU (1<<5)
Sd EQU (1<<4)
Se EQU (1<<3)
Sf EQU (1<<2)
Sg EQU (1<<1)
Sh EQU (1<<0)
CHAR_L EQU (Sd|Se|Sf)
CHAR_P EQU (Sa|Sb|Se|Sf|Sg)
CHAR_C EQU (Sa|Sd|Se|Sf)
CHAR_2 EQU (Sa|Sb|Sd|Se|Sg)
CHAR_1 EQU (Sb|Sc)
CHAR_0 EQU (Sa|Sb|Sc|Sd|Se|Sf)
CHAR_F EQU (Sa|Se|Sf|Sg)
; 顯示數(shù)據(jù)定義,"LPC2210F"
DISP_DAT DCD CHAR_F, CHAR_0, CHAR_1, CHAR_2, CHAR_2, CHAR_C, CHAR_P, CHAR_L, 0x00
;******************************************************************************
; 名稱:SYSCLK_INI
; 功能:設(shè)置系統(tǒng)時(shí)鐘。(M值為4,P值為2)
; 入口參數(shù):無(wú)
; 出口參數(shù):無(wú)
; 占用資源: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,設(shè)置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
;******************************************************************************
; 名稱:START_I2C
; 功能:起動(dòng)總線
; 入口參數(shù):無(wú)
; 出口參數(shù):無(wú)
; 占用資源:R0、R1
;******************************************************************************
START_I2C
LDR R0,=I2C_BASE
MOV R1,#0x2C
STR R1,[R0,#0x18] ; 清除所有標(biāo)志位(I2CONCLR=0x2C)
MOV R1,#0x40
STR R1,[R0] ; 設(shè)置為主機(jī)(I2CONSET=0x40)
MOV R1,#0x60
STR R1,[R0] ; 起動(dòng)總線,AA=0
START_I2CL1 LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ START_I2CL1
MOV PC,LR ; 返回
;******************************************************************************
; 名稱:SENDBYTE
; 功能:發(fā)送一字節(jié)數(shù)據(jù)
; 入口參數(shù):R2 要發(fā)送的數(shù)據(jù),低8位有效
; 出口參數(shù):無(wú)
; 占用資源:R0、R1、R2
;******************************************************************************
SENDBYTE
LDR R0,=I2C_BASE
STR R2,[R0,#0x08] ; 發(fā)送數(shù)據(jù),I2DAT=data
MOV R1,#0x28
STR R1,[R0,#0x18] ; 清除標(biāo)志位STA,SI(I2CONCLR=0x28)
SENDBYTE_L1 LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ SENDBYTE_L1
MOV PC,LR
;******************************************************************************
; 名稱:RCVBYTE_NA
; 功能;接上I2C總線上一字節(jié)數(shù)據(jù),并發(fā)送非應(yīng)答位
; 入口參數(shù):無(wú)
; 出口參數(shù):R2 讀出的數(shù)據(jù)
; 占用資源;R0、R1、R2
;******************************************************************************
RCVBYTE_NA
LDR R0,=I2C_BASE
MOV R1,#0x0C
STR R1,[R0,#0x18] ; 清零AA,即發(fā)送非應(yīng)答位. 同時(shí)清除SI,允許接收數(shù)據(jù)(I2CONCLR=0x0C)
RCVBYTE_NAL1
LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ RCVBYTE_NAL1
LDR R2,[R0,#0x08] ; 讀取接收到的數(shù)據(jù)
MOV PC,LR
;******************************************************************************
; 名稱:RCVBYTE_A
; 功能;接上I2C總線上一字節(jié)數(shù)據(jù),并發(fā)送應(yīng)答位
; 入口參數(shù):無(wú)
; 出口參數(shù):R2 讀出的數(shù)據(jù)
; 占用資源;R0、R1、R2
;******************************************************************************
RCVBYTE_A
LDR R0,=I2C_BASE
; 置位AA,即發(fā)送應(yīng)答位. 同時(shí)清除SI,允許接收數(shù)據(jù)(I2CONCLR=0x08)
MOV R1,#0x04
STR R1,[R0]
MOV R1,#0x08
STR R1,[R0,#0x18]
RCVBYTE_AL1 LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ RCVBYTE_AL1
LDR R2,[R0,#0x08] ; 讀取接收到的數(shù)據(jù)
MOV PC,LR
;******************************************************************************
; 名稱:STOP_I2C
; 功能:結(jié)束總線
; 入口參數(shù):無(wú)
; 出口參數(shù):無(wú)
; 占用資源:R0、R1
;******************************************************************************
STOP_I2C
LDR R0,=I2C_BASE
MOV R1,#0x2C
STR R1,[R0,#0x18] ; 清除標(biāo)志位STA,SI。(I2CONCLR=0x2C)
MOV R1,#0x50
STR R1,[R0] ; 發(fā)送結(jié)束總線信號(hào)
MOV PC,LR
;******************************************************************************
; 名稱:IWRBYTE
; 功能:向指定從機(jī),發(fā)送一字節(jié)數(shù)據(jù)。(無(wú)子地址)
; 入口參數(shù):R2 從要地址
; R3 所要發(fā)送的數(shù)據(jù)
; 出口參數(shù):無(wú)
; 占用資源:R0、R1、R2、R3
;******************************************************************************
IWRBYTE
STMFD SP!,{R0-R7,LR}
BL START_I2C ; 起動(dòng)總線
BL SENDBYTE ; 發(fā)送從機(jī)地址
MOV R2,R3
BL SENDBYTE ; 發(fā)送數(shù)據(jù)
BL STOP_I2C ; 結(jié)束總線
LDMFD SP!,{R0-R7,PC} ; 返回操作
;******************************************************************************
; 名稱:IWRNBYTE
; 功能:向指定從機(jī),發(fā)送多字節(jié)數(shù)據(jù)。
; 入口參數(shù):R2 從要地址
; R3 子地址
; R4 要發(fā)送的數(shù)據(jù)的地址指針
; R5 要發(fā)送的數(shù)據(jù)個(gè)數(shù)
; 出口參數(shù):無(wú)
; 占用資源:R0、R1、R2、R3、R4、R5
;******************************************************************************
IWRNBYTE
STMFD SP!,{R0-R7,LR}
CMP R5,#0 ; 參數(shù)過(guò)濾,若發(fā)送個(gè)數(shù)為0,則直接退出
BEQ IWRNBYTE_END
BL START_I2C ; 起動(dòng)總線
BL SENDBYTE ; 發(fā)送從機(jī)地址
MOV R2,R3
BL SENDBYTE ; 發(fā)送子地址
IWRNBYTE_L1 LDR R2,[R4],#4 ; 讀取要發(fā)送的數(shù)據(jù),且R4 = R4 + 4
BL SENDBYTE ; 發(fā)送數(shù)據(jù)
SUBS R5,R5,#1
BNE IWRNBYTE_L1
BL STOP_I2C ; 結(jié)束總線
IWRNBYTE_END
LDMFD SP!,{R0-R7,PC} ; 返回操作
;******************************************************************************
; 名稱:IRDBYTE
; 功能:向指定從機(jī)讀取一字節(jié)數(shù)據(jù)。(無(wú)子地址)
; 入口參數(shù):R2 從要地址
; 出口參數(shù):R2 讀出的數(shù)據(jù)
; 占用資源:R0、R1、R2
; 說(shuō)明:本程序會(huì)對(duì)從機(jī)地址進(jìn)行自動(dòng)加1處理
;******************************************************************************
IRDBYTE
STMFD SP!,{R0,R1,R3-R7,LR}
ADD R2,R2,#1 ; 設(shè)置為讀操作
BL START_I2C ; 起動(dòng)總線
BL SENDBYTE ; 發(fā)送從機(jī)地址
BL RCVBYTE_NA ; 接收1字節(jié)數(shù)據(jù),并發(fā)送非應(yīng)答位
BL STOP_I2C ; 結(jié)束總線
LDMFD SP!,{R0,R1,R3-R7,PC} ; 返回操作
;******************************************************************************
; 名稱:IRDNBYTE
; 功能:向指定從機(jī)讀取多字節(jié)數(shù)據(jù)。
; 入口參數(shù):R2 從要地址
; R3 子地址
; R4 要接收的數(shù)據(jù)的地址指針
; R5 要發(fā)送的數(shù)據(jù)個(gè)數(shù)
; 出口參數(shù):無(wú)
; 占用資源:R0、R1、R2、R3、R4、R5、R6
; 說(shuō)明:本程序會(huì)對(duì)從機(jī)地址進(jìn)行自動(dòng)加1處理
;******************************************************************************
IRDNBYTE
STMFD SP!,{R0-R7,LR}
CMP R5,#0 ; 入口參數(shù)過(guò)濾,若操作數(shù)據(jù)個(gè)數(shù)為0,直接退出
BEQ IRDNBYTE_END
BL START_I2C ; 起動(dòng)總線
BL SENDBYTE ; 發(fā)送從機(jī)地址
MOV R6,R2 ; 暫存從機(jī)地址
MOV R2,R3
BL SENDBYTE ; 發(fā)送子地址
MOV R2,R6
BL START_I2C ; 重新啟動(dòng)總線
ADD R2,R2,#1
BL SENDBYTE ; 發(fā)送從機(jī)地址
IRDNBYTE_L2 CMP R5,#1
BLNE RCVBYTE_A
BLEQ RCVBYTE_NA
STR R2,[R4],#4 ; 保存讀出的數(shù)據(jù)
SUBS R5,R5,#1
BNE IRDNBYTE_L2 ; 判斷是否讀完畢
BL STOP_I2C ; 結(jié)束總線
IRDNBYTE_END
LDMFD SP!,{R0-R7,PC}
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -