📄 ad7730 spi serial convert.asm
字号:
;===========================================================================
; Use SPI Get AD7730 data to Dis
; For AT89S8253
; By: LHW
;================================== Log ====================================
;
;========================= Functions & Capacities ==========================
;
;=============================== Constant ==================================
SysStack Equ 07H ;System Stack:08H..1fh,24 Total
Time0 Equ 65536-2500+5 ;0.0025s 2.5ms,机器周期T=1us
CntSec250 Equ 4 ;4*0.0025
CntSec100 Equ 10 ;10*0.01
CntSec10 Equ 10 ;10*0.1
;---------------------------------------------------------------------------
;Display 7219 Const
DECODE_MODE EQU 09H ;7291寄存器
INTENSITY EQU 0AH
SCAN_LIMIT EQU 0BH
SHUT_DOWN EQU 0CH
DISPLAY_TEST EQU 0FH
;---------------------------------------------------------------------------
;Key Const
;---------------------------------------------------------------------------
;================================ Hardware =================================
;KeyPort
KeyPort Equ P0 ;键盘的端口
RayKey1 Equ P0.0 ;列1
RayKey2 Equ P0.1 ;列2
RayKey3 Equ P0.2 ;列3
RayKey4 Equ p0.3 ;列4
LineKey1 Equ P0.4 ;行1
LineKey2 Equ P0.5 ;行2
LineKey3 Equ P0.6 ;行3
LineKey4 Equ P0.7 ;行4
;-----------------------------------------------------------------
;SPI Port
CS_ BIT p1.4 ; slave select
MOSI BIT p1.5 ; SPI
MISO BIT p1.6 ; SPI
SCK BIT p1.7 ; SPI
;---------------------------------------------------------------------------
;AD7730 Port
AdCS_ BIT P1.4
AdDIN BIT P1.5
AdDOUT BIT P1.6
AdSCK BIT P1.7
RDY_ BIT P3.2 ;Connect to Int1,use X_Interrupt
;-----------------------------------------------------------------
;max7219 port
DIN BIT P2.0
LOAD BIT P2.1
CLK BIT P2.2
;-----------------------------------------------------------------
;CD4097 Analog Switches port
CD4097_A BIT P1.0
CD4097_B BIT P1.1
CD4097_C BIT P1.2
;=============================== Bit Segment ===============================
SysBits Data 20h;
Sec250F Bit 00H ;1:0.0025 s
Sec100F Bit 01H ;1:0.01
Sec10F Bit 02H ;1:0.1
SecF Bit 03h ;1:1 S
KeyGetF Bit 04H ;1:KeyGet flag
KeyPress Bit 05H ;1:Key pressing
CSave Bit 06H ;1:
RDRF Bit 07H ;1:
;---------------------------------------------------
;=============================== Byte Segment ==============================
Sec250 Data 22H
Sec10 Data 23H
Sec100 Data 24H
Second Data 25h
Sec100Hex Data 26h
KeyCode Data 27H
ASave Data 28H
AD_DataBuf DATA 30H;30H..31H ;从AD读出的16位数据暂存单元,高位36H,低位37H
DISBUF EQU 40H;40h..47h
SDisbuf EQU 48H;48H..49H
;(7219一次接收16位数据,第一字节为地址,第二字节为数据)
;---------------------------------------------------------
SPCR DATA 0d5H ; SPI control register
SPSR DATA 0aaH ; SPI status register
SPDR DATA 86H ; SPI data register
;=============================== Program Code ==============================
Org 0000H ;
AJmp Main
;--------------------------------- Ints ------------------------------------
Org 0003H ;Int0
Ajmp ReadAD
;Clr EX0
;RetI
;---------------------------------------------------------------------------
Org 000BH ;CTC0
Mov TL0,#Low(Time0)
Mov TH0,#High(Time0)
Ajmp CTC0
;---------------------------------------------------------------------------
Org 0013H ;Int1
Clr EX1
RetI
;---------------------------------------------------------------------------
Org 001BH ;CTC1
Clr ET1
RetI
;---------------------------------------------------------------------------
Org 0023H ;Serial
Clr ES
RetI
;---------------------------------------------------------------------------
; Org 002BH ;CTC2
;------------------------------------------------------------------------
ReadAD: Jb RDY_,INT1Q ;排除毛刺干扰
cpl p2.6 ;P2.5闪烁 表示进入中断
Mov CSave,C
mov ASave,A
CLR CS_
MOV A,#21H ;连读
ACALL SPI_ByteSR
;Clr p1.5 ;保证器件在连读模式时不复位(可加可不加此指令)
MOV A,#00H
ACALL SPI_ByteSR ;读出高字节数据
MOV AD_DataBuf+0,A ;高位暂存在AD_DataBuf+0中
MOV A,#00H
ACALL SPI_ByteSR ;读出低字节数据
MOV AD_DataBuf+1,A ;低位暂存在AD_DataBuf+1中
MOV A,#30H
ACALL SPI_ByteSR ;结束连读操作
SETB CS_
MOV C,CSave
MOV A,ASave
INT1Q:
RetI
;---------------------------------------------------------------------------
CTC0: Setb Sec250F ;2.5ms时间到
Djnz Sec250,CTC0Q
Mov Sec250,#CntSec250 ;4
Setb Sec100F ;10ms时间到
Inc Sec100Hex
Djnz Sec100,CTC0Q ;10
Mov Sec100,#CntSec100;
Setb Sec10F ;100ms时间到
Djnz Sec10,CTC0Q ;10
Mov Sec10,#CntSec10
Setb SecF ;1s时间到
CTC0Q: RetI
;--------------------------------- Ints ------------------------------------
InitCTC0: Mov Tmod,#00000001b
Mov TL0,#Low(Time0)
Mov TH0,#High(Time0)
SetB EA
SetB ET0
SetB TR0
InitTime: Mov Sec10,#CntSec10 ;10
Mov Sec100,#CntSec100 ;10
Mov Sec250,#CntSec250 ;4
;Mov Sec100Hex,#0
;Mov TCnt,#5
Clr Sec250F
Clr Sec100F
Clr Sec10F
SetB EX0 ;开外部中断
setB IT0 ;INT0边沿触发
Ret
;-------------------------------- Subroutines ------------------------------
InitSystem: MOV SysBits,#00000000b;最高两位未定义,从第六位开始
;5:KeyPress,4:KeyGetF,3:SecF,2:Sec10F,1:Sec100F,0:Sec250F
Ret
;---------------------------------------------------------------------------
InitSPI: setb CS_ ; deselect Slave
setb MOSI ; initialize SPI pins
setb MISO ;
setb SCK ;
mov SPCR, #01011111B
;7:interrupt disable,6:enable spi channel,5:MSB first,4:spi master
;3:clock polarity 1,2:clock phase 0,1&0:clock rate f/4(11.0592MHz/4)
ret
;---------------------------------------------------------------------------
InitDisplay: ;让数码管初始都显示“-”
MOV A,#11H
MOV DISBUF+0,A
MOV DISBUF+1,A
MOV DISBUF+2,A
MOV DISBUF+3,A
MOV DISBUF+4,A
MOV DISBUF+5,A
MOV DISBUF+6,A
MOV DISBUF+7,A
Ret
;---------------------------------------------------------------------------
Initled: clr p2.7
clr p2.6
clr p2.5
clr p2.4
ret
;---------------------------------------------------------------------------
InitCD4097:
SETB CD4097_A
;Clr CD4097_A
CLR CD4097_B
CLR CD4097_C
RET
;---------------------------------------------------------------------------
InitAD7730:
CLR CS_
MOV A,#03H ;写通讯寄存器03H 设置下一操作是写滤波寄存器
ACALL SPI_ByteSR
MOV a,#5EH ;写滤波寄存器#5e2010H 设置为CHOP模式 60hz输出速率
ACALL SPI_ByteSR
MOV A,#20H
ACALL SPI_ByteSR
MOV A,#10H
ACALL SPI_ByteSR
MOV A,#04H ;写通讯寄存器04H 设置下一操作是写DAC寄存器
ACALL SPI_ByteSR
MOV a,#00H ;写DAC滤波器#00h 设置校正DAC的加值为0mv.
ACALL SPI_ByteSR
MOV A,#02H ;写通讯寄存器02H 设置下一操作是写模式寄存器
ACALL SPI_ByteSR
MOV A,#10100000b ;写模式寄存器#0A0B0H 设置为内部满量程校正
ACALL SPI_ByteSR ;WL=1 选择16位字长度
MOV A,#10110000B
ACALL SPI_ByteSR
ACALL delay ;等待RDY脚变低 表明校正结束 P2.6亮
MOV A,#02H ;写通讯寄存器02H 设置下一操作是写模式寄存器
ACALL SPI_ByteSR
MOV A,#10000000B ;写模式寄存器#80b0H 设置为内部零刻度校正
ACALL SPI_ByteSR
MOV A,#10110000B
ACALL SPI_ByteSR
ACALL delay3 ;等待RDY脚变低 表明校正结束 p2.7亮
;器件处于空闲模式
SETB CS_
;acall ADSingleWR ;启动单次转换
acall ADSConvert ;启动连续转换
RET
;----------------------------------------------------------------------------
Delay: mov R5,#100 ;1s delay
DELAY1: MOV R6,#50
DELAY2: MOV R7,#100
wait: JNB RDY_,DELAYQ
DJNZ R7,wait
DJNZ R6,DELAY2
DJNZ R5,DELAY1
RET
DELAYQ: setb p2.6
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -