📄 led.lst
字号:
__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 + -