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

📄 test2.s

📁 实现mega8的isp操作
💻 S
📖 第 1 页 / 共 4 页
字号:
	.module TEST2.C
	.area lit(rom, con, rel)
_SET::
	.byte 'S,'E,'T,45,0
	.dbfile E:\AVR\P_TEST\testAVR\TEST2.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\testAVR\TEST2.C
	.dbfunc e main _main fV
;              k -> <dead>
;           test -> <dead>
;              j -> <dead>
;              i -> R20,R21
	.even
_main::
	.dbline -1
	.dbline 97
; /*
; ********************************************************************
; 
; 
;      	  v1.0
; 			  write by Mr. pan
; 			  All rights reversed
; ******************************************************************************
; */
; 
; #include<iom8v.h>
; #include<macros.h>
; #include<eeprom.h>
; 
; 
; #define baud  9600
; #define fosc  3579545
; 
; //--变量声明区---//
; 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;
; //--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 100
;  	 unsigned int i,j;
; 	 unsigned char test, k;
;      initialM8();
	rcall _initialM8
	.dbline 102
; 
;     ReadEEPROM();
	rcall _ReadEEPROM
	.dbline 103
;  I2C_Reset();
	rcall _I2C_Reset
	.dbline 104
;  i=0;
	clr R20
	clr R21
	.dbline 106
;  //I2C_Write(0,0X40);// test use 
;  SDAIN();
	in R24,0x14
	andi R24,223
	out 0x14,R24
	.dbline 108
;  //--主机设定--//
;  DDRB=0X03;
	ldi R24,3
	out 0x17,R24
	.dbline 109
;  PORTB=0X02;
	ldi R24,2
	out 0x18,R24
	.dbline 110
;    I2C_Write(0,0X33);
	ldi R18,51
	clr R16
	rcall _I2C_Write
	.dbline 111
;     sdelay(250);
	ldi R16,250
	rcall _sdelay
	.dbline 112
; 	ICRead=0;
	clr R2
	sts _ICRead,R2
	.dbline 113
; 	 T0_Count=0;
	sts _T0_Count,R2
L2:
	.dbline 114
L3:
	.dbline 114
; 	 while(T0_Count<50);
	lds R24,_T0_Count
	cpi R24,50
	brlo L2
	.dbline 116
; 	//NowSend=1000;
; 	DDRC=0XFF;
	ldi R24,255
	out 0x14,R24
	rjmp L6
L5:
	.dbline 118
; 	 while(1)
; 	 {
	.dbline 120
; //---SET-
; if(NowSend!=2000)UDR='N';
	lds R24,_NowSend
	lds R25,_NowSend+1
	cpi R24,208
	ldi R30,7
	cpc R25,R30
	breq L8
	.dbline 120
	ldi R24,78
	out 0xc,R24
L8:
	.dbline 121
; NowSend=2000;
	ldi R24,2000
	ldi R25,7
	sts _NowSend+1,R25
	sts _NowSend,R24
	.dbline 122
; PORTC=0XF0;
	ldi R24,240
	out 0x15,R24
	.dbline 124
; 
; 		 if(SET_flag)//回车结束符号
	lds R2,_SET_flag
	tst R2
	breq L10
	.dbline 125
; 		 {
	.dbline 126
; 		  	CLI();
	cli
	.dbline 127
; 			WRITEEEPROM();
	rcall _WRITEEEPROM
	.dbline 129
; 			
; 			ReceiveSbuf[0]=0;
	clr R2
	sts _ReceiveSbuf,R2
	.dbline 130
; 			SEI();
	sei
	.dbline 131
; 			SET_flag=0;	
	sts _SET_flag,R2
	.dbline 133
; 			   
; 		 }
L10:
	.dbline 134
; 		 IC_Num_Read(); //是否有IC
	rcall _IC_Num_Read
	.dbline 136
; 		 
; 		SendSbuf[0]='T';
	ldi R24,84
	sts _SendSbuf,R24
	.dbline 137
; 		SendSbuf[1]='-';
	ldi R24,45
	sts _SendSbuf+1,R24
	.dbline 138
; 		 if(SendSbuf[2]<0x30)SendSbuf[2]='E';
	lds R24,_SendSbuf+2
	cpi R24,48
	brsh L13
	.dbline 138
	ldi R24,69
	sts _SendSbuf+2,R24
L13:
	.dbline 139
; 		 if(SendSbuf[3]<0x30)SendSbuf[3]='E';
	lds R24,_SendSbuf+3
	cpi R24,48
	brsh L17
	.dbline 139
	ldi R24,69
	sts _SendSbuf+3,R24
L17:
	.dbline 140
; 		 if(SendSbuf[4]<0x30)SendSbuf[4]='R';
	lds R24,_SendSbuf+4
	cpi R24,48
	brsh L21
	.dbline 140
	ldi R24,82
	sts _SendSbuf+4,R24
L21:
	.dbline 142
; 		 
; 		 if((SendSbuf[4]<0x20)||(SendSbuf[4]>0x60))
	lds R24,_SendSbuf+4
	cpi R24,32
	brlo L29
	ldi R24,96
	lds R2,_SendSbuf+4
	cp R24,R2
	brsh L25
L29:
	.dbline 143
; 		 {
	.dbline 144
; 		  	SendSbuf[2]='E';
	ldi R24,69
	sts _SendSbuf+2,R24
	.dbline 145
; 			SendSbuf[3]='E';
	sts _SendSbuf+3,R24
	.dbline 146
; 			SendSbuf[4]='R';
	ldi R24,82
	sts _SendSbuf+4,R24
	.dbline 147
; 		    SendPoint=SendSbuf;
	ldi R24,<_SendSbuf
	ldi R25,>_SendSbuf
	sts _SendPoint+1,R25
	sts _SendPoint,R24
	.dbline 148
; 		    UDR=SendSbuf[4];
	lds R2,_SendSbuf+4
	out 0xc,R2
	.dbline 150
; 		    
; 		}
L25:
	.dbline 161
; 		
; 	//if(NowSend!=NowSend2) 
; 		//			 NowSend=NowSend2;
; 					 
; //-------------test area------------------------ 
;    
; 	//SDAIN();
; 	// sdelay(250);
; 	// test=0x35;
; 	// test=I2C_Read(0);
; 	 sdelay(250);
	ldi R16,250
	rcall _sdelay
	.dbline 169
; 	// if((test>30)&&(test<0x3a)) UDR=test;
; 	// else  UDR=test;;
; 	// i++;
; 	 
; 	// UDR=test;
; 	
; // ----------------------------------------
; 	 T0_Count=0;
	clr R2
	sts _T0_Count,R2
L34:
	.dbline 173
L35:
	.dbline 173
	lds R24,_T0_Count
	cpi R24,5
	brlo L34
	.dbline 175
	rcall _IC_Num_Read
	.dbline 176
	clr R2
	sts _T0_Count,R2
	.dbline 180
L6:
	.dbline 117
	rjmp L5
X0:
	.dbline -2
	.dbline 181
; 	//if(Sbufx=='S')CLI();
; 	
; 	//PORTC|=0X02;
; 	while(T0_Count<5);// 等待20ms
; 	
; 	IC_Num_Read(); //是否有IC
; 	 T0_Count=0;
; 	//while(T0_Count<20);// 等待20ms
; 	//IC_Num_Read();
; 	
; 	 }
; }
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 186
; /*==========================================================================//
; 									END MAIN()
; ============================================================================*/
; void initialM8()
; {
	.dbline 190
; //== initial Timer0 as timer ==//
; 
; //--UART  initial---//
; UCSRB=(1<<RXEN)|(1<<TXEN); // Enable send and receive
	ldi R24,24
	out 0xa,R24
	.dbline 191
; UBRRL=(fosc/16/(baud+1))%256;
	ldi R24,23
	out 0x9,R24
	.dbline 192
; UBRRH=(fosc/16/(baud+1))/256;
	clr R2
	out 0x20,R2
	.dbline 193
; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	ldi R24,134
	out 0x20,R24
	.dbline 195
; //---接收中断使能---//
; UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
	ldi R24,216
	out 0xa,R24
	.dbline 198
; 
; //---定时器0初始化---//
; TCCR0=(1<<CS02)|(1<<CS00);  //  分频率=fosc/1204 
	ldi R24,5
	out 0x33,R24
	.dbline 199
; TIMSK=(1<<TOIE0);
	ldi R24,1
	out 0x39,R24
	.dbline 200
; TCNT0=256-(baud/1024)/20;  //定时0.05s 
	ldi R24,256
	ldi R25,1
	out 0x32,R24
	.dbline 201
; T0_Count=0;
	sts _T0_Count,R2
	.dbline 203
; 
; TimeForCall=0;
	sts _TimeForCall,R2
	.dbline 205
; //--------------------//
; SEI();  	 
	sei
	.dbline 206
; DDRC=0XFF;
	ldi R24,255
	out 0x14,R24
	.dbline 207
;  PORTC=0;
	out 0x15,R2
	.dbline 208
;  Sbufx=0;
	sts _Sbufx,R2
	.dbline 210
; //===PTR2000+ CONTROL ==//
; DDRD|=0Xff;
	in R24,0x11
	ori R24,255
	out 0x11,R24
	.dbline 211
; PORTD|=0XF0;
	in R24,0x12
	ori R24,240
	out 0x12,R24
	.dbline 212
; PORTD&=0XEF;
	in R24,0x12
	andi R24,239
	out 0x12,R24
	.dbline 213
; PTR2K_RECEIVE();	  //启动定为接收
	rcall _PTR2K_RECEIVE
L38:
	.dbline 214
L39:
	.dbline 214
; while(T0_Count<10);
	lds R24,_T0_Count
	cpi R24,10
	brlo L38
	.dbline 215
; putstr("Start 00 \r\n");
	ldi R16,<L41
	ldi R17,>L41
	rcall _putstr
	.dbline 216
; PORTC=0;
	clr R2
	out 0x15,R2
	.dbline 218
; 
; Sbufx=0;
	sts _Sbufx,R2
	.dbline 219
; Send_flag=0;
	sts _Send_flag,R2
	.dbline 220
; Timer2_initial();
	.dbline -2
	.dbline 222
; 
; }
L37:
	.dbline 0 ; func end
	rjmp _Timer2_initial
	.dbend
	.dbfunc e putchar _putchar fV
;              C -> R16
	.even
_putchar::
	.dbline -1
	.dbline 225
; 
; void putchar(unsigned char C)
; {
L43:
	.dbline 228
L44:
	.dbline 228
; //---关中断发送使能---//
; //UCSRB&=0XDF;
;  	 while(!(UCSRA&(1<<UDRE)));
	sbis 0xb,5
	rjmp L43
	.dbline 229
; 	 UDR=C;
	out 0xc,R16
	.dbline -2
	.dbline 232
; //UCSRB|=0X40; 
; //---开中断发送使能--//
; }
L42:
	.dbline 0 ; func end
	ret
	.dbsym r C 16 c
	.dbend
	.dbfunc e getchar _getchar fc
	.even
_getchar::
	.dbline -1
	.dbline 235
; 
; unsigned char getchar(void)
; {
L47:
	.dbline 236
L48:
	.dbline 236
;  	 while(!(UCSRA&(1<<RXC)));
	sbis 0xb,7
	rjmp L47
	.dbline 237
; 	 return UDR;
	in R16,0xc
	.dbline -2
L46:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e putstr _putstr fV
;              s -> R20,R21
	.even
_putstr::
	rcall push_gset1
	mov R20,R16
	mov R21,R17
	.dbline -1
	.dbline 241
; }
; 
; void putstr(char *s)
; {
	rjmp L52
L51:
	.dbline 243
	.dbline 244
	mov R30,R20
	mov R31,R21
	ldd R16,z+0
	rcall _putchar
	.dbline 245
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 247
L52:
	.dbline 242
;  	 while(*s)
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	tst R2
	brne L51
	.dbline -2
	.dbline 248
; 	 {
; 	  	  putchar(*s);
; 		  s++;
; 	  	  
; 	 }
; }
L50:
	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\testAVR\TEST2.C
	.dbfunc e Send_using_interrupt _Send_using_interrupt fV
	.even
_Send_using_interrupt::
	rcall push_lset
	.dbline -1
	.dbline 253
; 
; ///--- 发送 结束中断--硬件自动清零TXC标志位//
; #pragma interrupt_handler Send_using_interrupt:iv_USART_TXC 
; void Send_using_interrupt(void)
; {
	.dbline 256
; 
;  	 
;  	 if(*SendPoint)
	lds R30,_SendPoint
	lds R31,_SendPoint+1
	ldd R2,z+0
	tst R2
	breq L55
	.dbline 257
; 	 {
	.dbline 258
; 	  	UDR=*SendPoint;
	out 0xc,R2
	.dbline 259
; 		Send_flag=1;  //用他的 BIT0 记录发送
	ldi R24,1
	sts _Send_flag,R24
	.dbline 261
; 		//*SendPoint=0;// 清零表明已经发送
; 		SendPoint++;
	mov R24,R30
	mov R25,R31
	adiw R24,1
	sts _SendPoint+1,R25
	sts _SendPoint,R24
	.dbline 262
; 		return;
	rjmp L54
L55:
	.dbline 265
; 	 }
; 	 else
; 	 { //--添加发送结束 标志的代码 here
	.dbline 266
; 	    Send_flag=0;
	clr R2
	sts _Send_flag,R2
	.dbline 268
; 		
; 		PTR2K_RECEIVE(); //由发送改为接收
	rcall _PTR2K_RECEIVE
	.dbline 269
; 	 }
	.dbline -2
	.dbline 274
; 	 
; 
; //----用于精确定时---//
;  	 
; }
L54:
	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 277
; //--不能超过20个字符
; void SendString2(unsigned char *str10)
; {
	.dbline 281
;  	 unsigned char *p;
; 	 
;  	
;  	SEI();
	sei
L58:
	.dbline 282
L59:
	.dbline 282
; 	while(Send_flag>0);//等待中断发送结束
	clr R2
	lds R3,_Send_flag
	cp R2,R3
	brlo L58
	.dbline 283
; 	 p=SendSbuf;
	ldi R20,<_SendSbuf
	ldi R21,>_SendSbuf
	rjmp L62
L61:
	.dbline 285
	.dbline 287
	mov R30,R16
	mov R31,R17
	ldd R2,z+0
	mov R30,R20
	mov R31,R21
	std z+0,R2
	.dbline 288
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 289
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 292
L62:
	.dbline 284
;      while(*str10)
	mov R30,R16
	mov R31,R17
	ldd R2,z+0
	tst R2
	brne L61
	.dbline 295
; 	 {
; 	  		
; 			 	  *p=*str10;
; 				  p++;
; 				  str10++;
; 		
; 			//要有超时间判断,防止死循环====??????
; 	}
; 	  //--开发送中断使能----//
; 	  
; 	  SendPoint=SendSbuf;
	ldi R24,<_SendSbuf
	ldi R25,>_SendSbuf
	sts _SendPoint+1,R25
	sts _SendPoint,R24
	.dbline 296
; 	  UDR=*SendPoint;  //启动发送中断
	mov R30,R24
	mov R31,R25
	ldd R2,z+0
	out 0xc,R2
	.dbline 297
; 	  SendPoint++;
	adiw R24,1
	sts _SendPoint+1,R25
	sts _SendPoint,R24
L64:
	.dbline 298
L65:
	.dbline 298
; 	  while(!Send_flag);
	lds R2,_Send_flag
	tst R2
	breq L64
	.dbline -2
	.dbline 299
; }
L57:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r p 20 pc
	.dbsym r str10 16 pc

⌨️ 快捷键说明

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