📄 keyboard.s
字号:
_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 + -