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

📄 project.lst

📁 AVRkaifashili.rar
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0127 E5CF      LDI	R28,0x5F
    0128 E0D2      LDI	R29,2
    0129 BFCD      OUT	0x3D,R28
    012A BFDE      OUT	0x3E,R29
    012B 51C0      SUBI	R28,0x10
    012C 40D0      SBCI	R29,0
    012D EA0A      LDI	R16,0xAA
    012E 8308      STD	Y+0,R16
    012F 2400      CLR	R0
    0130 E6EB      LDI	R30,0x6B
    0131 E0F0      LDI	R31,0
    0132 E010      LDI	R17,0
    0133 3BE4      CPI	R30,0xB4
    0134 07F1      CPC	R31,R17
    0135 F011      BEQ	0x0138
    0136 9201      ST	R0,Z+
    0137 CFFB      RJMP	0x0133
    0138 8300      STD	Z+0,R16
    0139 E4E2      LDI	R30,0x42
    013A E0F2      LDI	R31,2
    013B E6A0      LDI	R26,0x60
    013C E0B0      LDI	R27,0
    013D E012      LDI	R17,2
    013E 34ED      CPI	R30,0x4D
    013F 07F1      CPC	R31,R17
    0140 F021      BEQ	0x0145
    0141 95C8      LPM
    0142 9631      ADIW	R30,1
    0143 920D      ST	R0,X+
    0144 CFF9      RJMP	0x013E
    0145 DDE7      RCALL	_main
_exit:
    0146 CFFF      RJMP	_exit
FILE: H:\Project\Project\project.c
(0001) //***************************FileName:Project.c**********************//
(0002) //***************************ICCAVR6.30编译**************************//
(0003) #include <io8535v.h>	     //AT90S8535寄存器定义;
(0004) #include <macros.h>	         //AT90S8535宏定义;
(0005) #include "zimo.h"            //点阵LED字模
(0006) #define uchar unsigned char  //数据类型定义
(0007) #define uint unsigned int    //数据类型定义
(0008) 
(0009) uchar Key_Value;		     //按键键值;
(0010) uchar State_Flag;		     //站点标志;
(0011) uchar Ack_Flag;		         //确认标志;
(0012) uchar Pre_Flag;		         //预报标志;
(0013) uchar Move_Flag;		     //滚动标志;
(0014) uchar Spec_Flag;		     //特殊信息标志;
(0015) uchar EOM_Flag=1;	         //信息结束标志;
(0016) uchar Pst_Flag;		         //上、下行标志;
(0017) uchar State=1;			     //站数;
(0018) uchar Spec;			         //特殊信息数;
(0019) uchar Speed=20;		         //文字滚动速度;
(0020) uchar Word_Number;	         //显示字数;
(0021) 
(0022) //语音芯片第1~16段分别保存16站的站名信息
(0023) //第17段保存报站信息“到了,请要下车的乘客依次从后门下车”
(0024) //第18、19段分别保存预报信息“前方到站”、“请要下车的乘客做好下车准备”
(0025) //第20段保存欢迎信息及公交车线路说明
(0026) //第21、22段保存特殊提示信息
(0027) uchar Snd_Info[]={0,17};			   //报站声音信息
(0028) uchar Snd_Pre_Info[]={18,0,19};		   //预报声音信息
(0029) uchar Snd_Spec[]={21,22};			   //特殊声音信息
(0030) uchar Snd_Welc=20;				       //欢迎声音信息
(0031) 
(0032) //本例公交车语音报站系统包含16站
(0033) //所有的站名都以“第n站”代替,其中n为当前站数,n<16
(0034) //报站时显示屏滚动显示“第n站到了”
(0035) //预报站时显示屏显示“前方到站第n站”
(0036) //其中“第n站”字模存放在二维数组State n[3][32]中
(0037) //“到了”字模存放在二维数组DL[2][32]中
(0038) //“前方到站”字模存放在二维数组QFDZ[4][32]中
(0039) uchar text[32];				           //当前显示文字
(0040) uchar next[32];			               //下一个显示文字
(0041) 
(0042) #pragma interrupt_handler Key_Scan:2   //定义按键中断INT0的中断服务程序
(0043) #pragma interrupt_handler Receive_EOM:3//定义语音中断INT1的中断服务程序
(0044) 
(0045) //****************************延时程序*******************************//
(0046) void delay(int t)
(0047) {while(t--) ;}
_delay:
  t                    --> R16
    0147 2E20      MOV	R2,R16
    0148 2E31      MOV	R3,R17
    0149 5001      SUBI	R16,1
    014A 4010      SBCI	R17,0
    014B 2022      TST	R2
    014C F7D1      BNE	0x0147
    014D 2033      TST	R3
    014E F7C1      BNE	0x0147
    014F 9508      RET
(0048) 
(0049) //****************************语音芯片驱动程序***********************//
(0050) void Set_CE(uchar level)               //定义ISD2560使能线为PA^4
(0051) {if(level==1) PORTA |=0x10;           
_Set_CE:
  level                --> R16
    0150 3001      CPI	R16,1
    0151 F411      BNE	0x0154
    0152 9ADC      SBI	0x1B,4
    0153 C003      RJMP	0x0157
(0052)  else         PORTA &=0xef;
    0154 B38B      IN	R24,0x1B
    0155 7E8F      ANDI	R24,0xEF
    0156 BB8B      OUT	0x1B,R24
(0053) }
    0157 9508      RET
(0054) 
(0055) void Set_PD(uchar level)               //定义ISD2560的PD线为PA^3      
(0056) {if(level)    PORTA |=0x08;
_Set_PD:
  level                --> R16
    0158 2300      TST	R16
    0159 F011      BEQ	0x015C
    015A 9ADB      SBI	0x1B,3
    015B C003      RJMP	0x015F
(0057)  else         PORTA &=0xf7;
    015C B38B      IN	R24,0x1B
    015D 7F87      ANDI	R24,0xF7
    015E BB8B      OUT	0x1B,R24
(0058) }
    015F 9508      RET
(0059) 
(0060) void Set_PR(uchar level)               //定义ISD2560的PR线为PA^2
(0061) {if(level)    PORTA |=0x04;
_Set_PR:
  level                --> R16
    0160 2300      TST	R16
    0161 F011      BEQ	0x0164
    0162 9ADA      SBI	0x1B,2
    0163 C003      RJMP	0x0167
(0062)  else         PORTA &=0xfb;
    0164 B38B      IN	R24,0x1B
    0165 7F8B      ANDI	R24,0xFB
    0166 BB8B      OUT	0x1B,R24
(0063) }
    0167 9508      RET
(0064) 
(0065) void Set_A6(uchar level)               //定义ISD2560的A6/8/9线为PA^1
(0066) {if(level)    PORTA |=0x02;
_Set_A6:
  level                --> R16
    0168 2300      TST	R16
    0169 F011      BEQ	0x016C
    016A 9AD9      SBI	0x1B,1
    016B C003      RJMP	0x016F
(0067)  else         PORTA &=0xfd;
    016C B38B      IN	R24,0x1B
    016D 7F8D      ANDI	R24,0xFD
    016E BB8B      OUT	0x1B,R24
(0068) }
    016F 9508      RET
(0069) 
(0070) void Set_A0(uchar level)               //定义ISD2560的A6/8/9线为PA^1
(0071) {if(level)    PORTA |=0x01;
_Set_A0:
  level                --> R16
    0170 2300      TST	R16
    0171 F011      BEQ	0x0174
    0172 9AD8      SBI	0x1B,0
    0173 C003      RJMP	0x0177
(0072)  else         PORTA &=0xfe;
    0174 B38B      IN	R24,0x1B
    0175 7F8E      ANDI	R24,0xFE
    0176 BB8B      OUT	0x1B,R24
(0073) }
    0177 9508      RET
_Seek_Segment:
  s                    --> R20
    0178 DDD7      RCALL	push_gset1
    0179 2F40      MOV	R20,R16
(0074) 
(0075) //****************************语音搜索和播放程序****************************//
(0076) void Seek_Segment(uchar s)             //语音搜索程序
(0077) {Set_PD(1);				               //语音芯片复位
    017A E001      LDI	R16,1
    017B DFDC      RCALL	_Set_PD
(0078)  delay(20000);
    017C E200      LDI	R16,0x20
    017D E41E      LDI	R17,0x4E
    017E DFC8      RCALL	_delay
(0079)  Set_PD(0);
    017F 2700      CLR	R16
    0180 DFD7      RCALL	_Set_PD
(0080)  Set_PR(1);				               //放音模式
    0181 E001      LDI	R16,1
    0182 DFDD      RCALL	_Set_PR
(0081)  Set_A0(1);	 			               //M0模式
    0183 E001      LDI	R16,1
    0184 DFEB      RCALL	_Set_A0
    0185 C00C      RJMP	0x0192
(0082)  while(s--)				               //快进s段
(0083)  {Set_CE(0);
    0186 2700      CLR	R16
    0187 DFC8      RCALL	_Set_CE
(0084)   Set_CE(1);
    0188 E001      LDI	R16,1
    0189 DFC6      RCALL	_Set_CE
(0085)   do NOP();
    018A 0000      NOP
(0086)   while(EOM_Flag);		               //检测EOM标志位,为0时有效
    018B 90200060  LDS	R2,0x60
    018D 2022      TST	R2
    018E F7D9      BNE	0x018A
(0087)   EOM_Flag=1;}
    018F E081      LDI	R24,1
    0190 93800060  STS	0x60,R24
    0192 2E24      MOV	R2,R20
    0193 2433      CLR	R3
    0194 5041      SUBI	R20,1
    0195 2022      TST	R2
    0196 F779      BNE	0x0186
(0088)  Set_A0(0);	 			               //M6模式
    0197 2700      CLR	R16
    0198 DFD7      RCALL	_Set_A0
(0089) }
    0199 DDB9      RCALL	pop_gset1
    019A 9508      RET
(0090) 
(0091) void Play(void)                        //语音播放程序
(0092) {Set_CE(0);				               //CE线低电平触发芯片的放音操作
_Play:
    019B 2700      CLR	R16
    019C DFB3      RCALL	_Set_CE
(0093)  Set_CE(1);
    019D E001      LDI	R16,1
    019E DFB1      RCALL	_Set_CE
(0094)  do  NOP();
    019F 0000      NOP
(0095)  while(EOM_Flag);		               //检测EOM标志位,为0时有效
    01A0 90200060  LDS	R2,0x60
    01A2 2022      TST	R2
    01A3 F7D9      BNE	0x019F
(0096)  EOM_Flag=1;			               //重新赋EOM标志位为1
    01A4 E081      LDI	R24,1
    01A5 93800060  STS	0x60,R24
(0097) }
    01A7 9508      RET
_Inform:
  i                    --> R20
  m                    --> R20
    01A8 DDA7      RCALL	push_gset1
    01A9 2F40      MOV	R20,R16
(0098) 
(0099) //****************************语音报站程序****************************//
(0100) void Inform(uchar m)                   //报站
(0101) {uchar i;
(0102)  if(Pst_Flag) Snd_Info[0]=m;           //若为上行方向,顺序报站
    01AA 902000AD  LDS	R2,_Pst_Flag
    01AC 2022      TST	R2
    01AD F019      BEQ	0x01B1
    01AE 93400063  STS	0x63,R20
    01B0 C004      RJMP	0x01B5
(0103)  else		  Snd_Info[0]=17-m;	       //若为下行方向,逆序报站
    01B1 E181      LDI	R24,0x11
    01B2 1B84      SUB	R24,R20
    01B3 93800063  STS	0x63,R24
(0104)  Set_PD(1);				               //语音芯片复位
    01B5 E001      LDI	R16,1
    01B6 DFA1      RCALL	_Set_PD
(0105)  delay(20000);
    01B7 E200      LDI	R16,0x20
    01B8 E41E      LDI	R17,0x4E
    01B9 DF8D      RCALL	_delay
(0106)  Set_PD(0); 
    01BA 2700      CLR	R16
    01BB DF9C      RCALL	_Set_PD
(0107)  for(i=0;i<2;i++)
    01BC 2744      CLR	R20
    01BD C00A      RJMP	0x01C8
(0108)  {Seek_Segment(Snd_Info[i]);	       //搜索相应语音信息段
    01BE E683      LDI	R24,0x63
    01BF E090      LDI	R25,0
    01C0 2FE4      MOV	R30,R20
    01C1 27FF      CLR	R31
    01C2 0FE8      ADD	R30,R24
    01C3 1FF9      ADC	R31,R25
    01C4 8100      LDD	R16,Z+0
    01C5 DFB2      RCALL	_Seek_Segment
(0109)   Play();}						       //播放
    01C6 DFD4      RCALL	_Play
    01C7 9543      INC	R20
    01C8 3042      CPI	R20,2
    01C9 F3A0      BCS	0x01BE
(0110) }
    01CA DD88      RCALL	pop_gset1
    01CB 9508      RET
_Pre_Inform:
  i                    --> R20
  m                    --> R20
    01CC DD83      RCALL	push_gset1
    01CD 2F40      MOV	R20,R16
(0111) 
(0112) void Pre_Inform(uchar m)               //报站 
(0113) {uchar i;
(0114)  if(Pst_Flag) Snd_Pre_Info[1]=m;       //若为上行方向,顺序预报站
    01CE 902000AD  LDS	R2,_Pst_Flag
    01D0 2022      TST	R2
    01D1 F019      BEQ	0x01D5
    01D2 93400066  STS	0x66,R20
    01D4 C004      RJMP	0x01D9
(0115)  else		  Snd_Pre_Info[1]=17-m;	   //逆序预报站
    01D5 E181      LDI	R24,0x11
    01D6 1B84      SUB	R24,R20
    01D7 93800066  STS	0x66,R24
(0116)  Set_PD(1);				               //语音芯片复位
    01D9 E001      LDI	R16,1
    01DA DF7D      RCALL	_Set_PD
(0117)  delay(20000);
    01DB E200      LDI	R16,0x20
    01DC E41E      LDI	R17,0x4E
    01DD DF69      RCALL	_delay
(0118)  Set_PD(0); 
    01DE 2700      CLR	R16
    01DF DF78      RCALL	_Set_PD
(0119)  for(i=0;i<3;i++)
    01E0 2744      CLR	R20
    01E1 C00A      RJMP	0x01EC
(0120)  {Seek_Segment(Snd_Pre_Info[i]);	   //搜索相应语音信息段
    01E2 E685      LDI	R24,0x65
    01E3 E090      LDI	R25,0
    01E4 2FE4      MOV	R30,R20
    01E5 27FF      CLR	R31
    01E6 0FE8      ADD	R30,R24
    01E7 1FF9      ADC	R31,R25
    01E8 8100      LDD	R16,Z+0
    01E9 DF8E      RCALL	_Seek_Segment
(0121)   Play();}							   //播放
    01EA DFB0      RCALL	_Play
    01EB 9543      INC	R20
    01EC 3043      CPI	R20,3
    01ED F3A0      BCS	0x01E2
(0122) }
    01EE DD64      RCALL	pop_gset1
    01EF 9508      RET
_Special:
  m                    --> R20
    01F0 DD5F      RCALL	push_gset1
    01F1 2F40      MOV	R20,R16
(0123) 
(0124) void Special(uchar m)                  //播放特殊信息
(0125) {Set_PD(1);				               //语音芯片复位
    01F2 E001      LDI	R16,1
    01F3 DF64      RCALL	_Set_PD
(0126)  delay(20000);
    01F4 E200      LDI	R16,0x20
    01F5 E41E      LDI	R17,0x4E
    01F6 DF50      RCALL	_delay
(0127)  Set_PD(0);
    01F7 2700      CLR	R16
    01F8 DF5F      RCALL	_Set_PD
(0128)  Seek_Segment(Snd_Spec[m]);		       //搜索相应语音信息段
    01F9 E688      LDI	R24,0x68
    01FA E090      LDI	R25,0
    01FB 2FE4      MOV	R30,R20
    01FC 27FF      CLR	R31
    01FD 0FE8      ADD	R30,R24
    01FE 1FF9      ADC	R31,R25
    01FF 8100      LDD	R16,Z+0
    0200 DF77      RCALL	_Seek_Segment
(0129)  Play();							   //播放
    0201 DF99      RCALL	_Play
(0130) }
    0202 DD50      RCALL	pop_gset1
    0203 9508      RET
(0131) 
(0132) void Welcome()                         //欢迎信息
(0133) {Set_PD(1);				               //语音芯片复位
_Welcome:
    0204 E001      LDI	R16,1
    0205 DF52      RCALL	_Set_PD

⌨️ 快捷键说明

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