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

📄 main.s

📁 avr单片机与flash存储器通信程序,调试通过,希望对大家有所帮助.
💻 S
字号:
	.module main.c
	.area lit(rom, con, rel)
_Tab::
	.byte 33,249
	.byte 19,'Q
	.byte 201,'E
	.byte 5,241
	.byte 1,'A
	.byte 129,13
	.byte 39,25
	.byte 7,135
	.dbfile C:\ATMega8515\Key/ForATmega8515.h
	.dbsym e Tab _Tab A[16:16]kc
	.area text(rom, con, rel)
	.dbfile C:\ATMega8515\Key/ForATmega8515.h
	.dbfile C:\ATMega8515\Key\main.c
	.dbfunc e main _main fV
;          shuma -> R20
;            key -> R22
	.even
_main::
	.dbline -1
	.dbline 13
; #include <iom8515v.h>
; #include"ForATmega8515.h"
; #define 	C0			0x04
; #define 	C1			0x08	
; #define 	C2			0x10
; #define 	R0			0x40
; #define 	R1			0x80 
; void delay(uint ticks);//严时
; uchar GetKey(void);
; 
; uchar temp;
; void main()
; {
	.dbline 14
;  uchar shuma=0;
	clr R20
	.dbline 15
;  uchar key=0;
	clr R22
	.dbline 16
;  init_devices();
	rcall _init_devices
	rjmp L3
L2:
	.dbline 18
;  while(1)
;  {
	.dbline 19
;   temp=GetKey();
	rcall _GetKey
	sts _temp,R16
	.dbline 20
;   key=temp;
	mov R22,R16
	.dbline 21
;   if((key&0x10)!=0)  //第一列有键按下
	sbrs R16,4
	rjmp L5
	.dbline 22
;   {
	.dbline 23
; 	  if((temp&0x01)==0)shuma=1;
	sbrc R16,0
	rjmp L7
	.dbline 23
	ldi R20,1
	rjmp L6
L7:
	.dbline 24
; 	  else if((temp&0x02)==0)shuma=3;
	lds R2,_temp
	sbrc R2,1
	rjmp L9
	.dbline 24
	ldi R20,3
	rjmp L6
L9:
	.dbline 25
; 	  else if((temp&0x04)==0)shuma=5;
	lds R2,_temp
	sbrc R2,2
	rjmp L6
	.dbline 25
	ldi R20,5
	.dbline 26
;   }
	rjmp L6
L5:
	.dbline 27
;   else if((key&0x20)!=0)//第二列有键按下
	sbrs R22,5
	rjmp L13
	.dbline 28
;   {
	.dbline 29
; 	  if((temp&0x01)==0)shuma=2;
	lds R2,_temp
	sbrc R2,0
	rjmp L15
	.dbline 29
	ldi R20,2
	rjmp L16
L15:
	.dbline 30
; 	  else if((temp&0x02)==0)shuma=4;
	lds R2,_temp
	sbrc R2,1
	rjmp L17
	.dbline 30
	ldi R20,4
	rjmp L18
L17:
	.dbline 31
; 	  else if((temp&0x04)==0)shuma=6;
	lds R2,_temp
	sbrs R2,2
	.dbline 31
	ldi R20,6
L19:
L18:
L16:
	.dbline 32
;   }
L13:
L6:
	.dbline 34
	ldi R24,<_Tab
	ldi R25,>_Tab
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 36
L3:
	.dbline 17
	rjmp L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r shuma 20 c
	.dbsym r key 22 c
	.dbend
	.dbfunc e delay _delay fV
;              i -> R20
;          ticks -> R16,R17
	.even
_delay::
	rcall push_gset1
	.dbline -1
	.dbline 42
; 
;   PORTA=Tab[shuma];
; 
;  }
; 
; }
; 
; 
; void delay(uint ticks)
; {
	.dbline 44
	rjmp L25
L22:
	.dbline 44
	ldi R20,200
	rjmp L29
L26:
	.dbline 44
L27:
	.dbline 44
	dec R20
L29:
	.dbline 44
	tst R20
	brne L26
L23:
	.dbline 44
	subi R16,1
	sbci R17,0
L25:
	.dbline 44
;  uchar i;
;  for(;ticks!=0;ticks--)for(i=200;i!=0;i--);
	cpi R16,0
	cpc R16,R17
	brne L22
X1:
	.dbline -2
L21:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r ticks 16 i
	.dbend
	.dbfunc e GetKey _GetKey fc
;           temp -> R20
;            key -> R22
	.even
_GetKey::
	rcall push_gset2
	.dbline -1
	.dbline 49
; }
; 
; ////////////////////////////////////////////////
; uchar GetKey(void)
; {
	.dbline 54
;  uchar key;
;  uchar temp;
;  //temp的高4位是按下的列
;  //temp低4位是按下的行
;  DDRD&=~(C0+C1+C2);//C0,C1,C2设置为输入
	in R24,0x11
	andi R24,227
	out 0x11,R24
	.dbline 55
;  DDRD|=R0+R1;//R0,R1设置为输出
	in R24,0x11
	ori R24,192
	out 0x11,R24
	.dbline 56
;  PORTD&=~(R0+R1);//R0,R1输出0
	in R24,0x12
	andi R24,63
	out 0x12,R24
	.dbline 57
;  key=PIND;		//读取引脚		  
	in R22,0x10
	.dbline 58
;  key>>=2;       
	lsr R22
	lsr R22
	.dbline 59
;  key&=0x07;
	andi R22,7
	.dbline 60
;  if(key!=0x07)   //如果有键盘按下
	cpi R22,7
	breq L31
	.dbline 61
;  {
	.dbline 62
; 	  delay(1);  //延时,软件滤波
	ldi R16,1
	ldi R17,0
	rcall _delay
	.dbline 63
; 	  key=PIND; //读取引脚		
	in R22,0x10
	.dbline 64
; 	  key>>=2;
	lsr R22
	lsr R22
	.dbline 65
; 	  key&=0x07;
	andi R22,7
	.dbline 66
; 	  if(key!=0x07) 
	cpi R22,7
	breq L33
	.dbline 67
; 		  {
	.dbline 69
; 		   //确实有键按下
; 			temp=key;
	mov R20,R22
	.dbline 70
;  			DDRD|=C0+C1+C2;////C0,C1,C2设置为输出
	in R24,0x11
	ori R24,28
	out 0x11,R24
	.dbline 71
;  			DDRD&=~(R0+R1);//R0,R1设置为输入
	in R24,0x11
	andi R24,63
	out 0x11,R24
	.dbline 72
; 			PORTD|=C0+C1+C2;
	in R24,0x12
	ori R24,28
	out 0x12,R24
	.dbline 73
; 			key=PIND;     //读取引脚		
	in R22,0x10
	.dbline 74
; 			key>>=2;
	lsr R22
	lsr R22
	.dbline 75
; 			key&=0x30;
	andi R22,48
	.dbline 76
; 			temp+=key; 
	add R20,R22
	.dbline 77
; 			return temp;
	mov R16,R20
	rjmp L30
L33:
	.dbline 79
; 		   }
;  }
L31:
	.dbline 80
;   return 0xff;//没有键按下
	ldi R16,255
	.dbline -2
L30:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r key 22 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile C:\ATMega8515\Key\main.c
_temp::
	.blkb 1
	.dbsym e temp _temp c

⌨️ 快捷键说明

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