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

📄 p_test.s

📁 实现mega8的isp操作
💻 S
📖 第 1 页 / 共 4 页
字号:
	.module P_TEST.C
	.area lit(rom, con, rel)
_SET::
	.byte 'S,'E,'T,45,0
	.dbfile E:\AVR\P_TEST\P_TEST.C
	.dbsym e SET _SET A[5:5]kc
_CF::
	.byte 'C,'F,'M,'K,0
	.dbsym e CF _CF A[5:5]kc
	.area text(rom, con, rel)
	.dbfile E:\AVR\P_TEST\P_TEST.C
	.dbfunc e main _main fV
;              k -> <dead>
;           test -> <dead>
;              j -> <dead>
;              i -> R20,R21
	.even
_main::
	.dbline -1
	.dbline 101
; /*
; ******************************************************************************
; 			  无线数字传送程序
; 			  v1.0
; 			  write by Mr. pan
; 			  All rights reserved
; ******************************************************************************
; */
; 
; #include<iom8v.h>
; #include<macros.h>
; #include<eeprom.h>
; 
; 
; #define baud  9600
; #define fosc  3579545
; 
; //----分机编号---//
; #define CarNumber  14
; 
; //--变量声明区---//
; unsigned char Sbufx;
; unsigned char SendSbuf[20];  //中断发送用的缓冲,发送后清零
; unsigned char NowSbuf[20];
; 
; unsigned char krec,ReceiveSbuf[20];  //接收缓冲
; unsigned char *SendPoint,Send_flag; 
; unsigned char TimeForCall; 
; unsigned  int  NowSend,NowSend2,TimeForSend;
; unsigned char  ICRead;
; unsigned char  SET_flag,CFM_flag;
; //--wdg use 
; unsigned int 	TimeForWDG;
; //--TIMER0 USE
; unsigned char T0_Count; 
; //=========函数声明区=====//
; void initialM8(void);
; void putchar(unsigned char c);
; unsigned char getchar(void);
; void ReadEEPROM();
; void PTR2K_SEND();
; void PTR2K_RECEIVE();
; void WRITEEEPROM();
; //========模拟I2C 定义===//
; //SDA-->PC1  ,SCL-->PC4,  CS-->PC2 ,RST -->PC5
; //SDA-->PC1 
; #define SDAH()    (PORTC|=(1<<PC1))
; #define SDAL()    (PORTC&=0XFD)
; //  SCL-->PC4
; #define SCLH()    (PORTC|=(1<<PC4))
; #define SCLL()    (PORTC&=0XEF)
; // CS-->PC2
; #define CSL()    (PORTC&=0XFB)
; #define CSH()    (PORTC|=(1<<PC2))
; //  RST -->PC5
; #define RSTL()   (PORTC&=0XDF) 
; #define RSTH()   (PORTC|=(1<<PC5)) 
; //SDA --输入
; #define SDAIN()   (DDRC&=0XDF) 
; #define SDAOUT()   (DDRC=0XFF) 
; //========模拟I2C 函数声明===//
; void I2C_Write(unsigned char addr,unsigned char Wbyte); //1
; unsigned char  I2C_Read(unsigned char addr);  //2
; unsigned char  I2C_ReadByte();  //3
; void I2C_WriteByte(unsigned char WriteByte); //4
; void I2C_NACK();  //6
; void I2C_CACK() ; //5
; void I2C_ACK();  //7
; void I2C_Stop(); //8
; void I2C_Start(); //9
; void sdelay(unsigned char k);
; void I2C_Reset();
; 
; void IC_Num_Read();
; /*---
; void  SDAH() ;
; void  SDAL() ;
; */
; 
; 
; void I2C_CACK();
; 
; void putstr(char *s);
; void Timer2_initial();
; unsigned char kr1,kr2;
; char const SET[]={"SET-"};//格式 :SET-001-015-0   Car NO+Dirver NO+CS=0/1
; char const CF[]={"CFMK"}; //接收主机命令 
; 
; struct node 
; {
; 	   char datax;
; 	  // node *next;
;  };
;  
; /*============================================================
; 					   MAIN START
; ===========================================================           
; */
; 
; void main()
; {
	.dbline 104
;  	 unsigned int i,j;
; 	 unsigned char test, k;
;      initialM8();
	rcall _initialM8
	.dbline 106
; 
;     ReadEEPROM();
	rcall _ReadEEPROM
	.dbline 107
;  I2C_Reset();
	rcall _I2C_Reset
	.dbline 108
;  i=0;
	clr R20
	clr R21
	.dbline 110
;  //I2C_Write(0,0X40);// test use 
;  SDAIN();
	in R24,0x14
	andi R24,223
	out 0x14,R24
	.dbline 112
;  //--主机设定--//
;  DDRB=0X03;
	ldi R24,3
	out 0x17,R24
	.dbline 113
;  PORTB=0X02;
	ldi R24,2
	out 0x18,R24
	.dbline 115
;  //  I2C_Write(0,0X33);
;     sdelay(250);
	ldi R16,250
	rcall _sdelay
	.dbline 116
; 	ICRead=0;
	clr R2
	sts _ICRead,R2
	.dbline 117
; 	 T0_Count=0;
	sts _T0_Count,R2
L2:
	.dbline 118
L3:
	.dbline 118
; 	 while(T0_Count<50);
	lds R24,_T0_Count
	cpi R24,50
	brlo L2
	.dbline 122
; 	//NowSend=1000;
; 	
; 	//ADD WDG看,门狗
; 	TimeForWDG=0;
	clr R2
	clr R3
	sts _TimeForWDG+1,R3
	sts _TimeForWDG,R2
	.dbline 123
; 	WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1);//1024K脉冲数目
	ldi R24,14
	out 0x21,R24
	.dbline 124
; 		WDR(); ///看门狗清零																																								
	wdr
	rjmp L6
L5:
	.dbline 128
; 	
; 	///==========~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
; 	 while(1)
; 	 {
	.dbline 130
; //---SET-
; if(NowSend!=(50*CarNumber))UDR='N';
	lds R24,_NowSend
	lds R25,_NowSend+1
	cpi R24,188
	ldi R30,2
	cpc R25,R30
	breq L8
	.dbline 130
	ldi R24,78
	out 0xc,R24
L8:
	.dbline 132
; 
; NowSend=50*CarNumber;
	ldi R24,700
	ldi R25,2
	sts _NowSend+1,R25
	sts _NowSend,R24
	.dbline 133
; 	TimeForWDG=0;
	clr R2
	clr R3
	sts _TimeForWDG+1,R3
	sts _TimeForWDG,R2
	.dbline 135
; 
; 		 if(SET_flag)//回车结束符号
	lds R2,_SET_flag
	tst R2
	breq L10
	.dbline 136
; 		 {
	.dbline 137
; 		  	CLI();
	cli
	.dbline 140
; 		//	WRITEEEPROM();    //不设定---------????????????????????/
; 			
; 			ReceiveSbuf[0]=0;
	clr R2
	sts _ReceiveSbuf,R2
	.dbline 141
; 			SEI();
	sei
	.dbline 142
; 			SET_flag=0;	
	sts _SET_flag,R2
	.dbline 144
; 			   
; 		 }
L10:
	.dbline 145
; 		 IC_Num_Read(); //是否有IC
	rcall _IC_Num_Read
	.dbline 147
; 		 
; 		SendSbuf[0]='T';
	ldi R24,84
	sts _SendSbuf,R24
	.dbline 148
; 		SendSbuf[1]='-';
	ldi R24,45
	sts _SendSbuf+1,R24
	.dbline 151
; 		 
; 		 //出错误检测
; 		 if((SendSbuf[4]<0x20)||(SendSbuf[4]>0x60))
	lds R24,_SendSbuf+4
	cpi R24,32
	brlo L17
	ldi R24,96
	lds R2,_SendSbuf+4
	cp R24,R2
	brsh L13
L17:
	.dbline 152
; 		 {
	.dbline 153
; 		  	SendSbuf[2]='E';
	ldi R24,69
	sts _SendSbuf+2,R24
	.dbline 154
; 			SendSbuf[3]='E';
	sts _SendSbuf+3,R24
	.dbline 155
; 			SendSbuf[4]='R';
	ldi R24,82
	sts _SendSbuf+4,R24
	.dbline 156
; 		    SendPoint=SendSbuf;
	ldi R24,<_SendSbuf
	ldi R25,>_SendSbuf
	sts _SendPoint+1,R25
	sts _SendPoint,R24
	.dbline 157
; 		    UDR=SendSbuf[4];
	lds R2,_SendSbuf+4
	out 0xc,R2
	.dbline 159
; 		    
; 		}
L13:
	.dbline 162
; 		
; 
; 	 sdelay(250);
	ldi R16,250
	rcall _sdelay
	.dbline 165
; 	
; // ----------------------------------------
; 	 T0_Count=0;
	clr R2
	sts _T0_Count,R2
L22:
	.dbline 169
L23:
	.dbline 169
	lds R24,_T0_Count
	cpi R24,15
	brlo L22
	.dbline 171
	rcall _IC_Num_Read
	.dbline 172
	clr R2
	sts _T0_Count,R2
	.dbline 175
L6:
	.dbline 127
	rjmp L5
X0:
	.dbline -2
	.dbline 176
; 	//if(Sbufx=='S')CLI();
; 	
; 	//PORTC|=0X02;
; 	while(T0_Count<15);// 等待20ms
; 	
; 	IC_Num_Read(); //是否有IC
; 	 T0_Count=0;
; 	
; 	
; 	 }
; }
L1:
	.dbline 0 ; func end
	ret
	.dbsym l k 1 c
	.dbsym l test 1 c
	.dbsym l j 1 i
	.dbsym r i 20 i
	.dbend
	.dbfunc e initialM8 _initialM8 fV
	.even
_initialM8::
	.dbline -1
	.dbline 181
; /*==========================================================================//
; 									END MAIN()
; ============================================================================*/
; void initialM8()
; {
	.dbline 185
; //== initial Timer0 as timer ==//
; 
; //--UART  initial---//
; UCSRB=(1<<RXEN)|(1<<TXEN); // Enable send and receive
	ldi R24,24
	out 0xa,R24
	.dbline 186
; UBRRL=(fosc/16/(baud+1))%256;
	ldi R24,23
	out 0x9,R24
	.dbline 187
; UBRRH=(fosc/16/(baud+1))/256;
	clr R2
	out 0x20,R2
	.dbline 188
; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	ldi R24,134
	out 0x20,R24
	.dbline 190
; //---接收中断使能---//
; UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
	ldi R24,216
	out 0xa,R24
	.dbline 193
; 
; //---定时器0初始化---//
; TCCR0=(1<<CS02)|(1<<CS00);  //  分频率=fosc/1024 
	ldi R24,5
	out 0x33,R24
	.dbline 194
; TIMSK=(1<<TOIE0);
	ldi R24,1
	out 0x39,R24
	.dbline 195
; TCNT0=256-(baud/1024)/20;  //定时0.05s 
	ldi R24,256
	ldi R25,1
	out 0x32,R24
	.dbline 196
; T0_Count=0;
	sts _T0_Count,R2
	.dbline 198
; 
; TimeForCall=0;
	sts _TimeForCall,R2
	.dbline 200
; //--------------------//
; SEI();  	 
	sei
	.dbline 201
; DDRC=0XFF;
	ldi R24,255
	out 0x14,R24
	.dbline 202
;  PORTC=0;
	out 0x15,R2
	.dbline 203
;  Sbufx=0;
	sts _Sbufx,R2
	.dbline 205
; //===PTR2000+ CONTROL ==//
; DDRD|=0Xff;
	in R24,0x11
	ori R24,255
	out 0x11,R24
	.dbline 206
; PORTD|=0XF0;
	in R24,0x12
	ori R24,240
	out 0x12,R24
	.dbline 207
; PORTD&=0XEF;
	in R24,0x12
	andi R24,239
	out 0x12,R24
	.dbline 208
; PTR2K_RECEIVE();	  //启动定为接收
	rcall _PTR2K_RECEIVE
L26:
	.dbline 209
L27:
	.dbline 209
; while(T0_Count<10);
	lds R24,_T0_Count
	cpi R24,10
	brlo L26
	.dbline 210
; putstr("Start 00 \r\n");
	ldi R16,<L29
	ldi R17,>L29
	rcall _putstr
	.dbline 211
; PORTC=0;
	clr R2
	out 0x15,R2
	.dbline 213
; 
; Sbufx=0;
	sts _Sbufx,R2
	.dbline 214
; Send_flag=0;
	sts _Send_flag,R2
	.dbline 215
; Timer2_initial();
	.dbline -2
	.dbline 217
; 
; }
L25:
	.dbline 0 ; func end
	rjmp _Timer2_initial
	.dbend
	.dbfunc e putchar _putchar fV
;              C -> R16
	.even
_putchar::
	.dbline -1
	.dbline 220
; 
; void putchar(unsigned char C)
; {
L31:
	.dbline 223
L32:
	.dbline 223
; //---关中断发送使能---//
; //UCSRB&=0XDF;
;  	 while(!(UCSRA&(1<<UDRE)));
	sbis 0xb,5
	rjmp L31
	.dbline 224
; 	 UDR=C;
	out 0xc,R16
	.dbline -2
	.dbline 227
; //UCSRB|=0X40; 
; //---开中断发送使能--//
; }
L30:
	.dbline 0 ; func end
	ret
	.dbsym r C 16 c
	.dbend
	.dbfunc e getchar _getchar fc
	.even
_getchar::
	.dbline -1
	.dbline 230
; 
; unsigned char getchar(void)
; {
L35:
	.dbline 231
L36:
	.dbline 231
;  	 while(!(UCSRA&(1<<RXC)));
	sbis 0xb,7
	rjmp L35
	.dbline 232
; 	 return UDR;
	in R16,0xc
	.dbline -2
L34:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e putstr _putstr fV
;              s -> R20,R21
	.even
_putstr::
	rcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 236
; }
; 
; void putstr(char *s)
; {
	rjmp L40
L39:
	.dbline 238
	.dbline 239
	movw R30,R20
	ldd R16,z+0
	rcall _putchar
	.dbline 240
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 242
L40:
	.dbline 237
;  	 while(*s)
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L39
	.dbline -2
	.dbline 243
; 	 {
; 	  	  putchar(*s);
; 		  s++;
; 	  	  
; 	 }
; }
L38:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbend
	.area vector(rom, abs)
	.org 26
	rjmp _Send_using_interrupt
	.area text(rom, con, rel)
	.dbfile E:\AVR\P_TEST\P_TEST.C
	.dbfunc e Send_using_interrupt _Send_using_interrupt fV
	.even
_Send_using_interrupt::
	rcall push_lset
	.dbline -1
	.dbline 248
; 
; ///--- 发送 结束中断--硬件自动清零TXC标志位//
; #pragma interrupt_handler Send_using_interrupt:iv_USART_TXC 
; void Send_using_interrupt(void)
; {
	.dbline 251
; 
;  	 
;  	 if(*SendPoint)
	lds R30,_SendPoint
	lds R31,_SendPoint+1
	ldd R2,z+0
	tst R2
	breq L43
	.dbline 252
; 	 {
	.dbline 253
; 	  	UDR=*SendPoint;
	out 0xc,R2
	.dbline 254
; 		Send_flag=1;  //用他的 BIT0 记录发送
	ldi R24,1
	sts _Send_flag,R24
	.dbline 256
; 		//*SendPoint=0;// 清零表明已经发送
; 		SendPoint++;
	movw R24,R30
	adiw R24,1
	sts _SendPoint+1,R25
	sts _SendPoint,R24
	.dbline 257
; 		return;
	rjmp L42
L43:
	.dbline 260
; 	 }
; 	 else
; 	 { //--添加发送结束 标志的代码 here
	.dbline 261
; 	    Send_flag=0;
	clr R2
	sts _Send_flag,R2
	.dbline 263
; 		
; 		PTR2K_RECEIVE(); //由发送改为接收
	rcall _PTR2K_RECEIVE
	.dbline 264
; 	 }
	.dbline -2
	.dbline 269
; 	 
; 
; //----用于精确定时---//
;  	 
; }
L42:
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e SendString2 _SendString2 fV
;              p -> R20,R21
;          str10 -> R16,R17
	.even
_SendString2::
	rcall push_gset1
	.dbline -1
	.dbline 272
; //--不能超过20个字符
; void SendString2(unsigned char *str10)
; {
	.dbline 276
;  	 unsigned char *p;
; 	 
;  	
;  	SEI();
	sei
L46:
	.dbline 277
L47:
	.dbline 277
; 	while(Send_flag>0);//等待中断发送结束
	clr R2
	lds R3,_Send_flag
	cp R2,R3
	brlo L46
	.dbline 278
; 	 p=SendSbuf;
	ldi R20,<_SendSbuf
	ldi R21,>_SendSbuf
	rjmp L50
L49:
	.dbline 280
	.dbline 282
	movw R30,R16
	ldd R2,z+0
	movw R30,R20
	std z+0,R2
	.dbline 283
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 284
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 287
L50:
	.dbline 279
;      while(*str10)
	movw R30,R16
	ldd R2,z+0
	tst R2
	brne L49
	.dbline 290
; 	 {
; 	  		
; 			 	  *p=*str10;
; 				  p++;
; 				  str10++;
; 		
; 			//要有超时间判断,防止死循环====??????
; 	}
; 	  //--开发送中断使能----//
; 	  
; 	  SendPoint=SendSbuf;
	ldi R24,<_SendSbuf
	ldi R25,>_SendSbuf
	sts _SendPoint+1,R25
	sts _SendPoint,R24
	.dbline 291
; 	  UDR=*SendPoint;  //启动发送中断
	movw R30,R24
	ldd R2,z+0
	out 0xc,R2
	.dbline 292
; 	  SendPoint++;
	adiw R24,1
	sts _SendPoint+1,R25
	sts _SendPoint,R24
L52:
	.dbline 293
L53:
	.dbline 293
; 	  while(!Send_flag);
	lds R2,_Send_flag
	tst R2
	breq L52
	.dbline -2
	.dbline 294
; }
L45:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r p 20 pc
	.dbsym r str10 16 pc
	.dbend
	.area vector(rom, abs)
	.org 22
	rjmp _Receive_using_interrupt
	.area text(rom, con, rel)
	.dbfile E:\AVR\P_TEST\P_TEST.C
	.dbfunc e Receive_using_interrupt _Receive_using_interrupt fV
;              i -> <dead>
	.even
_Receive_using_interrupt::
	st -y,R2
	st -y,R3
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 299
	.dbline 302

⌨️ 快捷键说明

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