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

📄 keyboard.s

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 S
📖 第 1 页 / 共 2 页
字号:
_init_devices::
	.dbline -1
	.dbline 154
; }
; 
; //call this routine to initialise all peripherals
; void init_devices(void)
; {
	.dbline 156
; 	//stop errant interrupts until set up
; 	CLI(); //disable all interrupts
	cli
	.dbline 157
; 	port_init();
	xcall _port_init
	.dbline 158
; 	timer0_init(); 
	xcall _timer0_init
	.dbline 159
; 	uart0_init();
	xcall _uart0_init
	.dbline 162
; 	//watchdog_init();
;  
; 	MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 163
; 	GICR  = 0x00;
	out 0x3b,R2
	.dbline 164
; 	TIMSK = 0x01; //timer interrupt sources
	ldi R24,1
	out 0x39,R24
	.dbline 165
; 	SEI(); //re-enable interrupts
	sei
	.dbline -2
L73:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e send_num _send_num fV
;            num -> R20
;          index -> R22
	.even
_send_num::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 171
; 	//all peripherals are now initialised
; }
; 
; //显示
; void send_num( uchar index, uchar num )
; {
	.dbline 172
; 	PORTB = ~BIT( index ); 
	ldi R16,1
	mov R17,R22
	xcall lsl8
	mov R2,R16
	com R2
	out 0x18,R2
	.dbline 173
; 	if( index <= 7 ) { PORTA = num_table[num]; }
	ldi R24,7
	cp R24,R22
	brlo L75
	.dbline 173
	.dbline 173
	ldi R24,<_num_table
	ldi R25,>_num_table
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 173
	xjmp L76
L75:
	.dbline 174
; 	else { PORTA = num; }
	.dbline 174
	out 0x1b,R20
	.dbline 174
L76:
	.dbline 175
; 	delay( 1 );
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline -2
L74:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r num 20 c
	.dbsym r index 22 c
	.dbend
	.dbfunc e send_char _send_char fV
;             ch -> R20
;          index -> R22
	.even
_send_char::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 179
; }
; 
; void send_char( uchar index, uchar ch )
; {
	.dbline 180
; 	PORTB = ~BIT( index );
	ldi R16,1
	mov R17,R22
	xcall lsl8
	mov R2,R16
	com R2
	out 0x18,R2
	.dbline 181
; 	PORTA = ch;
	out 0x1b,R20
	.dbline 182
; 	delay(1);
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline -2
L77:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r ch 20 c
	.dbsym r index 22 c
	.dbend
	.dbfunc e display _display fV
	.even
_display::
	.dbline -1
	.dbline 186
; }
; 
; void display( void )
; {
	.dbline 187
;  	l_des_speed = ( rbuf[2] << 8 ) + rbuf[1];
	lds R2,_rbuf+1
	lds R3,_rbuf+2
	sts _l_des_speed+1,R3
	sts _l_des_speed,R2
	.dbline 188
;  	r_des_speed = ( rbuf[5] << 8 ) + rbuf[4];
	lds R2,_rbuf+4
	lds R3,_rbuf+5
	sts _r_des_speed+1,R3
	sts _r_des_speed,R2
	.dbline 189
;  	if ( rbuf[0] == 1 ){
	lds R24,_rbuf
	cpi R24,1
	brne L83
	.dbline 189
	.dbline 190
; 		send_char( 7, 0x40 );	//显示'-'
	ldi R18,64
	ldi R16,7
	xcall _send_char
	.dbline 191
; 	}
L83:
	.dbline 192
; 	if ( ( l_des_speed > 99 ) && ( l_des_speed < 999 ) ){
	ldi R24,99
	ldi R25,0
	lds R2,_l_des_speed
	lds R3,_l_des_speed+1
	cp R24,R2
	cpc R25,R3
	brsh L85
	movw R24,R2
	cpi R24,231
	ldi R30,3
	cpc R25,R30
	brsh L85
	.dbline 192
	.dbline 193
; 		send_num( 6, l_des_speed / 100 % 10 );
	ldi R18,100
	ldi R19,0
	movw R16,R24
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	mov R18,R16
	ldi R16,6
	xcall _send_num
	.dbline 194
; 	}
L85:
	.dbline 195
; 	send_num( 5, (l_des_speed / 10) % 10 );
	ldi R18,10
	ldi R19,0
	lds R16,_l_des_speed
	lds R17,_l_des_speed+1
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	mov R18,R16
	ldi R16,5
	xcall _send_num
	.dbline 196
; 	send_num( 4, l_des_speed % 10 );
	ldi R18,10
	ldi R19,0
	lds R16,_l_des_speed
	lds R17,_l_des_speed+1
	xcall mod16u
	mov R18,R16
	ldi R16,4
	xcall _send_num
	.dbline 197
; 	if ( rbuf[3] == 1 ){
	lds R24,_rbuf+3
	cpi R24,1
	brne L87
	.dbline 197
	.dbline 198
; 		send_char( 3, 0x40 );	//显示'-'
	ldi R18,64
	ldi R16,3
	xcall _send_char
	.dbline 199
; 	}
L87:
	.dbline 200
; 	if ( ( r_des_speed > 99 ) && ( r_des_speed < 999 ) ){
	ldi R24,99
	ldi R25,0
	lds R2,_r_des_speed
	lds R3,_r_des_speed+1
	cp R24,R2
	cpc R25,R3
	brsh L90
	movw R24,R2
	cpi R24,231
	ldi R30,3
	cpc R25,R30
	brsh L90
	.dbline 200
	.dbline 201
; 		send_num( 2, r_des_speed / 100 % 10 );
	ldi R18,100
	ldi R19,0
	movw R16,R24
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	mov R18,R16
	ldi R16,2
	xcall _send_num
	.dbline 202
; 	}
L90:
	.dbline 203
; 	send_num( 1, (r_des_speed / 10) % 10 );
	ldi R18,10
	ldi R19,0
	lds R16,_r_des_speed
	lds R17,_r_des_speed+1
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	mov R18,R16
	ldi R16,1
	xcall _send_num
	.dbline 204
; 	send_num( 0, r_des_speed % 10 );
	ldi R18,10
	ldi R19,0
	lds R16,_r_des_speed
	lds R17,_r_des_speed+1
	xcall mod16u
	mov R18,R16
	clr R16
	xcall _send_num
	.dbline -2
L78:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e reset_ctrl _reset_ctrl fV
;              i -> R16
	.even
_reset_ctrl::
	.dbline -1
	.dbline 208
; }
; 
; void reset_ctrl( void )
; {
	.dbline 210
	clr R16
	xjmp L96
L93:
	.dbline 210
	.dbline 211
	ldi R24,<_rbuf
	ldi R25,>_rbuf
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 212
	ldi R24,<_tbuf
	ldi R25,>_tbuf
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 213
L94:
	.dbline 210
	inc R16
L96:
	.dbline 210
; 	uchar i;
; 	for( i = 0; i < SCOM_BUF_LEN; i ++ ){
	cpi R16,10
	brlo L93
	.dbline 214
; 		rbuf[i] = 0;
; 		tbuf[i] = 0;
; 	}
; 	scom_counter = 0;
	clr R2
	clr R3
	sts _scom_counter+1,R3
	sts _scom_counter,R2
	.dbline 215
; 	delay_counter = 0;
	sts _delay_counter+1,R3
	sts _delay_counter,R2
	.dbline 216
; 	key_counter = 0;
	sts _key_counter+1,R3
	sts _key_counter,R2
	.dbline 217
; 	l_des_speed = 0;
	sts _l_des_speed+1,R3
	sts _l_des_speed,R2
	.dbline 218
; 	r_des_speed = 0;
	sts _r_des_speed+1,R3
	sts _r_des_speed,R2
	.dbline 219
; 	key_buf = 0;
	sts _key_buf+1,R3
	sts _key_buf,R2
	.dbline 220
	sts _delay_counter+1,R3
	sts _delay_counter,R2
	xjmp L100
L97:
	.dbline 220
	.dbline 221
	ldi R24,255
	out 0x1b,R24
	.dbline 222
	in R2,0x18
	lsl R2
	out 0x18,R2
	.dbline 223
	wdr
	.dbline 224
L98:
	.dbline 220
L100:
	.dbline 220
; 	for( delay_counter = 0; delay_counter < 500; ){
	lds R24,_delay_counter
	lds R25,_delay_counter+1
	cpi R24,244
	ldi R30,1
	cpc R25,R30
	brlo L97
	.dbline 225
; 		PORTA = 0xFF;
; 		PORTB <<= BIT(0);
; 		WDR();
; 	}
; 	PORTA = 0x00;
	clr R2
	out 0x1b,R2
	.dbline -2
L92:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e main _main fV
;              i -> R20
	.even
_main::
	sbiw R28,3
	.dbline -1
	.dbline 229
; }
; //
; void main(void)
; {
	.dbline 231
;  	uchar i;
; 	init_devices();
	xcall _init_devices
	.dbline 232
; 	reset_ctrl();
	xcall _reset_ctrl
L102:
	.dbline 234
; 	
; 	do{
	.dbline 235
; 		if ( !( PIND & BIT(PD2) ) ){		//键盘扫描
	sbic 0x10,2
	rjmp L105
	.dbline 235
	.dbline 236
; 			display();
	xcall _display
	.dbline 237
; 			display();
	xcall _display
	.dbline 238
; 			display();
	xcall _display
	.dbline 239
; 			if( !( PIND & BIT(PD2) ) ){
	sbic 0x10,2
	rjmp L107
	.dbline 239
	.dbline 240
; 				key_buf = scan_key();
	xcall _scan_key
	sts _key_buf+1,R17
	sts _key_buf,R16
	.dbline 241
; 				tbuf[0] = (uchar)( key_buf & 0x00FF );
	movw R24,R16
	andi R25,0
	sts _tbuf,R24
	.dbline 242
; 				tbuf[1] = (uchar)( key_buf >> 8 );
	movw R2,R16
	mov R2,R3
	clr R3
	sts _tbuf+1,R2
	.dbline 243
; 				master( 0x01, tbuf, 0, 2 );
	ldi R24,2
	std y+2,R24
	clr R2
	std y+0,R2
	ldi R18,<_tbuf
	ldi R19,>_tbuf
	ldi R16,1
	xcall _master
	.dbline 244
; 				key_counter = 0;
	clr R2
	clr R3
	sts _key_counter+1,R3
	sts _key_counter,R2
	xjmp L111
L110:
	.dbline 245
; 				while( !( PIND & BIT(PD2) ) ){
	.dbline 246
; 					display();
	xcall _display
	.dbline 247
; 					if ( key_counter > 9 ) break;
	ldi R24,9
	ldi R25,0
	lds R2,_key_counter
	lds R3,_key_counter+1
	cp R24,R2
	cpc R25,R3
	brsh L113
	.dbline 247
	xjmp L112
L113:
	.dbline 248
	wdr
	.dbline 249
L111:
	.dbline 245
	sbis 0x10,2
	rjmp L110
L112:
	.dbline 250
; 					WDR();
; 				}
; 			}
L107:
	.dbline 251
; 		}
L105:
	.dbline 252
	clr R20
	xjmp L118
L115:
	.dbline 252
; 		for ( i = 0; i < 16; i ++){
	.dbline 253
; 			if ( key_buf & BIT(i) ){
	mov R18,R20
	clr R19
	ldi R16,1
	ldi R17,0
	xcall lsl16
	lds R2,_key_buf
	lds R3,_key_buf+1
	and R2,R16
	and R3,R17
	tst R2
	brne X3
	tst R3
	breq L119
X3:
	.dbline 253
	.dbline 254
; 				rbuf[4] = i + 1;
	mov R24,R20
	subi R24,255    ; addi 1
	sts _rbuf+4,R24
	.dbline 255
; 				break;
	xjmp L117
L119:
	.dbline 257
L116:
	.dbline 252
	inc R20
L118:
	.dbline 252
	cpi R20,16
	brlo L115
L117:
	.dbline 264
; 			}
; 		}
; 		/*
; 		if ( sys_flag & BIT( SCOM_EN ) ){	//更新显示缓存
; 			master( 0x02, rbuf, 0, 6 );
; 			scom_counter = 0;
; 		}
; 		*/
; 		WDR();								//复位看门狗
	wdr
	.dbline 265
; 		display();							//显示
	xcall _display
	.dbline 266
L103:
	.dbline 266
	xjmp L102
X4:
	.dbline -2
L101:
	adiw R28,3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\AVRATM~1\key_board\keyboard.c
_key_buf::
	.blkb 2
	.dbsym e key_buf _key_buf i
_r_des_speed::
	.blkb 2
	.dbsym e r_des_speed _r_des_speed i
_l_des_speed::
	.blkb 2
	.dbsym e l_des_speed _l_des_speed i
_rbuf::
	.blkb 10
	.dbsym e rbuf _rbuf A[10:10]c
_tbuf::
	.blkb 10
	.dbsym e tbuf _tbuf A[10:10]c
_key_counter::
	.blkb 2
	.dbsym e key_counter _key_counter i
_scom_counter::
	.blkb 2
	.dbsym e scom_counter _scom_counter i
_delay_counter::
	.blkb 2
	.dbsym e delay_counter _delay_counter i

⌨️ 快捷键说明

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