www.pudn.com > ISD4003progarm.rar > test.asm


SS     EQU   P2.6            ;片选 
 
SCLK   EQU   P2.7            ;ISD4003时钟 
 
MOSI   EQU   P2.5            ;数据输入 
 
MISO   EQU   P2.4            ;数据输出 
 
LED    EQU   P1.3            ;指示灯 
 
INT    EQU   INT0            ;中断 
 
AN     EQU   P1.0            ;执行 
 
STOP   EQU   P1.1            ;复位 
 
PR     EQU   P1.2            ;PR=1录音  PR=0放音 
 
;初始化 
 
       ORG   0000H           ; 
 
       AJMP  MAIN            ; 
 
MAIN:  MOV   SP,#10H         ; 
 
       MOV   P1,#0FFH        ; 
 
       MOV   P2,#0FFH        ; 
 
       MOV   P3,#0FFH        ; 
 
       MOV   P0,#0FFH        ; 
 
       CLR   EA              ; 
 
MAII:  SETB  LED             ;关指示灯 
 
       ACALL DSTOP           ;ISD掉电 
 
MAS0:  MOV   3AH,#200        ; 
 
MAS1:  JB    AN,MAS0         ;等按AN键 
 
       DJNZ  3AH,MAS1        ; 
 
       ACALL UP              ;ISD上电 
 
       MOV   20H,#00H        ;ISD低位地址 
 
       MOV   21H,#00H        ;ISD高位地址 
 
       JB    PR,REC          ;PR=1 录音 
 
       AJMP  PLAY            ;PR=0 放音 
 
;SETREC  16位 
 
;从指定地址录音  10100  
 
REC:   MOV   A,20H           ;发地址 A7-A0 
 
       ACALL ISDX            ; 
 
       MOV   A,21H           ;发地址 A9-A8 
 
       SETB  ACC.7           ; 
 
       CLR   ACC.6           ; 
 
       SETB  ACC.5           ; 
 
       CLR   ACC.4           ; 
 
       CLR   ACC.3           ; 
 
 
       ACALL ISDX            ; 
 
       SETB  SS              ;关片选 
 
;REC   8位 
 
;从当前地址录音  10110  
 
REC1:  MOV   36H,#10         ; 
 
REC2:  ACALL YS50            ;延时录音 
 
       DJNZ  36H,REC2        ; 
 
       CLR   LED             ;开指示灯 
 
       MOV   A,#0B0H         ;发 1011 0XXX 
 
       ACALL ISDX            ; 
 
       SETB  SS              ;关片选 
 
REC3:  MOV   35H,#200        ; 
 
REC4:  JNB   INT,REC7        ;OVF=0芯片溢出 
 
       JNB   AN,REC3         ; 
 
       DJNZ  35H,REC4        ; 
 
       SETB  LED             ;关指示灯 
 
       ACALL STOPP           ;停止当前操作 
 
REC5:  JNB   STOP,REC6       ;中断RESET 
 
       JB    AN,REC5         ;等待AN=0 
 
       ACALL STOPP           ;停止当前操作 
 
       AJMP  REC1            ; 
 
REC6:  CLR   SCLK            ;时钟SCLK=0 
 
       SETB  SS              ;关片选 
 
       ACALL STOPP           ;停止当前操作 
 
       AJMP  MAII            ; 
 
REC7:  SETB  LED             ;关指示灯 
 
       MOV   36H,#15         ; 
 
REC8:  ACALL YS50            ;延时录音 
 
       JB    AN,REC6         ;等待AN=1 
 
       DJNZ  36H,REC8        ; 
 
       CLR   LED             ; 
 
       MOV   36H,#15         ; 
 
REC9:  ACALL YS50            ;延时录音 
 
       JB    AN,REC6         ;等待AN=1 
 
       DJNZ  36H,REC9        ; 
 
       AJMP  REC7            ; 
 
;SETPLAY  16位 
 
;从指定地址放音  11100  
 
PLAY:  JNB   AN,PLAY         ;等待AN=1 
 
       MOV   A,20H           ;发地址 A7-A0 
 
       ACALL ISDX            ; 
 
       MOV   A,21H           ;发地址 A9-A8 
 
       SETB  ACC.7           ; 
 
       SETB  ACC.6           ; 
 
       SETB  ACC.5           ; 
 
       CLR   ACC.4           ; 
 
       CLR   ACC.3           ; 
 
       ACALL ISDX            ; 
 
       SETB  SS              ;关片选 
 
;PLAY   8位 
 
;从当前地址放音  11110  
 
PLAY1: CLR   LED             ;LED开指示灯 
 
       MOV   A,#0F0H         ;发 11110 XXXXXXXX 
 
       ACALL ISDX            ;发 << SETPLAY >> 
 
       SETB  SS              ;关片选 
 
PLAY2: JNB   STOP,REC6       ;STOP=0停止放音 
 
       JB    INT,PLAY2       ;无OVF EOM继续放音 
 
       SETB  LED             ;关指示灯 
 
       ACALL STOPP           ;停止当前操作 
 
;检测OVF 
 
       CLR   SS              ;开片选 
 
       CLR   SCLK            ;时钟SCLK=0 
 
       SETB  SCLK            ;时钟SCLK=1 
 
       JB    MISO,REC6       ;芯片到未 
 
       CLR   SCLK            ;时钟SCLK=0 
 
       SETB  SS              ;关片选 
 
       ACALL STOPP           ;停止当前操作 
 
PLAY3: JNB   STOP,REC6       ;中断放音 
 
       JB    AN,PLAY3        ;等待AN=0 
 
       AJMP  PLAY1           ;顺序放音 
 
;ISD上电 << POWERUP >> 
 
UP:    MOV   A,#20H          ;发00100 XXXXXXXXXXX 
 
       ACALL ISDX            ; 
 
       SETB  SS              ;关片选 
 
       ACALL YS50            ;50mS延时 
 
       ACALL YS50            ;50mS延时 
 
       RET                   ; 
 
;停止当前操作<< STOP >>  8位 
 
STOPP: MOV   A,#30H          ;发 0X11 0XXX 
 
       ACALL ISDX            ; 
 
       SETB  SS              ;关片选 
 
       ACALL YS50            ;50mS延时 
 
       ACALL YS50            ;50mS延时 
 
       RET                   ; 
 
;停止当前操作掉电<< STOPPWRDN >>   8位 
 
DSTOP: MOV   A,#10H          ;发0X010 XXXXXXXXXX 
 
       ACALL ISDX            ; 
 
       SETB  SS              ;关片选 
 
       ACALL YS50            ;50mS延时 
 
       ACALL YS50            ;50mS延时 
 
       RET                   ; 
 
;ISD3300,4003 SPI写入程序 8位 数据在A 
 
ISDX:  CLR   SS              ;开片选 
 
       MOV   R6,#8           ; 
 
       CLR   SCLK            ;时钟SCLK=0 
 
ISD1:  MOV   C,ACC.0         ; 
 
       MOV   MOSI,C          ;数据写 MOSI 
 
       SETB  SCLK            ;时钟SCLK=1 
 
       RR    A               ; 
 
       CLR   SCLK            ;时钟SCLK=0 
 
       DJNZ  R6,ISD1         ; 
 
       RET                   ; 
 
;**** 10mS延时  **** 
 
YS1:   MOV   TMOD,#01H       ; 
 
       MOV   TH0,#0D8H       ;10mS延时初值置入 
 
       MOV   TL0,#0F0H       ;(65536-X)*1=10MS 
 
       SETB  TR0             ;65536-(10000/1)=D8F0H 
 
       JNB   TF0,$           ; 
 
       CLR   TF0             ; 
 
       CLR   TR0             ; 
 
       RET                   ; 
 
;**** 50mS延时  **** 
 
YS50:  MOV   TMOD,#01H       ; 
 
       MOV   TH0,#6BH        ;50mS延时初值置入 
 
       MOV   TL0,#90H       ;(65536-X)*1=50MS 
 
       SETB  TR0             ;65536-(50000/1) 
 
       JNB   TF0,$           ; 
 
       CLR   TF0             ; 
 
       CLR   TR0             ; 
 
   RET                   ; 
 
   END                   ;