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

📄 pproject.s

📁 AVRkaifashili.rar
💻 S
📖 第 1 页 / 共 5 页
字号:
;  DDRA |=0x40;		//设置SDA为输出线
	sbi 0x1a,6
	.dbline 199
;  return(Read_Data);   //返回读出的字节
	mov R16,R22
	.dbline -2
L28:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r Read_Data 22 c
	.dbend
	.dbfunc e Write_1byte _Write_1byte fV
;           Data -> R20
;        Address -> R22
;          Slave -> R10
	.even
_Write_1byte::
	rcall push_gset3
	mov R22,R18
	mov R10,R16
	ldd R20,y+6
	.dbline -1
	.dbline 204
; }
; 
; //写一字节数据
; void Write_1byte(uchar Slave,uchar Address,uchar Data)
; {
	.dbline 205
;  Start();		//开始
	rcall _Start
	.dbline 206
;  Write_Byte(Slave);		//写I2C器件地址
	mov R16,R10
	rcall _Write_Byte
L36:
	.dbline 208
;  do
;  {
	.dbline 209
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 210
;  }
L37:
	.dbline 211
;  while(Ack_Flag==1);
	lds R24,_Ack_Flag
	cpi R24,1
	breq L36
	.dbline 212
;  Write_Byte(Address);   //送寄存器地址
	mov R16,R22
	rcall _Write_Byte
L39:
	.dbline 214
;  do
;  { 
	.dbline 215
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 216
;  }
L40:
	.dbline 217
;  while(Ack_Flag==1);
	lds R24,_Ack_Flag
	cpi R24,1
	breq L39
	.dbline 218
;  Write_Byte(Data);		//写入一字节数据
	mov R16,R20
	rcall _Write_Byte
L42:
	.dbline 220
;  do
;  {
	.dbline 221
;   Check_Ack();           //检查应答位
	rcall _Check_Ack
	.dbline 222
;  }
L43:
	.dbline 223
;  while(Ack_Flag==1);
	lds R24,_Ack_Flag
	cpi R24,1
	breq L42
	.dbline 224
;  Stop();                  //停止
	rcall _Stop
	.dbline -2
	.dbline 225
; }
L35:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r Data 20 c
	.dbsym r Address 22 c
	.dbsym r Slave 10 c
	.dbend
	.dbfunc e Write_2byte _Write_2byte fV
;          Data1 -> R20
;          Data0 -> R22
;        Address -> R10
;          Slave -> R12
	.even
_Write_2byte::
	rcall push_gset4
	mov R10,R18
	mov R12,R16
	ldd R22,y+8
	ldd R20,y+10
	.dbline -1
	.dbline 229
; 
; //写两字节数据
; void Write_2byte(uchar Slave,uchar Address,uchar Data0,uchar Data1)
; {
	.dbline 230
;  Start();		//开始
	rcall _Start
	.dbline 231
;  Write_Byte(Slave);		//写I2C器件地址
	mov R16,R12
	rcall _Write_Byte
L46:
	.dbline 233
;  do
;  {
	.dbline 234
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 235
;  }
L47:
	.dbline 236
;  while(Ack_Flag==1);//while(F0==1);
	lds R24,_Ack_Flag
	cpi R24,1
	breq L46
	.dbline 237
;  Write_Byte(Address);   //送寄存器地址
	mov R16,R10
	rcall _Write_Byte
L49:
	.dbline 239
;  do
;  { 
	.dbline 240
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 241
;  }
L50:
	.dbline 242
;  while(Ack_Flag==1);
	lds R24,_Ack_Flag
	cpi R24,1
	breq L49
	.dbline 243
;  Write_Byte(Data0);
	mov R16,R22
	rcall _Write_Byte
L52:
	.dbline 245
;  do
;  {
	.dbline 246
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 247
;  }
L53:
	.dbline 248
;  while(Ack_Flag==1);
	lds R24,_Ack_Flag
	cpi R24,1
	breq L52
	.dbline 249
;  Write_Byte(Data1);
	mov R16,R20
	rcall _Write_Byte
L55:
	.dbline 251
;  do
;  {
	.dbline 252
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 253
;  }
L56:
	.dbline 254
;  while(Ack_Flag==1);
	lds R24,_Ack_Flag
	cpi R24,1
	breq L55
	.dbline 255
;  Stop();		//停止信号
	rcall _Stop
	.dbline -2
	.dbline 256
; }
L45:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r Data1 20 c
	.dbsym r Data0 22 c
	.dbsym r Address 10 c
	.dbsym r Slave 12 c
	.dbend
	.dbfunc e Read_1byte _Read_1byte fc
;              x -> <dead>
;          data0 -> R22
;        Address -> R10
;          Slave -> R20
	.even
_Read_1byte::
	rcall push_gset3
	mov R10,R18
	mov R20,R16
	.dbline -1
	.dbline 260
; 
; //读一字节数据
; uchar Read_1byte(uchar Slave,uchar Address)
; {
L59:
	.dbline 263
;  uchar data0,x;
;  do
;  {
	.dbline 264
;   Start();		//开始信号
	rcall _Start
	.dbline 265
;   Write_Byte(Slave);		//写I2C器件地址
	mov R16,R20
	rcall _Write_Byte
	.dbline 266
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 267
;  }
L60:
	.dbline 268
;  while(Ack_Flag);//while(F0==1);
	lds R2,_Ack_Flag
	tst R2
	brne L59
L62:
	.dbline 270
;  do
;  {
	.dbline 271
;   Write_Byte(Address);		//写寄存器地址
	mov R16,R10
	rcall _Write_Byte
	.dbline 272
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 273
;  }
L63:
	.dbline 274
;  while(Ack_Flag);// while(F0==1);
	lds R2,_Ack_Flag
	tst R2
	brne L62
L65:
	.dbline 276
;  do
;  {
	.dbline 277
;   Start();		//开始
	rcall _Start
	.dbline 278
;   Write_Byte(Slave+1);		//写I2C器件地址(+1表示为读操作)
	mov R16,R20
	subi R16,255    ; addi 1
	rcall _Write_Byte
	.dbline 279
;   Check_Ack();		//检查应答位
	rcall _Check_Ack
	.dbline 280
;  }
L66:
	.dbline 281
;  while(Ack_Flag);
	lds R2,_Ack_Flag
	tst R2
	brne L65
	.dbline 282
;  data0=Read_Byte();		//读1字节
	rcall _Read_Byte
	mov R22,R16
	.dbline 283
;  Nack();		//读完发送一个Not Ack应答
	rcall _Nack
	.dbline 284
;  Stop();		//停止
	rcall _Stop
	.dbline 285
;  return data0;	//返回读取数据
	mov R16,R22
	.dbline -2
L58:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l x 1 c
	.dbsym r data0 22 c
	.dbsym r Address 10 c
	.dbsym r Slave 20 c
	.dbend
	.dbfunc e Led_Display _Led_Display fV
;             d1 -> R20
;             d0 -> R22
;         Number -> R20
	.even
_Led_Display::
	rcall push_gset2
	mov R20,R16
	sbiw R28,3
	.dbline -1
	.dbline 290
; }
; 
; //****************************数字显示程序****************************//
; void Led_Display(uchar Number)
; {
	.dbline 292
;   uchar d0,d1;
;   d0=Number/10;		//取站数的个位
	ldi R17,10
	mov R16,R20
	rcall div8u
	mov R22,R16
	.dbline 293
;   d1=Number%10;		//取站数的十位
	ldi R17,10
	mov R16,R20
	rcall mod8u
	mov R20,R16
	.dbline 294
;   Write_2byte(0x70,0x20,d1,d0);		//从显示位0开始连续显示两位
	std y+2,R22
	std y+0,R20
	ldi R18,32
	ldi R16,112
	rcall _Write_2byte
	.dbline -2
	.dbline 295
; }
L68:
	adiw R28,3
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r d1 20 c
	.dbsym r d0 22 c
	.dbsym r Number 20 c
	.dbend
	.dbfunc e Key_Act _Key_Act fV
	.even
_Key_Act::
	rcall push_gset1
	.dbline -1
	.dbline 299
; 
; //****************************键盘处理程序****************************//
; void Key_Act(void)
; {
	.dbline 300
;  GIMSK &=0x7f;			//关闭中断 
	in R24,0x3b
	andi R24,127
	out 0x3b,R24
	.dbline 301
;  switch(Key_Value)		//判断键值
	lds R20,_Key_Value
	clr R21
	cpi R20,16
	ldi R30,0
	cpc R21,R30
	brne X1
	rjmp L81
X1:
	ldi R24,16
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L86
L85:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L73
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L74
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	breq L77
	cpi R20,8
	ldi R30,0
	cpc R21,R30
	breq L78
	rjmp L70
L86:
	cpi R20,32
	ldi R30,0
	cpc R21,R30
	brne X2
	rjmp L84
X2:
	rjmp L70
X0:
	.dbline 302
;  {
L73:
	.dbline 304
;   case 1:		  			//若键值为1,则报站 
;    Inform(State);			//报第State站
	lds R16,_State
	clr R17
	rcall _Inform
	.dbline 305
;    Lattice_Display();		//显示到站信息
	rcall _Lattice_Display
	.dbline 306
;    Key_Value=0;			//重新赋键值为0
	clr R2
	sts _Key_Value,R2
	.dbline 307
;    break;
	rjmp L71
L74:
	.dbline 309
;   case 2:		  			//若键值为2,则前进一站
;    if(State<16)			//若站数<16,则
	lds R24,_State
	cpi R24,16
	brsh L75
	.dbline 310
;     State++;				//站数+1
	subi R24,255    ; addi 1
	sts _State,R24
	rjmp L76
L75:
	.dbline 312
;    else					//否则
; 	State=0;				//重新赋站数为0
	clr R2
	sts _State,R2
L76:
	.dbline 313
;    Led_Display(State);		//显示当前站数
	lds R16,_State
	rcall _Led_Display
	.dbline 314
;    Key_Value=0; 			//重新赋键值为0
	clr R2
	sts _Key_Value,R2
	.dbline 315
;    break;
	rjmp L71
L77:
	.dbline 317
;   case 4:					//若键值为4,则播放特殊信息
;    Spec++;				//特殊键按下一次,特殊段+1
	lds R24,_Spec
	subi R24,255    ; addi 1
	sts _Spec,R24
	.dbline 318
;    Special(Spec);			//报第Spec段特殊段		  	   
	mov R16,R24
	clr R17
	rcall _Special
	.dbline 319
;    Key_Value=0; 			//重新赋键值为0
	clr R2
	sts _Key_Value,R2
	.dbline 320
;    break;
	rjmp L71
L78:
	.dbline 322
;   case 8:					//若键值为8,则进行上、下行切换
;    Pst_Flag=!Pst_Flag;		//上、下行切换
	lds R2,_Pst_Flag
	tst R2
	brne L79
	ldi R20,1
	ldi R21,0
	rjmp L80
L79:
	clr R20
	clr R21
L80:
	sts _Pst_Flag,R20
	.dbline 323
;    Key_Value=0; 			//重新赋键值为0
	clr R2
	sts _Key_Value,R2
	.dbline 324
;    break;
	rjmp L71
L81:
	.dbline 326
;   case 16:				//若键值为16,则后退一站
;    if(State)				//若站数不为0,则
	lds R2,_State
	tst R2
	breq L82
	.dbline 327
; State--;				//站数-1
	mov R24,R2
	subi R24,1
	sts _State,R24
	rjmp L83
L82:
	.dbline 329
;    else					//否则
; 	State=16;				//重新赋站数为16
	ldi R24,16
	sts _State,R24
L83:
	.dbline 330
;    Led_Display(State);		//显示当前站数
	lds R16,_State
	rcall _Led_Display
	.dbline 331
;    Key_Value=0; 			//重新赋键值为0
	clr R2
	sts _Key_Value,R2
	.dbline 332
;    break;
	rjmp L71
L84:
	.dbline 334
;   case 32:				//若键值为32,则进行预报站
;   Pre_Inform(State+1);	//预报第State+1站
	lds R16,_State
	clr R17
	subi R16,255  ; offset = 1
	sbci R17,255
	rcall _Pre_Inform
	.dbline 335
;    Lattice_Display();		//显示预报站信息
	rcall _Lattice_Display
	.dbline 336
;    Key_Value=0; 			//重新赋键值为0
	clr R2
	sts _Key_Value,R2
	.dbline 337
;    break;
	rjmp L71
L70:
	.dbline 339
;   default:
;    NOP();
	nop
	.dbline 340
;  }
L71:
	.dbline 341
;  GIMSK |=0x80;	   //8535应为GIMSK
	in R24,0x3b
	ori R24,128
	out 0x3b,R24
	.dbline -2
	.dbline 342
; }
L69:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Set_CE _Set_CE fV
;          level -> R16
	.even
_Set_CE::
	.dbline -1
	.dbline 348
; 
; 
; //****************************语音芯片驱动程序****************************//
; //定义ISD2560使能线为PA^4
; void Set_CE(uchar level)
; {
	.dbline 349
;  if(level==1)
	cpi R16,1
	brne L88
	.dbline 350
;   PORTA |=0x10;
	sbi 0x1b,4
	rjmp L89
L88:
	.dbline 352
	in R24,0x1b
	andi R24,239
	out 0x1b,R24
L89:
	.dbline -2
	.dbline 353
;  else
;   PORTA &=0xef;
; }
L87:
	.dbline 0 ; func end
	ret
	.dbsym r level 16 c
	.dbend
	.dbfunc e Set_PD _Set_PD fV
;          level -> R16
	.even
_Set_PD::
	.dbline -1
	.dbline 357
; 
; //定义ISD2560的PD线为PA^3
; void Set_PD(uchar level)
; {
	.dbline 358
;  if(level)
	tst R16
	breq L91
	.dbline 359
;   PORTA |=0x08;
	sbi 0x1b,3
	rjmp L92
L91:
	.dbline 361
	in R24,0x1b
	andi R24,247
	out 0x1b,R24
L92:
	.dbline -2
	.dbline 362
;  else
;   PORTA &=0xf7;
; }
L90:
	.dbline 0 ; func end
	ret
	.dbsym r level 16 c
	.dbend
	.dbfunc e Set_PR _Set_PR fV
;          level -> R16
	.even
_Set_PR::
	.dbline -1
	.dbline 366
; 
; //定义ISD2560的PR线为PA^2
; void Set_PR(uchar level)
; {
	.dbline 367
;  if(level)
	tst R16
	breq L94
	.dbline 368
;   PORTA |=0x04;
	sbi 0x1b,2
	rjmp L95
L94:
	.dbline 370
	in R24,0x1b
	andi R24,251
	out 0x1b,R24
L95:
	.dbline -2
	.dbline 371
;  else
;   PORTA &=0xfb;
; }
L93:
	.dbline 0 ; func end
	ret
	.dbsym r level 16 c
	.dbend
	.dbfunc e Set_A6 _Set_A6 fV
;          level -> R16
	.even
_Set_A6::
	.dbline -1
	.dbline 375
; 
; //定义ISD2560的A6/8/9线为PA^1
; void Set_A6(uchar level)
; {
	.dbline 376
;  if(level)
	tst R16
	breq L97
	.dbline 377
;   PORTA |=0x02;
	sbi 0x1b,1
	rjmp L98
L97:
	.dbline 379
	in R24,0x1b
	andi R24,253
	out 0x1b,R24
L98:
	.dbline -2
	.dbline 380
;  else
;   PORTA &=0xfd;
; }
L96:
	.dbline 0 ; func end
	ret
	.dbsym r level 16 c
	.dbend
	.dbfunc e Set_A0 _Set_A0 fV
;          level -> R16
	.even
_Set_A0::
	.dbline -1
	.dbline 384
; 
; //定义ISD2560的A0线为PA^0
; void Set_A0(uchar level)
; {
	.dbline 385
;  if(level)
	tst R16
	breq L100
	.dbline 386
;   PORTA |=0x01;
	sbi 0x1b,0
	rjmp L101
L100:
	.dbline 388
	in R24,0x1b
	andi R24,254
	out 0x1b,R24
L101:
	.dbline -2
	.dbline 389
;  else
;   PORTA &=0xfe;
; }
L99:
	.dbline 0 ; func end
	ret
	.dbsym r level 16 c
	.dbend
	.dbfunc e Seek_Segment _Seek_Segment fV
;              s -> R20
	.even
_Seek_Segment::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 394
; 
; //****************************语音搜索和播放程序****************************//
; //语音搜索程序
; void Seek_Segment(uchar s)
; {
	.dbline 395
;  Set_PD(1);				//语音芯片复位
	ldi R16,1
	rcall _Set_PD
	.dbline 396
;  delay(20000);
	ldi R16,32
	rcall _delay
	.dbline 397
;  Set_PD(0);
	clr R16
	rcall _Set_PD
	.dbline 398
;  Set_PR(1);				//放音模式
	ldi R16,1
	rcall _Set_PR
	.dbline 399
;  Set_A0(1);	 			//M0模式
	ldi R16,1

⌨️ 快捷键说明

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