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

📄 isd1700_spi.lst

📁 ISD1700语音芯片放音的ISP实现
💻 LST
📖 第 1 页 / 共 2 页
字号:
     151 E980      LDI	R24,0x90
     152 B98F      OUT	0x0F,R24
(0162)     while (!(SPSR &(1 << SPIF)))
     153 9B77      SBIS	0x0E,7
     154 CFFE      RJMP	0x0153
(0163)         ;
(0164)     SPDR = 0x00;					//data
     155 2422      CLR	R2
     156 B82F      OUT	0x0F,R2
(0165)     while (!(SPSR &(1 << SPIF)))
     157 9B77      SBIS	0x0E,7
     158 CFFE      RJMP	0x0157
(0166)         ;
(0167) 	SPDR = (unsigned char)startAdd;	//start add,LSB
     159 B90F      OUT	0x0F,R16
(0168)     while (!(SPSR &(1 << SPIF)))
     15A 9B77      SBIS	0x0E,7
     15B CFFE      RJMP	0x015A
(0169)         ;
(0170) 	SPDR = (unsigned char)(startAdd>>8);	//start add,MSB
     15C 0118      MOVW	R2,R16
     15D 2C23      MOV	R2,R3
     15E 2433      CLR	R3
     15F B82F      OUT	0x0F,R2
(0171)     while (!(SPSR &(1 << SPIF)))
     160 9B77      SBIS	0x0E,7
     161 CFFE      RJMP	0x0160
(0172)         ;
(0173) 	SPDR = 0x00;					//end add
     162 2422      CLR	R2
     163 B82F      OUT	0x0F,R2
(0174)     while (!(SPSR &(1 << SPIF)))
     164 9B77      SBIS	0x0E,7
     165 CFFE      RJMP	0x0164
(0175)         ;
(0176)     SPDR = 0x00;					//end add
     166 2422      CLR	R2
     167 B82F      OUT	0x0F,R2
(0177)     while (!(SPSR &(1 << SPIF)))
     168 9B77      SBIS	0x0E,7
     169 CFFE      RJMP	0x0168
(0178)         ;
(0179)     SPDR = 0x00;					//end add
     16A 2422      CLR	R2
     16B B82F      OUT	0x0F,R2
(0180)     while (!(SPSR &(1 << SPIF)))
     16C 9B77      SBIS	0x0E,7
     16D CFFE      RJMP	0x016C
(0181)         ;
(0182) 	for(i=0;i<100;i++)
     16E 2744      CLR	R20
     16F 2755      CLR	R21
     170 5F4F      SUBI	R20,0xFF
     171 4F5F      SBCI	R21,0xFF
     172 3644      CPI	R20,0x64
     173 E0E0      LDI	R30,0
     174 075E      CPC	R21,R30
     175 F3D4      BLT	0x0170
(0183)     	;
(0184)     PORTB |= (1<<PB0);	//SS=1
     176 9AC0      SBI	0x18,0
     177 9159      LD	R21,Y+
     178 9149      LD	R20,Y+
     179 9508      RET
(0185) }
(0186) 
(0187) //主函数
(0188) void main(void)
(0189) {
(0190)     static unsigned char secondcount=0;
(0191)     unsigned char soundFlag=0;
_main:
  soundFlag            --> R20
  t                    --> R22
     17A 2744      CLR	R20
(0192)     
(0193)     unsigned int t;
(0194)     
(0195)     init_devices(); //全局初始化
     17B DF0F      RCALL	_init_devices
(0196)     RUN2_OFF();
     17C 98C6      CBI	0x18,6
(0197)     
(0198)     iProgRunCount=GetTime();
     17D 940E 0231 CALL	_GetTime
     17F 9310 0101 STS	iProgRunCount+1,R17
     181 9300 0100 STS	iProgRunCount,R16
     183 C00E      RJMP	0x0192
(0199)     while(1)
(0200)     {
(0201)     	WDR();
     184 95A8      WDR
(0202)     	t=GetPassTime(iProgRunCount);
     185 9100 0100 LDS	R16,iProgRunCount
     187 9110 0101 LDS	R17,iProgRunCount+1
     189 940E 023D CALL	_GetPassTime
     18B 01B8      MOVW	R22,R16
(0203) 		if(t>=100)
     18C 3604      CPI	R16,0x64
     18D E0E0      LDI	R30,0
     18E 071E      CPC	R17,R30
     18F F010      BCS	0x0192
(0204) 		{
(0205) 			isd1700_init();
     190 DF15      RCALL	_isd1700_init
(0206) 			break;
     191 C001      RJMP	0x0193
     192 CFF1      RJMP	0x0184
(0207) 		}
(0208)     }
(0209)     
(0210)     Read_APC();
     193 DF5E      RCALL	_Read_APC
(0211) 
(0212) 	Sound_SetFlay(0x10);
     194 E100      LDI	R16,0x10
     195 E010      LDI	R17,0
     196 DFAF      RCALL	_Sound_SetFlay
(0213) 	soundTime=GetTime();
     197 940E 0231 CALL	_GetTime
     199 0158      MOVW	R10,R16
     19A 92B0 0103 STS	soundTime+1,R11
     19C 92A0 0102 STS	soundTime,R10
     19E C028      RJMP	0x01C7
(0214)     while (1)
(0215)     {
(0216)         WDR(); //内部watchdog
     19F 95A8      WDR
(0217) 		if(GetPassTime(soundTime)>=1000)
     1A0 9100 0102 LDS	R16,soundTime
     1A2 9110 0103 LDS	R17,soundTime+1
     1A4 940E 023D CALL	_GetPassTime
     1A6 01B8      MOVW	R22,R16
     1A7 3E08      CPI	R16,0xE8
     1A8 E0E3      LDI	R30,3
     1A9 071E      CPC	R17,R30
     1AA F0B0      BCS	0x01C1
(0218)         {
(0219)         	soundTime=GetTime();
     1AB 940E 0231 CALL	_GetTime
     1AD 0158      MOVW	R10,R16
     1AE 92B0 0103 STS	soundTime+1,R11
     1B0 92A0 0102 STS	soundTime,R10
(0220)         	secondcount++;
     1B2 9180 0104 LDS	R24,main.c:secondcount
     1B4 5F8F      SUBI	R24,0xFF
     1B5 9380 0104 STS	main.c:secondcount,R24
(0221)         	if(secondcount>=20)
     1B7 3184      CPI	R24,0x14
     1B8 F020      BCS	0x01BD
(0222)         	{
(0223)         		secondcount=0;
     1B9 2422      CLR	R2
     1BA 9220 0104 STS	main.c:secondcount,R2
(0224)         		soundFlag=1;
     1BC E041      LDI	R20,1
(0225)         	}
(0226)         	RUN1();
     1BD E280      LDI	R24,0x20
     1BE B228      IN	R2,0x18
     1BF 2628      EOR	R2,R24
     1C0 BA28      OUT	0x18,R2
(0227)         }
(0228)         
(0229)         if(soundFlag)
     1C1 2344      TST	R20
     1C2 F021      BEQ	0x01C7
(0230)         {
(0231)         	soundFlag=0;
     1C3 2744      CLR	R20
(0232)         	//Sound_Flay();
(0233)         	Sound_SetFlay(0x10);
     1C4 E100      LDI	R16,0x10
     1C5 E010      LDI	R17,0
     1C6 DF7F      RCALL	_Sound_SetFlay
     1C7 CFD7      RJMP	0x019F
     1C8 9508      RET
FILE: E:\AVR\ISD1700_ISP\src\timer.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #include "main.h"
(0004) 
(0005) unsigned char WdtTimer = 0; //外部看门狗定时器
(0006) volatile unsigned int Timer1BaseClk = 0; //Timer1基准时钟
(0007) 
(0008) // 看门狗初始化函数
(0009) // prescale: 512K cycles,overtime 417ms
(0010) void watchdog_init(void)
(0011) {
(0012)     WDR(); //this prevents a timout on enabling
_watchdog_init:
     1C9 95A8      WDR
(0013)     WDTCR = 0x18;	//WDCE、WDE位置1,再改变超时时间
     1CA E188      LDI	R24,0x18
     1CB BD81      OUT	0x21,R24
(0014)     WDTCR = 0x0D; 	//WATCHDOG ENABLED - dont forget to issue WDRs
     1CC E08D      LDI	R24,0xD
     1CD BD81      OUT	0x21,R24
     1CE 9508      RET
(0015) }
(0016) 
(0017) //TIMER1 initialize - prescale:8
(0018) // WGM: 0) Normal, TOP=0xFFFF
(0019) // desired value: 2000Hz
(0020) // actual value: 2000.000Hz (0.0%)
(0021) void timer1_init(void)
(0022) {
(0023)     TCCR1B = 0x00; //stop
_timer1_init:
     1CF 2422      CLR	R2
     1D0 BC2E      OUT	0x2E,R2
(0024)     TCNT1H = 0xFC; //setup
     1D1 EF8C      LDI	R24,0xFC
     1D2 BD8D      OUT	0x2D,R24
(0025)     TCNT1L = 0x18;
     1D3 E188      LDI	R24,0x18
     1D4 BD8C      OUT	0x2C,R24
(0026)     OCR1AH = 0x03;
     1D5 E083      LDI	R24,3
     1D6 BD8B      OUT	0x2B,R24
(0027)     OCR1AL = 0xE8;
     1D7 EE88      LDI	R24,0xE8
     1D8 BD8A      OUT	0x2A,R24
(0028)     OCR1BH = 0x03;
     1D9 E083      LDI	R24,3
     1DA BD89      OUT	0x29,R24
(0029)     OCR1BL = 0xE8;
     1DB EE88      LDI	R24,0xE8
     1DC BD88      OUT	0x28,R24
(0030)     OCR1CH = 0x03;
     1DD E083      LDI	R24,3
     1DE 9380 0079 STS	0x0079,R24
(0031)     OCR1CL = 0xE8;
     1E0 EE88      LDI	R24,0xE8
     1E1 9380 0078 STS	0x0078,R24
(0032)     ICR1H = 0x03;
     1E3 E083      LDI	R24,3
     1E4 BD87      OUT	0x27,R24
(0033)     ICR1L = 0xE8;
     1E5 EE88      LDI	R24,0xE8
     1E6 BD86      OUT	0x26,R24
(0034)     TCCR1A = 0x00;
     1E7 BC2F      OUT	0x2F,R2
(0035)     TCCR1B = 0x02; //start Timer
     1E8 E082      LDI	R24,2
     1E9 BD8E      OUT	0x2E,R24
     1EA 9508      RET
_timer1_ovf_isr:
     1EB 922A      ST	R2,-Y
     1EC 923A      ST	R3,-Y
     1ED 924A      ST	R4,-Y
     1EE 925A      ST	R5,-Y
     1EF 938A      ST	R24,-Y
     1F0 939A      ST	R25,-Y
     1F1 93AA      ST	R26,-Y
     1F2 93BA      ST	R27,-Y
     1F3 B62F      IN	R2,0x3F
     1F4 922A      ST	R2,-Y
(0036) }
(0037) 
(0038) //-------------------------------------------------------------------------
(0039) 
(0040) #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0041) void timer1_ovf_isr(void)
(0042) {
(0043)     //TIMER1 has overflowed
(0044)     static unsigned char timer1int = 0;
(0045) 
(0046)     TCNT1H = 0xFC; //reload counter high value
     1F5 EF8C      LDI	R24,0xFC
     1F6 BD8D      OUT	0x2D,R24
(0047)     TCNT1L = 0x18; //reload counter low value
     1F7 E188      LDI	R24,0x18
     1F8 BD8C      OUT	0x2C,R24
(0048) 
(0049)     timer1int++;
     1F9 9180 0108 LDS	R24,timer.c:timer1int
     1FB 5F8F      SUBI	R24,0xFF
     1FC 9380 0108 STS	timer.c:timer1int,R24
(0050)     if (timer1int >= 2)
     1FE 3082      CPI	R24,2
     1FF F130      BCS	0x0226
(0051)     {
(0052)         //1ms
(0053)         timer1int = 0;
     200 2422      CLR	R2
     201 9220 0108 STS	timer.c:timer1int,R2
(0054)         Timer1BaseClk++;
     203 9180 0106 LDS	R24,Timer1BaseClk
     205 9190 0107 LDS	R25,Timer1BaseClk+1
     207 9601      ADIW	R24,1
     208 9390 0107 STS	Timer1BaseClk+1,R25
     20A 9380 0106 STS	Timer1BaseClk,R24
(0055)         if (Timer1BaseClk >= 60000)
     20C E680      LDI	R24,0x60
     20D EE9A      LDI	R25,0xEA
     20E E0A0      LDI	R26,0
     20F E0B0      LDI	R27,0
     210 9020 0106 LDS	R2,Timer1BaseClk
     212 9030 0107 LDS	R3,Timer1BaseClk+1
     214 2444      CLR	R4
     215 2455      CLR	R5
     216 1628      CP	R2,R24
     217 0639      CPC	R3,R25
     218 064A      CPC	R4,R26
     219 065B      CPC	R5,R27
     21A F034      BLT	0x0221
(0056)         {
(0057)             Timer1BaseClk = 0;
     21B 2422      CLR	R2
     21C 2433      CLR	R3
     21D 9230 0107 STS	Timer1BaseClk+1,R3
     21F 9220 0106 STS	Timer1BaseClk,R2
(0058)         }
(0059) 
(0060)         WdtTimer++;
     221 9180 0105 LDS	R24,WdtTimer
     223 5F8F      SUBI	R24,0xFF
     224 9380 0105 STS	WdtTimer,R24
(0061) 		}
     226 9029      LD	R2,Y+
     227 BE2F      OUT	0x3F,R2
     228 91B9      LD	R27,Y+
     229 91A9      LD	R26,Y+
     22A 9199      LD	R25,Y+
     22B 9189      LD	R24,Y+
     22C 9059      LD	R5,Y+
     22D 9049      LD	R4,Y+
     22E 9039      LD	R3,Y+
     22F 9029      LD	R2,Y+
     230 9518      RETI
(0062) }
(0063) 
(0064) unsigned int GetTime(void)
(0065) {
(0066) 	unsigned int iTime1,iTime2;
(0067) 	do{
(0068) 		iTime1 = Timer1BaseClk;
_GetTime:
  iTime1               --> R18
  iTime2               --> R16
     231 9120 0106 LDS	R18,Timer1BaseClk
     233 9130 0107 LDS	R19,Timer1BaseClk+1
(0069) 		iTime2 = Timer1BaseClk;
     235 9100 0106 LDS	R16,Timer1BaseClk
     237 9110 0107 LDS	R17,Timer1BaseClk+1
(0070) 	}while(iTime2 != iTime1);
     239 1702      CP	R16,R18
     23A 0713      CPC	R17,R19
     23B F7A9      BNE	0x0231
(0071) 	return iTime2;
     23C 9508      RET
_GetPassTime:
  temp_i               --> R10
  iCurTime             --> R10
  iPreTime             --> R12
     23D 940E 025D CALL	push_xgsetF03C
     23F 0168      MOVW	R12,R16
(0072) }
(0073) //-------------------------------------------------------------------------
(0074) 
(0075) unsigned int GetPassTime(unsigned int iPreTime)
(0076) {
(0077)     unsigned int temp_i = 0;
(0078) 		unsigned int iCurTime = GetTime();
     240 DFF0      RCALL	_GetTime
     241 0158      MOVW	R10,R16
(0079) 
(0080)     if (iCurTime >= iPreTime)
     242 150C      CP	R16,R12
     243 051D      CPC	R17,R13
     244 F018      BCS	0x0248
(0081)     {
(0082)         return (iCurTime - iPreTime);
     245 190C      SUB	R16,R12
     246 091D      SBC	R17,R13
     247 C013      RJMP	0x025B
(0083)     }
(0084)     else
(0085)     {
(0086)         return (60000 - iPreTime + iCurTime);
FILE: <library>
     248 0116      MOVW	R2,R12
     249 2444      CLR	R4
     24A 2455      CLR	R5
     24B E640      LDI	R20,0x60
     24C EE5A      LDI	R21,0xEA
     24D E060      LDI	R22,0
     24E E070      LDI	R23,0
     24F 1942      SUB	R20,R2
     250 0953      SBC	R21,R3
     251 0964      SBC	R22,R4
     252 0975      SBC	R23,R5
     253 0115      MOVW	R2,R10
     254 2444      CLR	R4
     255 2455      CLR	R5
     256 0D42      ADD	R20,R2
     257 1D53      ADC	R21,R3
     258 1D64      ADC	R22,R4
     259 1D75      ADC	R23,R5
     25A 018A      MOVW	R16,R20
     25B 940C 0266 JMP	pop_xgsetF03C
push_xgsetF03C:
     25D 937A      ST	R23,-Y
     25E 936A      ST	R22,-Y
     25F 935A      ST	R21,-Y
     260 934A      ST	R20,-Y
     261 92DA      ST	R13,-Y
     262 92CA      ST	R12,-Y
     263 92BA      ST	R11,-Y
     264 92AA      ST	R10,-Y
     265 9508      RET
pop_xgsetF03C:
     266 90A9      LD	R10,Y+
     267 90B9      LD	R11,Y+
     268 90C9      LD	R12,Y+
     269 90D9      LD	R13,Y+
     26A 9149      LD	R20,Y+
     26B 9159      LD	R21,Y+
     26C 9169      LD	R22,Y+
     26D 9179      LD	R23,Y+
     26E 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -