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

📄 keyboard.lst

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 LST
📖 第 1 页 / 共 2 页
字号:
    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 + -