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

📄 led.lst

📁 AVR基本外设测试程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0018 E5CF      LDI	R28,0x5F
    0019 E0D4      LDI	R29,4
    001A BFCD      OUT	0x3D,R28
    001B BFDE      OUT	0x3E,R29
    001C 51C0      SUBI	R28,0x10
    001D 40D0      SBCI	R29,0
    001E EA0A      LDI	R16,0xAA
    001F 8308      STD	Y+0,R16
    0020 2400      CLR	R0
    0021 E6E9      LDI	R30,0x69
    0022 E0F0      LDI	R31,0
    0023 E010      LDI	R17,0
    0024 39EA      CPI	R30,0x9A
    0025 07F1      CPC	R31,R17
    0026 F011      BEQ	0x0029
    0027 9201      ST	R0,Z+
    0028 CFFB      RJMP	0x0024
    0029 8300      STD	Z+0,R16
    002A E2E6      LDI	R30,0x26
    002B E0F0      LDI	R31,0
    002C E6A0      LDI	R26,0x60
    002D E0B0      LDI	R27,0
    002E E010      LDI	R17,0
    002F 32EF      CPI	R30,0x2F
    0030 07F1      CPC	R31,R17
    0031 F021      BEQ	0x0036
    0032 95C8      LPM
    0033 9631      ADIW	R30,1
    0034 920D      ST	R0,X+
    0035 CFF9      RJMP	0x002F
    0036 D19F      RCALL	_main
_exit:
    0037 CFFF      RJMP	_exit
_key_t2:
  i                    --> R16
  z                    --> R18
  KEYIN                --> R16
  a                    --> R20
  c                    --> R22
    0038 D2C6      RCALL	push_gset2
FILE: C:\avr3\key.c
(0001) #include"sga.h"  
(0002) unsigned char key_t2(void)
(0003) {
(0004) 	static unsigned char   NK=0,
(0005)             			   PPK=111,
(0006) 			           KZT,
(0007)                                    YYK,
(0008)                                    NKEY_n,
(0009) 				   key_i=0;
(0010) 				   			  
(0011) 	unsigned char   a,c, KEYIN,z,i;
(0012)     z=0;
    0039 2722      CLR	R18
(0013) 	DDRC|=0X3E;//0011 1110 PC1,PC2,PC3,PC4,PC5设为输出
    003A B384      IN	R24,0x14
    003B 638E      ORI	R24,0x3E
    003C BB84      OUT	0x14,R24
(0014) 	PC5_1;PC4_1;PC3_1;   //PC3,PC4,PC5输出为1
    003D 9AAD      SBI	0x15,5
    003E 9AAC      SBI	0x15,4
    003F 9AAB      SBI	0x15,3
(0015) 	NOP();NOP();NOP();NOP();NOP();NOP();
    0040 0000      NOP
    0041 0000      NOP
    0042 0000      NOP
    0043 0000      NOP
    0044 0000      NOP
    0045 0000      NOP
(0016)     switch(key_i)
    0046 91000062  LDS	R16,key_i
    0048 2711      CLR	R17
    0049 3000      CPI	R16,0
    004A 0701      CPC	R16,R17
    004B F029      BEQ	0x0051
    004C 3001      CPI	R16,1
    004D E0E0      LDI	R30,0
    004E 071E      CPC	R17,R30
    004F F021      BEQ	0x0054
    0050 C007      RJMP	0x0058
(0017) 	{
(0018) 		case 0:PC2_1;PC1_0;  break;
    0051 9AAA      SBI	0x15,2
    0052 98A8      CBI	0x15,0
    0053 C004      RJMP	0x0058
(0019) 		case 1:PC2_0;PC1_1;  break; 
    0054 B385      IN	R24,0x15
    0055 7F8C      ANDI	R24,0xFC
    0056 BB85      OUT	0x15,R24
    0057 9AA9      SBI	0x15,1
(0020) 	}
(0021) 	key_i++;
    0058 91800062  LDS	R24,key_i
    005A 5F8F      SUBI	R24,0xFF
    005B 93800062  STS	key_i,R24
(0022) 	NOP();NOP();NOP();NOP();NOP();NOP();
    005D 0000      NOP
    005E 0000      NOP
    005F 0000      NOP
    0060 0000      NOP
    0061 0000      NOP
    0062 0000      NOP
(0023) 	if(key_i==2)	key_i=0;
    0063 3082      CPI	R24,2
    0064 F419      BNE	0x0068
    0065 2422      CLR	R2
    0066 92200062  STS	key_i,R2
(0024)       
(0025)      DDRC&=0XC7;//1100 0111
    0068 B384      IN	R24,0x14
    0069 7C87      ANDI	R24,0xC7
    006A BB84      OUT	0x14,R24
(0026) 	 i=PORTC;
    006B B305      IN	R16,0x15
(0027) 	 i=i&0x38;
    006C 7308      ANDI	R16,0x38
(0028) 	     if(i==0x18)//PC3,PC4,PC5中有一个为0
    006D 3108      CPI	R16,0x18
    006E F411      BNE	0x0071
(0029) 	{
(0030) 		a=3;
    006F E043      LDI	R20,3
(0031) 	}else
    0070 C009      RJMP	0x007A
(0032) 	     if(i==0x28)
    0071 3208      CPI	R16,0x28
    0072 F411      BNE	0x0075
(0033) 	{
(0034) 		a=4;
    0073 E044      LDI	R20,4
(0035) 	}else
    0074 C005      RJMP	0x007A
(0036) 		if(i==0x30)
    0075 3300      CPI	R16,0x30
    0076 F411      BNE	0x0079
(0037) 	{
(0038) 		a=5;
    0077 E045      LDI	R20,5
(0039) 	}else		 
    0078 C001      RJMP	0x007A
(0040) 	{		 
(0041) 		a=0;
    0079 2744      CLR	R20
(0042) 	}
(0043) 
(0044) 	a=a*10+key_i;
    007A E08A      LDI	R24,0xA
    007B 9F84      MUL	R24,R20
    007C 2D40      MOV	R20,R0
    007D 90200062  LDS	R2,key_i
    007F 0D42      ADD	R20,R2
(0045) 	if(a<20)
    0080 3144      CPI	R20,0x14
    0081 F4D8      BCC	0x009D
(0046) 	{
(0047) 		NKEY_n++;
    0082 9180006B  LDS	R24,NKEY_n
    0084 5F8F      SUBI	R24,0xFF
    0085 9380006B  STS	NKEY_n,R24
(0048)         if(NKEY_n==4)
    0087 3084      CPI	R24,4
    0088 F009      BEQ	0x008A
    0089 C080      RJMP	0x010A
(0049)         {
(0050) 
(0051)             NKEY_n=0;   z=1;
    008A 2422      CLR	R2
    008B 9220006B  STS	NKEY_n,R2
    008D E021      LDI	R18,1
(0052)             for(a=0;a!=14;a++)
    008E 2744      CLR	R20
    008F C009      RJMP	0x0099
(0053)             KKEY_n[a]=0;
    0090 E781      LDI	R24,0x71
    0091 E090      LDI	R25,0
    0092 2FE4      MOV	R30,R20
    0093 27FF      CLR	R31
    0094 0FE8      ADD	R30,R24
    0095 1FF9      ADC	R31,R25
    0096 2422      CLR	R2
    0097 8220      STD	Z+0,R2
    0098 9543      INC	R20
    0099 304E      CPI	R20,0xE
    009A F7A9      BNE	0x0090
(0054)             KEYIN=0;             //返回空按钮键值
    009B 2700      CLR	R16
(0055)         }
(0056) 	}else //A>20
    009C C06D      RJMP	0x010A
(0057)     {
(0058)         NKEY_n=0;
    009D 2422      CLR	R2
    009E 9220006B  STS	NKEY_n,R2
(0059)         switch(a)
    00A0 2F64      MOV	R22,R20
    00A1 2777      CLR	R23
    00A2 3268      CPI	R22,0x28
    00A3 E0E0      LDI	R30,0
    00A4 077E      CPC	R23,R30
    00A5 F169      BEQ	0x00D3
    00A6 3269      CPI	R22,0x29
    00A7 E0E0      LDI	R30,0
    00A8 077E      CPC	R23,R30
    00A9 F119      BEQ	0x00CD
    00AA E289      LDI	R24,0x29
    00AB E090      LDI	R25,0
    00AC 1786      CP	R24,R22
    00AD 0797      CPC	R25,R23
    00AE F04C      BLT	0x00B8
    00AF 316E      CPI	R22,0x1E
    00B0 E0E0      LDI	R30,0
    00B1 077E      CPC	R23,R30
    00B2 F0A1      BEQ	0x00C7
    00B3 316F      CPI	R22,0x1F
    00B4 E0E0      LDI	R30,0
    00B5 077E      CPC	R23,R30
    00B6 F051      BEQ	0x00C1
    00B7 C02C      RJMP	0x00E4
    00B8 3362      CPI	R22,0x32
    00B9 E0E0      LDI	R30,0
    00BA 077E      CPC	R23,R30
    00BB F119      BEQ	0x00DF
    00BC 3363      CPI	R22,0x33
    00BD E0E0      LDI	R30,0
    00BE 077E      CPC	R23,R30
    00BF F0C9      BEQ	0x00D9
    00C0 C023      RJMP	0x00E4
(0060)         {
(0061)             
(0062)             case 31:KKEY_n[3]++;break;  //UP    	4
    00C1 91800074  LDS	R24,KKEY_n+3
    00C3 5F8F      SUBI	R24,0xFF
    00C4 93800074  STS	KKEY_n+3,R24
    00C6 C01D      RJMP	0x00E4
(0063)             case 30:KKEY_n[8]++;break;  //KS3   	9 
    00C7 91800079  LDS	R24,0x79
    00C9 5F8F      SUBI	R24,0xFF
    00CA 93800079  STS	0x79,R24
    00CC C017      RJMP	0x00E4
(0064) 			
(0065)             case 41:KKEY_n[1]++;break; // ADD   	2
    00CD 91800072  LDS	R24,KKEY_n+1
    00CF 5F8F      SUBI	R24,0xFF
    00D0 93800072  STS	KKEY_n+1,R24
    00D2 C011      RJMP	0x00E4
(0066)             case 40:KKEY_n[0]++;break;  //BEGIN     1
    00D3 91800071  LDS	R24,KKEY_n
    00D5 5F8F      SUBI	R24,0xFF
    00D6 93800071  STS	KKEY_n,R24
    00D8 C00B      RJMP	0x00E4
(0067) 
(0068) 	   	    case 51:KKEY_n[12]++;break;  // X6	    13
    00D9 9180007D  LDS	R24,0x7D
    00DB 5F8F      SUBI	R24,0xFF
    00DC 9380007D  STS	0x7D,R24
    00DE C005      RJMP	0x00E4
(0069)             case 50:KKEY_n[6]++;break;	 // MUSIC  
    00DF 91800077  LDS	R24,0x77
    00E1 5F8F      SUBI	R24,0xFF
    00E2 93800077  STS	0x77,R24
(0070)  
(0071)         }
(0072)         for(a=0;a!=14;a++)
    00E4 2744      CLR	R20
    00E5 C01E      RJMP	0x0104
(0073)         {
(0074)             if(KKEY_n[a]==4)
    00E6 E781      LDI	R24,0x71
    00E7 E090      LDI	R25,0
    00E8 2FE4      MOV	R30,R20
    00E9 27FF      CLR	R31
    00EA 0FE8      ADD	R30,R24
    00EB 1FF9      ADC	R31,R25
    00EC 8180      LDD	R24,Z+0
    00ED 3084      CPI	R24,4
    00EE F4A1      BNE	0x0103
(0075)             {
(0076)                 KEYIN=a+1;  z=1;
    00EF 2F04      MOV	R16,R20
    00F0 5F0F      SUBI	R16,0xFF
    00F1 E021      LDI	R18,1
(0077)                 NKEY_n=0;
    00F2 2422      CLR	R2
    00F3 9220006B  STS	NKEY_n,R2
(0078)                 for(c=0;c!=14;c++)  KKEY_n[c]=0;
    00F5 2766      CLR	R22
    00F6 C009      RJMP	0x0100
    00F7 E781      LDI	R24,0x71
    00F8 E090      LDI	R25,0
    00F9 2FE6      MOV	R30,R22
    00FA 27FF      CLR	R31
    00FB 0FE8      ADD	R30,R24
    00FC 1FF9      ADC	R31,R25
    00FD 2422      CLR	R2
    00FE 8220      STD	Z+0,R2
    00FF 9563      INC	R22
    0100 306E      CPI	R22,0xE
    0101 F7A9      BNE	0x00F7
(0079)                 break;
    0102 C003      RJMP	0x0106
    0103 9543      INC	R20
    0104 304E      CPI	R20,0xE
    0105 F701      BNE	0x00E6
(0080)             }
(0081)         }
(0082)         if(a==14)   return(0);       //有按钮,但还没有获得有效按钮
    0106 304E      CPI	R20,0xE
    0107 F411      BNE	0x010A
    0108 2700      CLR	R16
    0109 C0CA      RJMP	0x01D4
(0083)     }
(0084) 
(0085)     if(z==0)    return(0);
    010A 2322      TST	R18
    010B F411      BNE	0x010E
    010C 2700      CLR	R16
    010D C0C6      RJMP	0x01D4
(0086) 
(0087) 
(0088)    if(KEYIN==0)            //没有按键时的处理
    010E 2300      TST	R16
    010F F561      BNE	0x013C
(0089) 	{
(0090) 
(0091) 		if((++NK)>2)
    0110 91800060  LDS	R24,NK
    0112 5F8F      SUBI	R24,0xFF
    0113 2E28      MOV	R2,R24
    0114 92200060  STS	NK,R2
    0116 E082      LDI	R24,2
    0117 1582      CP	R24,R2
    0118 F508      BCC	0x013A
(0092) 		{
(0093) 			NK=30;		//强制赋值为20;以防止不断累加溢出
    0119 E18E      LDI	R24,0x1E
    011A 93800060  STS	NK,R24
(0094) 			KEY=0;
    011C 2422      CLR	R2
    011D 92200070  STS	KEY,R2
(0095) //			YYK=0;
(0096) //			if(XIE_BEGIN==1)	SENG=JIANG=1;	//没有按键,停止升降
(0097) 			switch(PPK)
    011F 91200061  LDS	R18,PPK
    0121 2733      CLR	R19
    0122 3025      CPI	R18,5
    0123 E0E0      LDI	R30,0
    0124 073E      CPC	R19,R30
    0125 F009      BEQ	0x0127
    0126 C00D      RJMP	0x0134
(0098) 			{
(0099) 				case SET:
(0100) 					KEY=PPK;
    0127 90200061  LDS	R2,PPK
    0129 92200070  STS	KEY,R2
(0101) 					PPK=111;
    012B E68F      LDI	R24,0x6F
    012C 93800061  STS	PPK,R24
(0102) 					if(YYK<16)
    012E 9180006A  LDS	R24,YYK
    0130 3180      CPI	R24,0x10
    0131 F428      BCC	0x0137
(0103)                                         	return(1);//若连击时间小于2s则认为是单击
    0132 E001      LDI	R16,1
    0133 C0A0      RJMP	0x01D4
(0104) 					break;
(0105) 				default:PPK=111;
    0134 E68F      LDI	R24,0x6F
    0135 93800061  STS	PPK,R24
(0106) 			}
(0107)                         YYK=0;
    0137 2422      CLR	R2
    0138 9220006A  STS	YYK,R2
(0108) 		}
(0109) 		return(0);
    013A 2700      CLR	R16
    013B C098      RJMP	0x01D4
(0110) 	}
(0111) 	NK=0; 
    013C 2422      CLR	R2
    013D 92200060  STS	NK,R2
(0112) 
(0113) 	if(PPK!=KEYIN)
    013F 90200061  LDS	R2,PPK
    0141 1620      CP	R2,R16
    0142 F051      BEQ	0x014D
(0114) 	{
(0115) 	  PPK=KEYIN;
    0143 93000061  STS	PPK,R16
(0116) 	  YYK=0;
    0145 2422      CLR	R2
    0146 9220006A  STS	YYK,R2
(0117) 	  KZT=1;
    0148 E081      LDI	R24,1
    0149 93800069  STS	KZT,R24
(0118) 	  return(0);
    014B 2700      CLR	R16
    014C C087      RJMP	0x01D4
(0119) 	}
(0120) 	if(YYK==200) return(0);		//连续按住ok状态,不进行下面处理
    014D 9180006A  LDS	R24,YYK
    014F 3C88      CPI	R24,0xC8
    0150 F411      BNE	0x0153
    0151 2700      CLR	R16
    0152 C081      RJMP	0x01D4
(0121) 	++YYK;
    0153 9180006A  LDS	R24,YYK
    0155 5F8F      SUBI	R24,0xFF
    0156 9380006A  STS	YYK,R24
(0122) 	switch(KZT)
    0158 91000069  LDS	R16,KZT
    015A 2711      CLR	R17
    015B 3001      CPI	R16,1
    015C E0E0      LDI	R30,0
    015D 071E      CPC	R17,R30
    015E F059      BEQ	0x016A
    015F 3002      CPI	R16,2
    0160 E0E0      LDI	R30,0
    0161 071E      CPC	R17,R30
    0162 F409      BNE	0x0164
    0163 C048      RJMP	0x01AC
    0164 3003      CPI	R16,3
    0165 E0E0      LDI	R30,0
    0166 071E      CPC	R17,R30
    0167 F409      BNE	0x0169
    0168 C05B      RJMP	0x01C4
    0169 C069      RJMP	0x01D3
(0123) 	{
(0124) 	case 1:   if((PPK==SET && YYK>26))
    016A 91800061  LDS	R24,PPK
    016C 3085      CPI	R24,5
    016D F471      BNE	0x017C
    016E E18A      LDI	R24,0x1A
    016F 9020006A  LDS	R2,YYK
    0171 1582      CP	R24,R2
    0172 F448      BCC	0x017C
(0125) 			{
(0126) 				YYK=200;
    0173 EC88      LDI	R24,0xC8
    0174 9380006A  STS	YYK,R24
(0127) 				KEY=PPK;
    0176 90200061  LDS	R2,PPK
    0178 92200070  STS	KEY,R2
(0128) 				return(2);
    017A E002      LDI	R16,2
    017B C058      RJMP	0x01D4
(0129) 			}  
(0130)  
(0131) 		 if  (  PPK==BEGIN  || PPK==END    )//PPK==CLEAR ||
    017C 91800061  LDS	R24,PPK
    017E 3081      CPI	R24,1
    017F F011      BEQ	0x0182
    0180 3082      CPI	R24,2
    0181 F469      BNE	0x018F
(0132) 			     {
(0133) 					 if(YYK!=1) return(0);
    0182 9180006A  LDS	R24,YYK
    0184 3081      CPI	R24,1
    0185 F011      BEQ	0x0188
    0186 2700      CLR	R16
    0187 C04C      RJMP	0x01D4
(0134)                      NOP();
    0188 0000      NOP
(0135) 					KEY=PPK;
    0189 90200061  LDS	R2,PPK
    018B 92200070  STS	KEY,R2
(0136) 					return(1);
    018D E001      LDI	R16,1
    018E C045      RJMP	0x01D4
(0137) 			     }
(0138) ///			 ///
(0139) 			if(PPK==ADD || PPK==SUB  )	// +.-
    018F 91800061  LDS	R24,PPK
    0191 3083      CPI	R24,3
    0192 F011      BEQ	0x0195
    0193 3084      CPI	R24,4
    0194 F4A9      BNE	0x01AA
(0140) 			{
(0141) 				KEY=PPK;
    0195 90200061  LDS	R2,PPK
    0197 92200070  STS	KEY,R2

⌨️ 快捷键说明

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