📄 isd1720.asm
字号:
SS EQU P1.0 ;片选
SCLK EQU P1.1 ;ISD1730时钟
MOSI EQU P1.2 ;数据输入
MISO EQU P1.3 ;数据输出
LED EQU P1.7 ;指示灯
AN EQU P1.6 ;执行
STOP EQU P1.5 ;复位
PR EQU P1.4 ;PR=1录音 PR=0放音
MORA EQU P2.7
;***************************************************
;20H-25H 为SPI命令字的1-6位存储单元
;***************************************************
ORG 0000H ;
AJMP MAIN ;
MAIN: MOV SP,#70H ;
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV P3,#0FFH ;
MOV P0,#0FFH ;
CLR EA ;
MAII: ACALL REST
ACALL DSTOP ;ISD掉电
SETB LED ;关指示灯
MAS0: MOV 3AH,#200
JNB STOP,REC6 ;
MAS1: JB AN,MAS0 ;等按AN键
DJNZ 3AH,MAS1 ;
PU: ACALL UP ;ISD上电
JB MORA,MICREC ;如果mic录音,apc=0440h。如果anain,apc=0480h
MOV 21H,#08H
MOV 22H,#04H
AJMP GOON
MICREC:MOV 21H,#40H
MOV 22H,#04H
GOON: ACALL WR_APC ;写apc
ACALL WAITRDY ;等待rdy=1
ACALL CLRINT ;清除中断
ACALL WAITRDY ;等待rdy=1
ACALL CHK_MEM ;环状存储检查
JB PR,REC ;PR=1 录音
AJMP PLAY ;PR=0 放音
REC: MOV 36H,#10
REC1: ACALL YS50 ;延时录音
DJNZ 36H,REC1
REC2: MOV 20H,#51H ;发送REC命令
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS ;关片选
ACALL CHECKRDY
JNB ACC.3,REC1
CLR LED ;开 LED灯
REC3: MOV 35H,#200
REC4: ACALL CHECKFULL
JNB AN,REC3
DJNZ 35H,REC4
SETB LED
ACALL CLRINT
ACALL STOPP
REC5: JNB STOP,REC6
JB AN,REC5
ACALL STOPP
ACALL CLRINT
ACALL WAITRDY
ACALL CHK_MEM
AJMP REC
REC6: MOV R1,#60H
TOERASE:
JB STOP,TOPD
ACALL YS50
DJNZ R1,TOERASE
ACALL G_ERASE
MOV R1,#03H
LEDWAIT:
CLR LED
ACALL LEDELAY
SETB LED
ACALL LEDELAY
DJNZ R1,LEDWAIT
TOPD: ACALL STOPP
ACALL CLRINT
AJMP MAII
REC7: SETB LED
MOV 36H,#10
REC8: ACALL YS50
JB AN,REC6
DJNZ 36H,REC8
CLR LED
MOV 36H,#10
REC9: ACALL YS50
JB AN,REC6
DJNZ 36H,REC9
AJMP REC7
PLAY: JNB AN,PLAY
REPLAY: ;放音play,也可以用set_play放音
MOV 20H,#40H
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
ACALL CHECKSR
JB ACC.0,REPLAY
CLR LED
PLAY1: JNB STOP,REC6
ACALL CHECKRDY
JNB ACC.0,PLAY1
SETB LED
ACALL STOPP
PLAY2: JNB STOP,REC6
JB AN,PLAY2
ACALL FWD
ACALL CHECKRDY
ACALL CHK_MEM
AJMP PLAY
;扫描ISD1700状态寄存器SR1
CHECKRDY:
MOV 20H,#05H
MOV 21H,#00H
MOV 22H,#00H
CHECKRDY1:
ACALL RDSTATUS
MOV A,20H
ACALL SPIO
MOV 26H,a
MOV A,21H
ACALL SPIO
MOV 27H,A
MOV A,22H
ACALL SPIO
MOV 28h,A
RET
;扫描ISD1700状态寄存器SR0
CHECKSR:
MOV 20H,#05H
acall rdstatus
MOV A,20H
ACALL SPIO
MOV 26H,a
RET
;等待ISD1700状态寄存器SR1.0位(RDY) 置1
WAITRDY:
ACALL CHECKRDY
JNB ACC.0,WAITRDY
RET
;检测ISD1700状态寄存器SR0.1位(FULL),是否为1
CHECKFULL:
ACALL RDSTATUS
MOV A,20H
ACALL SPIO
JNB ACC.1,CHECKFULL2
Acall REC7
CHECKFULL2:
RET
;清楚中断标志INT指令<< CLR_INT >>
CLRINT:
MOV 20H,#04H
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET ;
;ISD1700上电 << POWERUP >>
UP: MOV 20H,#01H
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET
;停止当前操作<< STOP >>
STOPP: MOV 20H,#02H
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET
;检测环行内存指令<< CHK_MEM >>
CHK_MEM:
MOV 20h,#49H
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
RET
;快进指令<<FWD>>
FWD :MOV 20h,#48H
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
RET
;停止当前操作掉电<< PD >>
DSTOP: MOV 20H,#07H
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
RET
;写入APC寄存器指令<< WR_APC2 >> ,写入内容放置在21H,22H里
WR_APC:
MOV 20h,#65H
MOV A,20h
ACALL SPIO
MOV A,21h
ACALL SPIO
MOV A,22H
ACALL SPIO
SETB SS
RET
;读取SR状态寄存器指令<< RD_STATUS >>
RDSTATUS:
MOV 20h,#05H
MOV 21h,#00H
MOV 22H,#00H
MOV A,20h
ACALL SPIO
MOV A,21h
ACALL SPIO
MOV A,22H
ACALL SPIO
SETB SS
RET
G_ERASE:
MOV 20H,#43H ;
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO ;
SETB SS ;关片选
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET
;复位指令<< RESET >>
REST: MOV 20H,#03H
MOV 21h,#00H
MOV A,20h
ACALL SPIO
MOV A,21h
ACALL SPIO
SETB SS
RET
;*****************************
;89c51模拟SPI口 发送和接收子程序
;*****************************
SPIO: SETB SCLK
CLR SS
MOV R6,#08
SPIO1: CLR SCLK
NOP
NOP
MOV C,MISO
RRC A
MOV MOSI,C
SETB SCLK
DJNZ R6,SPIO1
CLR MOSI
RET
;LED延迟
LEDELAY: MOV R2,#08H
LEDELAY1:
ACALL YS50
DJNZ R2,LEDELAY1
RET
;**** 10mS延时 ****
YS10: 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,#3CH ;50mS延时初值置入
MOV TL0,#0B0H ;(65536-X)*1=50MS
SETB TR0 ;65536-(50000/1)
JNB TF0,$ ;
CLR TF0 ;
CLR TR0 ;
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -