📄 voice.txt
字号:
;该程序是简单的测试程序
.include "8515def.inc"
.org $0000
rjmp reset
reset: ldi r16,low(ramend) ;堆栈指针置初值
out spl,r16
ldi r16,high(ramend)
out sph,r16
ldi r16,$00 ;设初值,"现在温度是:" ,录音时间范围约3.5s
sts $0060,r16
ldi r16,$20 ;"点" ,录音时间范围约3.5s
sts $0061,r16
ldi r16,$40 ;"摄氏度",录音时间范围约3.5s
sts $0062,r16
ldi r16,$50 ;"0",录音时间范围约1.7s,"0-9"都为1.7s
sts $0063,r16
ldi r16,$60 ;"1"
sts $0064,r16
ldi r16,$70 ;"2"
sts $0065,r16
ldi r16,$80 ;"3"
sts $0066,r16
ldi r16,$90 ;"4"
sts $0067,r16
ldi r16,$a0 ;"5"
sts $0068,r16
ldi r16,$b0 ;"6"
sts $0069,r16
ldi r16,$20 ;"7"
sts $006a,r16
ldi r16,$20 ;"8"
sts $006b,r16
ldi r16,$20 ;"9"
sts $006c,r16
ldi r16,$ff ;用来判断X指针是否已指到到这里
sts $006d,r16
;******************************初始化****************************************************************
;设置A,B,C,D口
ldi r16,$b0 ;定义B口:MOSI,MISO,SCK,SS,INT所用PB的I/O口方向,
out ddrb,r16
ldi r16,$ff ;PB0~PB3带内部上拉电阻
out portb,r16
ldi r16,$04 ;定义C口
out ddrc,r16
ldi r16,$fb
out portc,r16
ldi r16,0
out ddra,r16
ldi r16,$ff
out porta,r16
ldi r16,0
out ddrd,r16
ldi r16,$ff
out portd,r16
;设置外部中断控制方式
ldi r16,0 ;先禁止INT1和INT0中断
out gimsk,r16
ldi r16,0
out mcucr,r16 ;INT1和INT0都设为低电平中断
ldi r16,$c0
out gimsk,r16 ;开放INT1和INT0中断
;设置T/C记时器
ldi r16,0 ;设置T/C中断屏蔽寄存器TIMSK,不允许T0溢出中断
out timsk,r16
ldi r16,$05 ;1024分频
out tccr0,r16
ldi r16,0 ;清TIFR中的TOV0(T/C0溢出中断标志位)
out tifr,r16
rcall delay1
ldi r18,$3c ;设初值为60,溢出时间为0.025088s,一写入就开始计时
out tcnt0,r18
;设置SPI
ldi r16,$70 ;设置SPI控制寄存器 /
out spcr,r16
ldi r16,0
out spsr,r16
bb: ldi Xl,$60 ;指针X,Y置初值,初始化时指向SRAM中$0060
ldi Xh,$00
ee: ldi Yl,$60
ldi Yh,$00
;*********************MAIN程序入口********************************
cc: ldi r16,0 ;主程序入口,清溢出标志
out spsr,r16
clz
cbi portc,2
ld r16,X ;判断X指针
cpi r16,$ff
breq bb
ld r16,Y ;判断Y指针
cpi r16,$ff
breq ee
sbis pina,1 ;pa1=0放音,pa=1录音
rcall EXT_INT1
rcall EXT_INT0
;录音子程序
;*********************开始录音********************************
EXT_INT0:
an: in r16,pina ;等待an启动
andi r16,$08
cpi r16,0
brne an
sbi portc,2 ;开led
in r1,sreg ;保护标志寄存器
ldi r16,0 ;清溢出标志
out spsr,r16
rcall pup
rcall delay1
rcall pup
rcall delay1
rcall delay1
cbi portb,4 ;SS置低
ld r17,X+ ;设定发送录入的地址,共16位,格式为11+5
out spdr,r17 ;先发低8位,再发高8位
;地址在SRAM里,从0060开始
dd1: sbis spsr,7
rjmp dd1 ;不相等转移
ldi r16,$a0
out spdr,r16
dd2: sbis spsr,7
rjmp dd2 ;不相等转移
sbi portb,4 ;把SS拉高,关闭SPI
;*************************************************
;等待STOP信号和ISD的INT中断信号,这段时间进行录音
uu: sbis pina,2 ;判断stop信号
rjmp ue
sbis pind,2 ;判断ISD的INT信号
rjmp ue
rjmp uu
;*************************************************
;发送STOP命令
ue: cbi portb,4 ;把SS拉低,开启SPI
ldi r16,0 ;清溢出标志
out spsr,r16
ldi r16,$00 ;发送STOP命令
out spdr,r16
clz
dd5: sbis spsr,7
rjmp dd5 ;不相等转移
ldi r16,$30
out spdr,r16
dd6: sbis spsr,7
rjmp dd6
sbi portb,4 ;把SS拉高,关闭SPI
;还需要延时50ms
ldi r16,0 ;清TIFR中的TOV0
out tifr,r16
rcall delay1 ;延时约50ms,Tpause|stop
ldi r16,0 ;清TIFR中的TOV0
out tifr,r16
rcall delay1
out sreg,r1 ;恢复SREG
ret ;子程序返回
;***********************************************************
;放音子程序,从最开始开始放
;*****************开始放音*********************
EXT_INT1:
in r1,sreg ;保护标志寄存器
ldi r16,0 ;清溢出标志
out spsr,r16
cbi portb,4 ;SS置低
rcall pup
rcall delay1
ld r17,Y+ ;设放音地址,先发低8位,再发高8位
out spdr,r17
dd7: sbis spsr,7
rjmp dd7 ;不相等转移
ldi r16,$e0
out spdr,r16
dd8: sbis spsr,7
rjmp dd8 ;不相等转移
rcall delay1
sbi portb,4 ;把SS拉高,关闭SPI
;放音中,等待ISD4003的INT产生中断低电平
;*************************************************
;等待STOP信号和ISD的INT中断信号,这段时间进行放音
uu1: sbis pina,2 ;判断stop信号
rjmp ue1
sbis pind,2 ;判断ISD的INT信号
rjmp ue1
rjmp uu1
;*************************************************
ue1: cbi portb,4 ;把SS拉低,开启SPI
ldi r16,0 ;清溢出标志
out spsr,r16
ldi r16,$00 ;发送STOP命令
out spdr,r16
clz
dd10: sbis spsr,7
rjmp dd10 ;不相等转移
ldi r16,$30
out spdr,r16
dd11: sbis spsr,7
rjmp dd11
sbi portb,4 ;把SS拉高,关闭SPI
;*************************************************
;还需要延时50ms
ldi r16,0 ;清TIFR中的TOV0
out tifr,r16
rcall delay1 ;延时约50ms,Tpause|stop
ldi r16,0 ;清TIFR中的TOV0
out tifr,r16
rcall delay1
rjmp cc
ret
;***********************************************************
;***********************启动ISD4003子程序***********************************
pup: cbi portb,4 ;SS置低
ldi r16,$00 ;先送低8位,LSB先送
out spdr,r16
d0: sbis spsr,7
rjmp d0
ldi r16,$20 ;如果低8位发完,继续发高8位
out spdr,r16
d1: sbis spsr,7
rjmp d1 ;不相等转移
ldi r16,0 ;清溢出标志
out spsr,r16
sbi portb,4 ;SS置高
ret
;*********************延时程序*****************************
delay1:
ldi r26,0x82
delay2:
dec r28
brne delay2
dec r26
brne delay2
ldi r26,0x82
delay3:
dec r28
brne delay3
dec r26
brne delay3
ret
;***********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -