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

📄 key.lst

📁 avr单片机与flash存储器通信程序,调试通过,希望对大家有所帮助.
💻 LST
字号:
__text_start:
__start:
    0019 E5CF      LDI	R28,0x5F
    001A E0D2      LDI	R29,2
    001B BFCD      OUT	0x3D,R28
    001C BFDE      OUT	0x3E,R29
    001D 51C0      SUBI	R28,0x10
    001E 40D0      SBCI	R29,0
    001F EA0A      LDI	R16,0xAA
    0020 8308      STD	Y+0,R16
    0021 2400      CLR	R0
    0022 E6E0      LDI	R30,0x60
    0023 E0F0      LDI	R31,0
    0024 E010      LDI	R17,0
    0025 36E1      CPI	R30,0x61
    0026 07F1      CPC	R31,R17
    0027 F011      BEQ	0x002A
    0028 9201      ST	R0,Z+
    0029 CFFB      RJMP	0x0025
    002A 8300      STD	Z+0,R16
    002B E3E2      LDI	R30,0x32
    002C E0F0      LDI	R31,0
    002D E6A0      LDI	R26,0x60
    002E E0B0      LDI	R27,0
    002F E010      LDI	R17,0
    0030 33E2      CPI	R30,0x32
    0031 07F1      CPC	R31,R17
    0032 F021      BEQ	0x0037
    0033 95C8      LPM
    0034 9631      ADIW	R30,1
    0035 920D      ST	R0,X+
    0036 CFF9      RJMP	0x0030
    0037 D019      RCALL	_main
_exit:
    0038 CFFF      RJMP	_exit
FILE: C:\ATMega8515\Key\init.c
(0001) //ICC-AVR application builder : 2006-4-27 19:56:34
(0002) // Target : M8515
(0003) // Crystal: 11.059Mhz
(0004) 
(0005) #include <iom8515v.h>
(0006) #include <macros.h>
(0007) 
(0008) void port_init(void)
(0009) {
(0010)  PORTA = 0x00;
_port_init:
    0039 2422      CLR	R2
    003A BA2B      OUT	0x1B,R2
(0011)  DDRA  = 0xFF;
    003B EF8F      LDI	R24,0xFF
    003C BB8A      OUT	0x1A,R24
(0012)  PORTB = 0x00;
    003D BA28      OUT	0x18,R2
(0013)  DDRB  = 0x00;
    003E BA27      OUT	0x17,R2
(0014)  PORTC = 0x80;
    003F E880      LDI	R24,0x80
    0040 BB85      OUT	0x15,R24
(0015)  DDRC  = 0xC0;
    0041 EC80      LDI	R24,0xC0
    0042 BB84      OUT	0x14,R24
(0016)  PORTD = 0x00;
    0043 BA22      OUT	0x12,R2
(0017)  DDRD  = 0xC0; 
    0044 BB81      OUT	0x11,R24
(0018)  PORTE = 0x00;
    0045 B827      OUT	0x07,R2
(0019)  DDRE  = 0x00; 
    0046 B826      OUT	0x06,R2
    0047 9508      RET
(0020) }
(0021) 
(0022) //call this routine to initialize all peripherals
(0023) void init_devices(void)
(0024) {
(0025)  //stop errant interrupts until set up
(0026)  CLI(); //disable all interrupts
_init_devices:
    0048 94F8      BCLR	7
(0027)  port_init();
    0049 DFEF      RCALL	_port_init
(0028) 
(0029)  MCUCR = 0x00;
    004A 2422      CLR	R2
    004B BE25      OUT	0x35,R2
(0030)  EMCUCR = 0x00;
    004C BE26      OUT	0x36,R2
(0031)  GICR = 0x00;
    004D BE2B      OUT	0x3B,R2
(0032)  TIMSK = 0x00;
    004E BE29      OUT	0x39,R2
(0033)  SEI(); //re-enable interrupts
    004F 9478      BSET	7
    0050 9508      RET
FILE: C:\ATMega8515\Key\main.c
(0001) #include <iom8515v.h>
(0002) #include"ForATmega8515.h"
(0003) #define 	C0			0x04
(0004) #define 	C1			0x08	
(0005) #define 	C2			0x10
(0006) #define 	R0			0x40
(0007) #define 	R1			0x80 
(0008) void delay(uint ticks);//严时
(0009) uchar GetKey(void);
(0010) 
(0011) uchar temp;
(0012) void main()
(0013) {
(0014)  uchar shuma=0;
_main:
  shuma                --> R20
  key                  --> R22
    0051 2744      CLR	R20
(0015)  uchar key=0;
    0052 2766      CLR	R22
(0016)  init_devices();
    0053 DFF4      RCALL	_init_devices
    0054 C030      RJMP	0x0085
(0017)  while(1)
(0018)  {
(0019)   temp=GetKey();
    0055 D03F      RCALL	_GetKey
    0056 93000060  STS	temp,R16
(0020)   key=temp;
    0058 2F60      MOV	R22,R16
(0021)   if((key&0x10)!=0)  //第一列有键按下
    0059 FF04      SBRS	R16,4
    005A C010      RJMP	0x006B
(0022)   {
(0023) 	  if((temp&0x01)==0)shuma=1;
    005B FD00      SBRC	R16,0
    005C C002      RJMP	0x005F
    005D E041      LDI	R20,1
    005E C01E      RJMP	0x007D
(0024) 	  else if((temp&0x02)==0)shuma=3;
    005F 90200060  LDS	R2,temp
    0061 FC21      SBRC	R2,1
    0062 C002      RJMP	0x0065
    0063 E043      LDI	R20,3
    0064 C018      RJMP	0x007D
(0025) 	  else if((temp&0x04)==0)shuma=5;
    0065 90200060  LDS	R2,temp
    0067 FC22      SBRC	R2,2
    0068 C014      RJMP	0x007D
    0069 E045      LDI	R20,5
(0026)   }
    006A C012      RJMP	0x007D
(0027)   else if((key&0x20)!=0)//第二列有键按下
    006B FF65      SBRS	R22,5
    006C C010      RJMP	0x007D
(0028)   {
(0029) 	  if((temp&0x01)==0)shuma=2;
    006D 90200060  LDS	R2,temp
    006F FC20      SBRC	R2,0
    0070 C002      RJMP	0x0073
    0071 E042      LDI	R20,2
    0072 C00A      RJMP	0x007D
(0030) 	  else if((temp&0x02)==0)shuma=4;
    0073 90200060  LDS	R2,temp
    0075 FC21      SBRC	R2,1
    0076 C002      RJMP	0x0079
    0077 E044      LDI	R20,4
    0078 C004      RJMP	0x007D
(0031) 	  else if((temp&0x04)==0)shuma=6;
    0079 90200060  LDS	R2,temp
    007B FE22      SBRS	R2,2
    007C E046      LDI	R20,6
(0032)   }
(0033) 
(0034)   PORTA=Tab[shuma];
    007D E282      LDI	R24,0x22
    007E E090      LDI	R25,0
    007F 2FE4      MOV	R30,R20
    0080 27FF      CLR	R31
    0081 0FE8      ADD	R30,R24
    0082 1FF9      ADC	R31,R25
    0083 91E4      LPM	R30,0(Z)
    0084 BBEB      OUT	0x1B,R30
    0085 CFCF      RJMP	0x0055
    0086 9508      RET
_delay:
  i                    --> R20
  ticks                --> R16
    0087 D044      RCALL	push_gset1
(0035) 
(0036)  }
(0037) 
(0038) }
(0039) 
(0040) 
(0041) void delay(uint ticks)
(0042) {
(0043)  uchar i;
(0044)  for(;ticks!=0;ticks--)for(i=200;i!=0;i--);
    0088 C007      RJMP	0x0090
    0089 EC48      LDI	R20,0xC8
    008A C001      RJMP	0x008C
    008B 954A      DEC	R20
    008C 2344      TST	R20
    008D F7E9      BNE	0x008B
    008E 5001      SUBI	R16,1
    008F 4010      SBCI	R17,0
    0090 3000      CPI	R16,0
    0091 0701      CPC	R16,R17
    0092 F7B1      BNE	0x0089
    0093 D03B      RCALL	pop_gset1
    0094 9508      RET
_GetKey:
  temp                 --> R20
  key                  --> R22
    0095 D034      RCALL	push_gset2
(0045) }
(0046) 
(0047) ////////////////////////////////////////////////
(0048) uchar GetKey(void)
(0049) {
(0050)  uchar key;
(0051)  uchar temp;
(0052)  //temp的高4位是按下的列
(0053)  //temp低4位是按下的行
(0054)  DDRD&=~(C0+C1+C2);//C0,C1,C2设置为输入
    0096 B381      IN	R24,0x11
    0097 7E83      ANDI	R24,0xE3
    0098 BB81      OUT	0x11,R24
(0055)  DDRD|=R0+R1;//R0,R1设置为输出
    0099 B381      IN	R24,0x11
    009A 6C80      ORI	R24,0xC0
    009B BB81      OUT	0x11,R24
(0056)  PORTD&=~(R0+R1);//R0,R1输出0
    009C B382      IN	R24,0x12
    009D 738F      ANDI	R24,0x3F
    009E BB82      OUT	0x12,R24
(0057)  key=PIND;		//读取引脚		  
    009F B360      IN	R22,0x10
(0058)  key>>=2;       
    00A0 9566      LSR	R22
    00A1 9566      LSR	R22
(0059)  key&=0x07;
    00A2 7067      ANDI	R22,7
(0060)  if(key!=0x07)   //如果有键盘按下
    00A3 3067      CPI	R22,7
    00A4 F0D1      BEQ	0x00BF
(0061)  {
(0062) 	  delay(1);  //延时,软件滤波
    00A5 E001      LDI	R16,1
    00A6 E010      LDI	R17,0
    00A7 DFDF      RCALL	_delay
(0063) 	  key=PIND; //读取引脚		
    00A8 B360      IN	R22,0x10
(0064) 	  key>>=2;
    00A9 9566      LSR	R22
    00AA 9566      LSR	R22
(0065) 	  key&=0x07;
    00AB 7067      ANDI	R22,7
(0066) 	  if(key!=0x07) 
    00AC 3067      CPI	R22,7
    00AD F089      BEQ	0x00BF
(0067) 		  {
(0068) 		   //确实有键按下
(0069) 			temp=key;
    00AE 2F46      MOV	R20,R22
(0070)  			DDRD|=C0+C1+C2;////C0,C1,C2设置为输出
    00AF B381      IN	R24,0x11
    00B0 618C      ORI	R24,0x1C
    00B1 BB81      OUT	0x11,R24
(0071)  			DDRD&=~(R0+R1);//R0,R1设置为输入
    00B2 B381      IN	R24,0x11
    00B3 738F      ANDI	R24,0x3F
    00B4 BB81      OUT	0x11,R24
(0072) 			PORTD|=C0+C1+C2;
    00B5 B382      IN	R24,0x12
    00B6 618C      ORI	R24,0x1C
    00B7 BB82      OUT	0x12,R24
(0073) 			key=PIND;     //读取引脚		
    00B8 B360      IN	R22,0x10
(0074) 			key>>=2;
    00B9 9566      LSR	R22
    00BA 9566      LSR	R22
(0075) 			key&=0x30;
    00BB 7360      ANDI	R22,0x30
(0076) 			temp+=key; 
    00BC 0F46      ADD	R20,R22
(0077) 			return temp;
    00BD 2F04      MOV	R16,R20
    00BE C001      RJMP	0x00C0
(0078) 		   }
(0079)  }
(0080)   return 0xff;//没有键按下
FILE: <library>
    00BF EF0F      LDI	R16,0xFF
    00C0 D001      RCALL	pop_gset2
    00C1 9508      RET
pop_gset2:
    00C2 E0E2      LDI	R30,2
    00C3 C00C      RJMP	pop
push_gset5:
    00C4 92FA      ST	R15,-Y
    00C5 92EA      ST	R14,-Y
push_gset4:
    00C6 92DA      ST	R13,-Y
    00C7 92CA      ST	R12,-Y
push_gset3:
    00C8 92BA      ST	R11,-Y
    00C9 92AA      ST	R10,-Y
push_gset2:
    00CA 937A      ST	R23,-Y
    00CB 936A      ST	R22,-Y
push_gset1:
    00CC 935A      ST	R21,-Y
    00CD 934A      ST	R20,-Y
    00CE 9508      RET
pop_gset1:
    00CF E0E1      LDI	R30,1
pop:
    00D0 9149      LD	R20,Y+
    00D1 9159      LD	R21,Y+
    00D2 FDE0      SBRC	R30,0
    00D3 9508      RET
    00D4 9169      LD	R22,Y+
    00D5 9179      LD	R23,Y+
    00D6 FDE1      SBRC	R30,1
    00D7 9508      RET
    00D8 90A9      LD	R10,Y+
    00D9 90B9      LD	R11,Y+
    00DA FDE2      SBRC	R30,2
    00DB 9508      RET
    00DC 90C9      LD	R12,Y+
    00DD 90D9      LD	R13,Y+
    00DE FDE3      SBRC	R30,3
    00DF 9508      RET
    00E0 90E9      LD	R14,Y+
    00E1 90F9      LD	R15,Y+
    00E2 9508      RET

⌨️ 快捷键说明

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