📄 keyboard.lst
字号:
0153 940E02E4 CALL lsl8
0155 2E20 MOV R2,R16
0156 9420 COM R2
0157 BA28 OUT 0x18,R2
(0173) if( index <= 7 ) { PORTA = num_table[num]; }
0158 E087 LDI R24,7
0159 1786 CP R24,R22
015A F048 BCS 0x0164
015B E688 LDI R24,0x68
015C E090 LDI R25,0
015D 2FE4 MOV R30,R20
015E 27FF CLR R31
015F 0FE8 ADD R30,R24
0160 1FF9 ADC R31,R25
0161 91E4 LPM R30,0(Z)
0162 BBEB OUT 0x1B,R30
0163 C001 RJMP 0x0165
(0174) else { PORTA = num; }
0164 BB4B OUT 0x1B,R20
(0175) delay( 1 );
0165 E001 LDI R16,1
0166 E010 LDI R17,0
0167 DEF3 RCALL _delay
0168 940E02B8 CALL pop_gset2
016A 9508 RET
_send_char:
ch --> R20
index --> R22
016B 940E02D5 CALL push_gset2
016D 2F42 MOV R20,R18
016E 2F60 MOV R22,R16
(0176) }
(0177)
(0178) void send_char( uchar index, uchar ch )
(0179) {
(0180) PORTB = ~BIT( index );
016F E001 LDI R16,1
0170 2F16 MOV R17,R22
0171 940E02E4 CALL lsl8
0173 2E20 MOV R2,R16
0174 9420 COM R2
0175 BA28 OUT 0x18,R2
(0181) PORTA = ch;
0176 BB4B OUT 0x1B,R20
(0182) delay(1);
0177 E001 LDI R16,1
0178 E010 LDI R17,0
0179 DEE1 RCALL _delay
017A 940E02B8 CALL pop_gset2
017C 9508 RET
(0183) }
(0184)
(0185) void display( void )
(0186) {
(0187) l_des_speed = ( rbuf[2] << 8 ) + rbuf[1];
_display:
017D 90200107 LDS R2,rbuf+1
017F 90300108 LDS R3,rbuf+2
0181 92300105 STS l_des_speed+1,R3
0183 92200104 STS l_des_speed,R2
(0188) r_des_speed = ( rbuf[5] << 8 ) + rbuf[4];
0185 9020010A LDS R2,0x10A
0187 9030010B LDS R3,0x10B
0189 92300103 STS r_des_speed+1,R3
018B 92200102 STS r_des_speed,R2
(0189) if ( rbuf[0] == 1 ){
018D 91800106 LDS R24,rbuf
018F 3081 CPI R24,1
0190 F419 BNE 0x0194
(0190) send_char( 7, 0x40 ); //显示'-'
0191 E420 LDI R18,0x40
0192 E007 LDI R16,7
0193 DFD7 RCALL _send_char
(0191) }
(0192) if ( ( l_des_speed > 99 ) && ( l_des_speed < 999 ) ){
0194 E683 LDI R24,0x63
0195 E090 LDI R25,0
0196 90200104 LDS R2,l_des_speed
0198 90300105 LDS R3,l_des_speed+1
019A 1582 CP R24,R2
019B 0593 CPC R25,R3
019C F488 BCC 0x01AE
019D 01C1 MOVW R24,R2
019E 3E87 CPI R24,0xE7
019F E0E3 LDI R30,3
01A0 079E CPC R25,R30
01A1 F460 BCC 0x01AE
(0193) send_num( 6, l_des_speed / 100 % 10 );
01A2 E624 LDI R18,0x64
01A3 E030 LDI R19,0
01A4 018C MOVW R16,R24
01A5 940E029E CALL div16u
01A7 E02A LDI R18,0xA
01A8 E030 LDI R19,0
01A9 940E029C CALL mod16u
01AB 2F20 MOV R18,R16
01AC E006 LDI R16,6
01AD DF9F RCALL _send_num
(0194) }
(0195) send_num( 5, (l_des_speed / 10) % 10 );
01AE E02A LDI R18,0xA
01AF E030 LDI R19,0
01B0 91000104 LDS R16,l_des_speed
01B2 91100105 LDS R17,l_des_speed+1
01B4 940E029E CALL div16u
01B6 E02A LDI R18,0xA
01B7 E030 LDI R19,0
01B8 940E029C CALL mod16u
01BA 2F20 MOV R18,R16
01BB E005 LDI R16,5
01BC DF90 RCALL _send_num
(0196) send_num( 4, l_des_speed % 10 );
01BD E02A LDI R18,0xA
01BE E030 LDI R19,0
01BF 91000104 LDS R16,l_des_speed
01C1 91100105 LDS R17,l_des_speed+1
01C3 940E029C CALL mod16u
01C5 2F20 MOV R18,R16
01C6 E004 LDI R16,4
01C7 DF85 RCALL _send_num
(0197) if ( rbuf[3] == 1 ){
01C8 91800109 LDS R24,rbuf+3
01CA 3081 CPI R24,1
01CB F419 BNE 0x01CF
(0198) send_char( 3, 0x40 ); //显示'-'
01CC E420 LDI R18,0x40
01CD E003 LDI R16,3
01CE DF9C RCALL _send_char
(0199) }
(0200) if ( ( r_des_speed > 99 ) && ( r_des_speed < 999 ) ){
01CF E683 LDI R24,0x63
01D0 E090 LDI R25,0
01D1 90200102 LDS R2,r_des_speed
01D3 90300103 LDS R3,r_des_speed+1
01D5 1582 CP R24,R2
01D6 0593 CPC R25,R3
01D7 F488 BCC 0x01E9
01D8 01C1 MOVW R24,R2
01D9 3E87 CPI R24,0xE7
01DA E0E3 LDI R30,3
01DB 079E CPC R25,R30
01DC F460 BCC 0x01E9
(0201) send_num( 2, r_des_speed / 100 % 10 );
01DD E624 LDI R18,0x64
01DE E030 LDI R19,0
01DF 018C MOVW R16,R24
01E0 940E029E CALL div16u
01E2 E02A LDI R18,0xA
01E3 E030 LDI R19,0
01E4 940E029C CALL mod16u
01E6 2F20 MOV R18,R16
01E7 E002 LDI R16,2
01E8 DF64 RCALL _send_num
(0202) }
(0203) send_num( 1, (r_des_speed / 10) % 10 );
01E9 E02A LDI R18,0xA
01EA E030 LDI R19,0
01EB 91000102 LDS R16,r_des_speed
01ED 91100103 LDS R17,r_des_speed+1
01EF 940E029E CALL div16u
01F1 E02A LDI R18,0xA
01F2 E030 LDI R19,0
01F3 940E029C CALL mod16u
01F5 2F20 MOV R18,R16
01F6 E001 LDI R16,1
01F7 DF55 RCALL _send_num
(0204) send_num( 0, r_des_speed % 10 );
01F8 E02A LDI R18,0xA
01F9 E030 LDI R19,0
01FA 91000102 LDS R16,r_des_speed
01FC 91100103 LDS R17,r_des_speed+1
01FE 940E029C CALL mod16u
0200 2F20 MOV R18,R16
0201 2700 CLR R16
0202 DF4A RCALL _send_num
0203 9508 RET
(0205) }
(0206)
(0207) void reset_ctrl( void )
(0208) {
(0209) uchar i;
(0210) for( i = 0; i < SCOM_BUF_LEN; i ++ ){
_reset_ctrl:
i --> R16
0204 2700 CLR R16
0205 C010 RJMP 0x0216
(0211) rbuf[i] = 0;
0206 E086 LDI R24,6
0207 E091 LDI R25,1
0208 2FE0 MOV R30,R16
0209 27FF CLR R31
020A 0FE8 ADD R30,R24
020B 1FF9 ADC R31,R25
020C 2422 CLR R2
020D 8220 STD Z+0,R2
(0212) tbuf[i] = 0;
020E E180 LDI R24,0x10
020F E091 LDI R25,1
0210 2FE0 MOV R30,R16
0211 27FF CLR R31
0212 0FE8 ADD R30,R24
0213 1FF9 ADC R31,R25
0214 8220 STD Z+0,R2
0215 9503 INC R16
0216 300A CPI R16,0xA
0217 F370 BCS 0x0206
(0213) }
(0214) scom_counter = 0;
0218 2422 CLR R2
0219 2433 CLR R3
021A 9230011D STS scom_counter+1,R3
021C 9220011C STS scom_counter,R2
(0215) delay_counter = 0;
021E 9230011F STS delay_counter+1,R3
0220 9220011E STS delay_counter,R2
(0216) key_counter = 0;
0222 9230011B STS key_counter+1,R3
0224 9220011A STS key_counter,R2
(0217) l_des_speed = 0;
0226 92300105 STS l_des_speed+1,R3
0228 92200104 STS l_des_speed,R2
(0218) r_des_speed = 0;
022A 92300103 STS r_des_speed+1,R3
022C 92200102 STS r_des_speed,R2
(0219) key_buf = 0;
022E 92300101 STS key_buf+1,R3
0230 92200100 STS key_buf,R2
(0220) for( delay_counter = 0; delay_counter < 500; ){
0232 9230011F STS delay_counter+1,R3
0234 9220011E STS delay_counter,R2
0236 C006 RJMP 0x023D
(0221) PORTA = 0xFF;
0237 EF8F LDI R24,0xFF
0238 BB8B OUT 0x1B,R24
(0222) PORTB <<= BIT(0);
0239 B228 IN R2,0x18
023A 0C22 LSL R2
023B BA28 OUT 0x18,R2
(0223) WDR();
023C 95A8 WDR
023D 9180011E LDS R24,delay_counter
023F 9190011F LDS R25,delay_counter+1
0241 3F84 CPI R24,0xF4
0242 E0E1 LDI R30,1
0243 079E CPC R25,R30
0244 F390 BCS 0x0237
(0224) }
(0225) PORTA = 0x00;
0245 2422 CLR R2
0246 BA2B OUT 0x1B,R2
0247 9508 RET
_main:
i --> R20
0248 9723 SBIW R28,3
(0226) }
(0227) //
(0228) void main(void)
(0229) {
(0230) uchar i;
(0231) init_devices();
0249 DEF8 RCALL _init_devices
(0232) reset_ctrl();
024A DFB9 RCALL _reset_ctrl
(0233)
(0234) do{
(0235) if ( !( PIND & BIT(PD2) ) ){ //键盘扫描
024B 9982 SBIC 0x10,2
024C C030 RJMP 0x027D
(0236) display();
024D DF2F RCALL _display
(0237) display();
024E DF2E RCALL _display
(0238) display();
024F DF2D RCALL _display
(0239) if( !( PIND & BIT(PD2) ) ){
0250 9982 SBIC 0x10,2
0251 C02B RJMP 0x027D
(0240) key_buf = scan_key();
0252 DE18 RCALL _scan_key
0253 93100101 STS key_buf+1,R17
0255 93000100 STS key_buf,R16
(0241) tbuf[0] = (uchar)( key_buf & 0x00FF );
0257 01C8 MOVW R24,R16
0258 7090 ANDI R25,0
0259 93800110 STS tbuf,R24
(0242) tbuf[1] = (uchar)( key_buf >> 8 );
025B 0118 MOVW R2,R16
025C 2C23 MOV R2,R3
025D 2433 CLR R3
025E 92200111 STS tbuf+1,R2
(0243) master( 0x01, tbuf, 0, 2 );
0260 E082 LDI R24,2
0261 838A STD Y+2,R24
0262 2422 CLR R2
0263 8228 STD Y+0,R2
0264 E120 LDI R18,0x10
0265 E031 LDI R19,1
0266 E001 LDI R16,1
0267 DE55 RCALL _master
(0244) key_counter = 0;
0268 2422 CLR R2
0269 2433 CLR R3
026A 9230011B STS key_counter+1,R3
026C 9220011A STS key_counter,R2
026E C00C RJMP 0x027B
(0245) while( !( PIND & BIT(PD2) ) ){
(0246) display();
026F DF0D RCALL _display
(0247) if ( key_counter > 9 ) break;
0270 E089 LDI R24,0x9
0271 E090 LDI R25,0
0272 9020011A LDS R2,key_counter
0274 9030011B LDS R3,key_counter+1
0276 1582 CP R24,R2
0277 0593 CPC R25,R3
0278 F408 BCC 0x027A
0279 C003 RJMP 0x027D
(0248) WDR();
027A 95A8 WDR
027B 9B82 SBIS 0x10,2
027C CFF2 RJMP 0x026F
(0249) }
(0250) }
(0251) }
(0252) for ( i = 0; i < 16; i ++){
027D 2744 CLR R20
027E C016 RJMP 0x0295
(0253) if ( key_buf & BIT(i) ){
027F 2F24 MOV R18,R20
0280 2733 CLR R19
0281 E001 LDI R16,1
0282 E010 LDI R17,0
0283 940E02DD CALL lsl16
0285 90200100 LDS R2,key_buf
0287 90300101 LDS R3,key_buf+1
0289 2220 AND R2,R16
028A 2231 AND R3,R17
028B 2022 TST R2
028C F411 BNE 0x028F
028D 2033 TST R3
028E F029 BEQ 0x0294
(0254) rbuf[4] = i + 1;
028F 2F84 MOV R24,R20
0290 5F8F SUBI R24,0xFF
0291 9380010A STS 0x10A,R24
(0255) break;
0293 C003 RJMP 0x0297
0294 9543 INC R20
0295 3140 CPI R20,0x10
0296 F340 BCS 0x027F
(0256) }
(0257) }
(0258) /*
(0259) if ( sys_flag & BIT( SCOM_EN ) ){ //更新显示缓存
(0260) master( 0x02, rbuf, 0, 6 );
(0261) scom_counter = 0;
(0262) }
(0263) */
(0264) WDR(); //复位看门狗
0297 95A8 WDR
(0265) display(); //显示
0298 DEE4 RCALL _display
(0266) }while( 1 );
FILE: <library>
0299 CFB1 RJMP 0x024B
029A 9623 ADIW R28,3
029B 9508 RET
mod16u:
029C 9468 BSET 6
029D C001 RJMP xdiv16u
div16u:
029E 94E8 BCLR 6
xdiv16u:
029F 92EA ST R14,-Y
02A0 92FA ST R15,-Y
02A1 938A ST R24,-Y
02A2 24EE CLR R14
02A3 24FF CLR R15
02A4 E180 LDI R24,0x10
02A5 0F00 LSL R16
02A6 1F11 ROL R17
02A7 1CEE ROL R14
02A8 1CFF ROL R15
02A9 16E2 CP R14,R18
02AA 06F3 CPC R15,R19
02AB F018 BCS 0x02AF
02AC 1AE2 SUB R14,R18
02AD 0AF3 SBC R15,R19
02AE 9503 INC R16
02AF 958A DEC R24
02B0 F7A1 BNE 0x02A5
02B1 F416 BRTC 0x02B4
02B2 2D0E MOV R16,R14
02B3 2D1F MOV R17,R15
02B4 9189 LD R24,Y+
02B5 90F9 LD R15,Y+
02B6 90E9 LD R14,Y+
02B7 9508 RET
pop_gset2:
02B8 E0E2 LDI R30,2
02B9 940C02C2 JMP pop
pop_gset3:
02BB E0E4 LDI R30,4
02BC 940C02C2 JMP pop
push_gset1:
02BE 935A ST R21,-Y
02BF 934A ST R20,-Y
02C0 9508 RET
pop_gset1:
02C1 E0E1 LDI R30,1
pop:
02C2 9149 LD R20,Y+
02C3 9159 LD R21,Y+
02C4 FDE0 SBRC R30,0
02C5 9508 RET
02C6 9169 LD R22,Y+
02C7 9179 LD R23,Y+
02C8 FDE1 SBRC R30,1
02C9 9508 RET
02CA 90A9 LD R10,Y+
02CB 90B9 LD R11,Y+
02CC FDE2 SBRC R30,2
02CD 9508 RET
02CE 90C9 LD R12,Y+
02CF 90D9 LD R13,Y+
02D0 FDE3 SBRC R30,3
02D1 9508 RET
02D2 90E9 LD R14,Y+
02D3 90F9 LD R15,Y+
02D4 9508 RET
push_gset2:
02D5 937A ST R23,-Y
02D6 936A ST R22,-Y
02D7 940C02BE JMP push_gset1
push_gset3:
02D9 92BA ST R11,-Y
02DA 92AA ST R10,-Y
02DB 940C02D5 JMP push_gset2
lsl16:
02DD 2322 TST R18
02DE F021 BEQ 0x02E3
02DF 0F00 LSL R16
02E0 1F11 ROL R17
02E1 952A DEC R18
02E2 CFFA RJMP lsl16
02E3 9508 RET
lsl8:
02E4 2311 TST R17
02E5 F019 BEQ 0x02E9
02E6 0F00 LSL R16
02E7 951A DEC R17
02E8 CFFB RJMP lsl8
02E9 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -