📄 isd1700汇编程序.txt
字号:
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
MOV 21H,#08H
MOV 22H,#04H
AJMP GOON
MICREC:MOV 21H,#40H
MOV 22H,#04H
GOON: ACALL WR_APC
ACALL WAITRDY ; 等待 RDY 置 1
ACALL CLRINT ; 清除中断
ACALL WAITRDY
ACALL CHK_MEM ; 检查芯片环状存储结构
JB PR,REC ;PR=1 录音
AJMP PLAY ;PR=0 放音
REC: MOV 36H,#10
ACALL YS50 ; 延时录音
DJNZ 36H,REC1
REC1: 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 ; 检查 SR0 寄存器 REC 位,如果没有启动 REC 则重新发送命令
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:
MOV 20H,#50H ; 发送放音指令
MOV 21H,#00H
MOV A,20H
ACALL SPIO
MOV A,21H
ACALL SPIO
SETB SS
ACALL CHECKSR ; 扫描 SR 寄存器
JB ACC.0,REPLAY ; 如果指令没有接收,则重新发送
CLR LED
PLAY1: JNB STOP,REC6
ACALL CHECKRDY ; 等待放音结束(检查 RDY 是否置 1 )
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
LJMP 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
;*****************************
; 89c 51 模拟 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:
CALL YS50
DJNZ R2,LEDELAY1
RET
;**** 10mS 延时 ****
YS10: MOV TMOD,#01H ;
MOV TH0,#0D8H ;10mS 延时初值置入
MOV TL0,# 0F 0H ;(65536-X)*1=10MS
SETB TR0 ;65536-(10000/1)=D 8F 0H
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 + -