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

📄 测试.lst

📁 ISD1720芯片实现录音,定点录音,播放,定点播放等.
💻 LST
📖 第 1 页 / 共 5 页
字号:
  key                  --> R20
  i                    --> R22
     4D4 940E 09C2 CALL	push_xgsetF00C
FILE: E:\写的程序\AVR(C)\4X4键盘.c
(0001) /*********************************************************************
(0002)            注意在调用时要初始化DDRA=0xff;
(0003) 		   这最好是用中断扫描键盘,在中断里先保存以前DDRA的数值;
(0004) 		   扫描完后再恢复以前的DDRA的值
(0005) ***********************************************************************/
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) //#include"延时子程序.c"
(0009) #define  uchar unsigned char
(0010) #define  uint  unsigned int
(0011) 
(0012) uchar key_scan()
(0013) { 
(0014)   uchar i=0X7F,key,j=0;
     4D6 E76F      LDI	R22,0x7F
     4D7 24AA      CLR	R10
(0015)   delay_ms(1);
     4D8 E001      LDI	R16,1
     4D9 E010      LDI	R17,0
     4DA DEB5      RCALL	_delay_ms
(0016)  do
(0017)  { 
(0018)    i=(i<<1|i>>7);
     4DB 2E26      MOV	R2,R22
     4DC 9426      LSR	R2
     4DD 9426      LSR	R2
     4DE 9426      LSR	R2
     4DF 9426      LSR	R2
     4E0 9426      LSR	R2
     4E1 9426      LSR	R2
     4E2 9426      LSR	R2
     4E3 2E36      MOV	R3,R22
     4E4 0C33      LSL	R3
     4E5 2832      OR	R3,R2
     4E6 2D63      MOV	R22,R3
(0019)    PORTD=i;
     4E7 BA32      OUT	0x12,R3
(0020)    DDRD=0x0F;
     4E8 E08F      LDI	R24,0xF
     4E9 BB81      OUT	0x11,R24
(0021)    key=PIND;
     4EA B340      IN	R20,0x10
(0022)    j=key&0xF0;
     4EB 2F84      MOV	R24,R20
     4EC 7F80      ANDI	R24,0xF0
     4ED 2EA8      MOV	R10,R24
(0023)    }while(j==0xF0);
     4EE 2D8A      MOV	R24,R10
     4EF 3F80      CPI	R24,0xF0
     4F0 F351      BEQ	0x04DB
(0024)    switch(key)
     4F1 2F64      MOV	R22,R20
     4F2 2777      CLR	R23
     4F3 3B67      CPI	R22,0xB7
     4F4 E0E0      LDI	R30,0
     4F5 077E      CPC	R23,R30
     4F6 F409      BNE	0x04F8
     4F7 C05C      RJMP	0x0554
     4F8 3B6B      CPI	R22,0xBB
     4F9 E0E0      LDI	R30,0
     4FA 077E      CPC	R23,R30
     4FB F409      BNE	0x04FD
     4FC C055      RJMP	0x0552
     4FD 3B6D      CPI	R22,0xBD
     4FE E0E0      LDI	R30,0
     4FF 077E      CPC	R23,R30
     500 F409      BNE	0x0502
     501 C04E      RJMP	0x0550
     502 3B6E      CPI	R22,0xBE
     503 E0E0      LDI	R30,0
     504 077E      CPC	R23,R30
     505 F409      BNE	0x0507
     506 C047      RJMP	0x054E
     507 EB8E      LDI	R24,0xBE
     508 E090      LDI	R25,0
     509 1786      CP	R24,R22
     50A 0797      CPC	R25,R23
     50B F094      BLT	0x051E
     50C 3767      CPI	R22,0x77
     50D E0E0      LDI	R30,0
     50E 077E      CPC	R23,R30
     50F F409      BNE	0x0511
     510 C03B      RJMP	0x054C
     511 376B      CPI	R22,0x7B
     512 E0E0      LDI	R30,0
     513 077E      CPC	R23,R30
     514 F1A9      BEQ	0x054A
     515 376D      CPI	R22,0x7D
     516 E0E0      LDI	R30,0
     517 077E      CPC	R23,R30
     518 F179      BEQ	0x0548
     519 376E      CPI	R22,0x7E
     51A E0E0      LDI	R30,0
     51B 077E      CPC	R23,R30
     51C F149      BEQ	0x0546
     51D C048      RJMP	0x0566
     51E 3D67      CPI	R22,0xD7
     51F E0E0      LDI	R30,0
     520 077E      CPC	R23,R30
     521 F409      BNE	0x0523
     522 C039      RJMP	0x055C
     523 3D6B      CPI	R22,0xDB
     524 E0E0      LDI	R30,0
     525 077E      CPC	R23,R30
     526 F409      BNE	0x0528
     527 C032      RJMP	0x055A
     528 3D6D      CPI	R22,0xDD
     529 E0E0      LDI	R30,0
     52A 077E      CPC	R23,R30
     52B F161      BEQ	0x0558
     52C 3D6E      CPI	R22,0xDE
     52D E0E0      LDI	R30,0
     52E 077E      CPC	R23,R30
     52F F131      BEQ	0x0556
     530 3D67      CPI	R22,0xD7
     531 E0E0      LDI	R30,0
     532 077E      CPC	R23,R30
     533 F40C      BGE	0x0535
     534 C031      RJMP	0x0566
     535 3E67      CPI	R22,0xE7
     536 E0E0      LDI	R30,0
     537 077E      CPC	R23,R30
     538 F159      BEQ	0x0564
     539 3E6B      CPI	R22,0xEB
     53A E0E0      LDI	R30,0
     53B 077E      CPC	R23,R30
     53C F129      BEQ	0x0562
     53D 3E6D      CPI	R22,0xED
     53E E0E0      LDI	R30,0
     53F 077E      CPC	R23,R30
     540 F0F9      BEQ	0x0560
     541 3E6E      CPI	R22,0xEE
     542 E0E0      LDI	R30,0
     543 077E      CPC	R23,R30
     544 F0C9      BEQ	0x055E
     545 C020      RJMP	0x0566
(0025)  { case 0x7E:key=0;break;//0
     546 2744      CLR	R20
     547 C01F      RJMP	0x0567
(0026)    case 0x7D:key=10;break;//.
     548 E04A      LDI	R20,0xA
     549 C01D      RJMP	0x0567
(0027)    case 0x7B:key=11;break;//*
     54A E04B      LDI	R20,0xB
     54B C01B      RJMP	0x0567
(0028)    case 0x77:key=15;break;//=
     54C E04F      LDI	R20,0xF
     54D C019      RJMP	0x0567
(0029)    case 0xBE:key=1;break;//1
     54E E041      LDI	R20,1
     54F C017      RJMP	0x0567
(0030)    case 0xBD:key=2;break;//2
     550 E042      LDI	R20,2
     551 C015      RJMP	0x0567
(0031)    case 0xBB:key=3;break;//3
     552 E043      LDI	R20,3
     553 C013      RJMP	0x0567
(0032)    case 0xB7:key=14;break;//-
     554 E04E      LDI	R20,0xE
     555 C011      RJMP	0x0567
(0033)    case 0xDE:key=4;break;//4
     556 E044      LDI	R20,4
     557 C00F      RJMP	0x0567
(0034)    case 0xDD:key=5;break;//5
     558 E045      LDI	R20,5
     559 C00D      RJMP	0x0567
(0035)    case 0xDB:key=6;break;//6
     55A E046      LDI	R20,6
     55B C00B      RJMP	0x0567
(0036)    case 0xD7:key=13;break;//+
     55C E04D      LDI	R20,0xD
     55D C009      RJMP	0x0567
(0037)    case 0xEE:key=7;break;//7
     55E E047      LDI	R20,7
     55F C007      RJMP	0x0567
(0038)    case 0xED:key=8;break;//8
     560 E048      LDI	R20,0x8
     561 C005      RJMP	0x0567
(0039)    case 0xEB:key=9;break;//9
     562 E049      LDI	R20,0x9
     563 C003      RJMP	0x0567
(0040)    case 0xE7:key=12;break;//C
     564 E04C      LDI	R20,0xC
     565 C001      RJMP	0x0567
(0041)    default:key=16;
     566 E140      LDI	R20,0x10
(0042)    }
(0043)     return key;}
     567 2F04      MOV	R16,R20
     568 940C 09C9 JMP	pop_xgsetF00C
_key_press:
  j                    --> R20
  i                    --> R20
     56A 934A      ST	R20,-Y
(0044) 
(0045) uchar key_press()
(0046) {   uchar i,j;
(0047)     DDRD=0XFF;
     56B EF8F      LDI	R24,0xFF
     56C BB81      OUT	0x11,R24
(0048)     PORTD=0XF0;
     56D EF80      LDI	R24,0xF0
     56E BB82      OUT	0x12,R24
(0049) 	DDRD=0X0F;
     56F E08F      LDI	R24,0xF
     570 BB81      OUT	0x11,R24
(0050) 	delay_ms(1);
     571 E001      LDI	R16,1
     572 E010      LDI	R17,0
     573 DE1C      RCALL	_delay_ms
(0051) 	i=PIND;
     574 B340      IN	R20,0x10
(0052) 	if(i==0xF0) j = 0;
     575 3F40      CPI	R20,0xF0
     576 F411      BNE	0x0579
     577 2744      CLR	R20
     578 C001      RJMP	0x057A
(0053) 	else j = 1;
     579 E041      LDI	R20,1
(0054) 	return j;
     57A 2F04      MOV	R16,R20
     57B 9149      LD	R20,Y+
     57C 9508      RET
FILE: E:\写的程序\AVR(C)\测试.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "12864显示.c"
(0004) #include"4X4键盘.c"
(0005) //#include "延时子程序.c"
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) /*****************************************************
(0009) /             要播放或要录音的开始与结果地址
(0010) **********************************************************/
(0011) uchar data_zi[]={"录音播放第0123456789段擦除"};
(0012) uchar data_ziju[]={"录音第01段"}; 
(0013) uint caToneAdd[]={0x0010,0x0013,0x0014,0x0017,0x0018,0x001b,0x001c,0x001f,
(0014)                         0x0020,0x0023,0x0024,0x0027,0x0028,0x002b,0x002c,0x002f,
(0015) 						0x0030,0x0033,0x0034,0x0037,0x0038,0x003b,0x003c,0x003f,
(0016) 						0x0040,0x0043};     
(0017) 
(0018) #define  PU                     0x11   //POWER UP 01
(0019) #define  STOP                   0x12  //停止   02
(0020) #define  RESET                  0x13  //复位  03
(0021) #define  CLI_INT                0x14  //清除中断和EOM位  04 
(0022) #define  RD_STATUS              0x15  //读取状态寄存器,当前地址 05
(0023) #define  RD_PLAY_PTR            0x16  //读取状态寄存器,当前地址和播放指针 06
(0024) #define  PD                     0x17  //POWER DOWN 07
(0025) #define  RD_REC_PTR             0x18  //读取状态寄存器,当前地址和录音指针 08
(0026) #define  RD_DEVID               0x19  //读取器件ID 09
(0027) #define  PLAY                   0x50  //播放
(0028) #define  REC                    0x51  //录音
(0029) #define  FWD                    0x58  //下一曲
(0030) #define  ERASE                  0X52  //擦除当前曲目
(0031) #define  G_ERASE                0x53  //擦除全部曲目除了提示音 43
(0032) #define  RD_APC                 0x54  //读取状态寄存器,当前地址和APC寄存器 44
(0033) #define  WR_APC1                0x55  //将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
(0034) #define  WR_APC2                0x75  //将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
(0035) #define  WR_NVCFG               0x56  //将APC的内容写到NVCFG中 46
(0036) #define  CHK_MEM                0x59   //检查环形存储结构 49
(0037) #define  SET_PLAY               0x90  //从<S10:S0>开始播放,直到<E10:E0>或EOM 80
(0038) #define  SET_REC                0x91   //从<S10:S0>开始录音,直到<E10:E0> 81
(0039) #define  SET_ERASE              0x92  //擦除<S10:S0>到<E10:E0>的内容 82
(0040) 
(0041) #define SS_1 PORTB|=(1<<PB4)  //停止SPI
(0042) 
(0043) uchar  SR0_L; //SR0的低位 
(0044) uchar  SR0_H;  //SR0的高位
(0045) uchar  SR1;  //SR1寄存器
(0046) uchar ID,APCL=0,APCH=0;//ID和APC寄存器
(0047) /**************************************************************************  
(0048) *    函数原型: ISD_SendData(unsigned int Data)  
(0049) *    功    能: SPI发送数据  
(0050) **************************************************************************/  
(0051) void spi_sent_init(void)
(0052) { PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7); 	
_spi_sent_init:
     57D B388      IN	R24,0x18
     57E 6F80      ORI	R24,0xF0
     57F BB88      OUT	0x18,R24
(0053)   DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4);       //设置MOSI,SCK和SS为输出 
     580 B387      IN	R24,0x17
     581 6B80      ORI	R24,0xB0
     582 BB87      OUT	0x17,R24
(0054)   SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
     583 E783      LDI	R24,0x73
     584 B98D      OUT	0x0D,R24
(0055)   SPSR = 0x00;              //预分频为128
     585 2422      CLR	R2
     586 B82E      OUT	0x0E,R2
     587 9508      RET
_ISD_SendData:
  sign                 --> R10
  Data                 --> R16
     588 92AA      ST	R10,-Y
(0056) }
(0057) 
(0058) unsigned char ISD_SendData(unsigned int Data)
(0059) { 
(0060)   unsigned char sign;
(0061)   PORTB &=~ (1<<PB4);            //强制接收方进入从模式
     589 98C4      CBI	0x18,4
(0062)   SPCR |= (1<<MSTR);             // MSTR有时会被清零,这里强制进入主机模式
     58A 9A6C      SBI	0x0D,4
(0063)   SPDR = Data;              //启动数据传输 
     58B B90F      OUT	0x0F,R16
(0064)   while(!(SPSR&(1<<SPIF)));      //等待传输结束 
     58C 9B77      SBIS	0x0E,7
     58D CFFE      RJMP	0x058C
(0065)   sign=SPSR;
     58E B0AE      IN	R10,0x0E
(0066)   sign=SPDR;
     58F B0AF      IN	R10,0x0F
(0067)   //PORTB |= (1<<PB4);
(0068)   return sign;            
     590 2D0A      MOV	R16,R10
     591 90A9      LD	R10,Y+
     592 9508      RET
(0069) }
(0070) /**************************************************************************  
(0071) *    函数原型: void GetToneAdd(uchar cNum, Uint  ipStartAdd, Uint  ipEndAdd);  
(0072) *    功    能: 取出当前语音的首末地址  
(0073) **************************************************************************/  
(0074)   
(0075) void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd){  
(0076) 
(0077)         *ipStartAdd=caToneAdd[cNum*2];  
_GetToneAdd:
  ipEndAdd             --> Y,+0
  ipStartAdd           --> R18
  cNum                 --> R16
     593 EA80      LDI	R24,0xA0
     594 E090      LDI	R25,0
     595 2FE0      MOV	R30,R16
     596 27FF      CLR	R31
     597 0FEE      LSL	R30
     598 1FFF      ROL	R31
     599 0FEE      LSL	R30
     59A 1FFF      ROL	R31
     59B 0FE8      ADD	R30,R24
     59C 1FF9      ADC	R31,R25
     59D 8020      LDD	R2,Z+0
     59E 8031      LDD	R3,Z+1
     59F 01F9      MOVW	R30,R18
     5A0 8231      STD	Z+1,R3
     5A1 8220      STD	Z+0,R2
(0078)         *ipEndAdd=caToneAdd[cNum*2+1];  
     5A2 2FE0      MOV	R30,R16
     5A3 27FF      CLR	R31
     5A4 0FEE      LSL	R30
     5A5 1FFF      ROL	R31

⌨️ 快捷键说明

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