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

📄 ad7730 spi serial convert.asm

📁 AD7730,SPI接口的连续转换程序,转换速率可自己设定
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;===========================================================================
;                       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 + -