📄 keyboard.s
字号:
ldi R24,1
sts L22,R24
.dbline 114
; break;
xjmp L26
L31:
.dbline 117
;
; case 0x12 : // Left SHIFT
; shift = 1;
ldi R24,1
sts L23,R24
.dbline 118
; break;
xjmp L26
L32:
.dbline 121
;
; case 0x59 : // Right SHIFT
; shift = 1;
ldi R24,1
sts L23,R24
.dbline 122
; break;
xjmp L26
L33:
.dbline 125
;
; case 0x05 : // F1
; if(mode == 0) mode = 1; // Enter scan code mode
lds R2,L24
tst R2
brne L34
.dbline 125
ldi R24,1
sts L24,R24
L34:
.dbline 126
; if(mode == 2) mode = 3; // Leave scan code mode
lds R24,L24
cpi R24,2
breq X3
xjmp L26
X3:
.dbline 126
ldi R24,3
sts L24,R24
.dbline 127
; break;
xjmp L26
L27:
.dbline 130
;
; default:
; if(mode == 0 || mode == 3) // If ASCII mode
lds R2,L24
tst R2
breq L40
mov R24,R2
cpi R24,3
breq X4
xjmp L38
X4:
L40:
.dbline 131
; {
.dbline 132
; if(!shift) // If shift is not pressed,
lds R2,L23
tst R2
brne L41
.dbline 133
; { // do a table look-up
.dbline 134
clr R22
xjmp L46
L43:
.dbline 134
L44:
.dbline 134
inc R22
L46:
.dbline 134
; for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);//???
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_unshifted
ldi R25,>_unshifted
add R30,R24
adc R31,R25
lpm R2,Z
clr R3
cp R2,R20
breq L47
tst R2
brne L43
L47:
.dbline 135
; if (unshifted[i][0] == sc) {
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_unshifted
ldi R25,>_unshifted
add R30,R24
adc R31,R25
lpm R30,Z
cp R30,R20
breq X5
xjmp L26
X5:
.dbline 135
.dbline 136
; put_kbbuff(unshifted[i][1]);
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_unshifted+1
ldi R25,>_unshifted+1
add R30,R24
adc R31,R25
lpm R16,Z
xcall _put_kbbuff
.dbline 137
; }
.dbline 138
xjmp L26
L41:
.dbline 138
; } else { // If shift is pressed
.dbline 139
clr R22
xjmp L54
L51:
.dbline 139
L52:
.dbline 139
inc R22
L54:
.dbline 139
; for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_shifted
ldi R25,>_shifted
add R30,R24
adc R31,R25
lpm R2,Z
clr R3
cp R2,R20
breq L55
tst R2
brne L51
L55:
.dbline 140
; if (shifted[i][0] == sc) {
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_shifted
ldi R25,>_shifted
add R30,R24
adc R31,R25
lpm R30,Z
cp R30,R20
breq X6
xjmp L26
X6:
.dbline 140
.dbline 141
; put_kbbuff(shifted[i][1]);
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_shifted+1
ldi R25,>_shifted+1
add R30,R24
adc R31,R25
lpm R16,Z
xcall _put_kbbuff
.dbline 142
; }
.dbline 143
; }
.dbline 144
xjmp L26
L38:
.dbline 144
; } else{ // Scan code mode
.dbline 145
; print_hexbyte(sc); // Print scan code
mov R16,R20
xcall _print_hexbyte
.dbline 146
; put_kbbuff(' ');
ldi R16,32
xcall _put_kbbuff
.dbline 148
;
; }
.dbline 149
; break;
.dbline 151
xjmp L26
L25:
.dbline 151
; }
; } else {
.dbline 152
; is_up = 0; // Two 0xF0 in a row not allowed
clr R2
sts L22,R2
.dbline 153
; switch (sc)
clr R21
cpi R20,18
ldi R30,0
cpc R21,R30
breq L65
ldi R24,18
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L74
L73:
cpi R20,5
ldi R30,0
cpc R21,R30
breq L67
cpi R20,6
ldi R30,0
cpc R21,R30
breq L63
xjmp L62
L74:
cpi R20,89
ldi R30,0
cpc R21,R30
breq L66
xjmp L62
X1:
.dbline 154
; {
L65:
.dbline 156
; case 0x12 : // Left SHIFT
; shift = 0;
clr R2
sts L23,R2
.dbline 157
; break;
xjmp L63
L66:
.dbline 160
;
; case 0x59 : // Right SHIFT
; shift = 0;
clr R2
sts L23,R2
.dbline 161
; break;
xjmp L63
L67:
.dbline 164
;
; case 0x05 : // F1
; if(mode == 1)
lds R24,L24
cpi R24,1
brne L68
.dbline 165
; mode = 2;
ldi R24,2
sts L24,R24
L68:
.dbline 166
; if(mode == 3)
lds R24,L24
cpi R24,3
brne L63
.dbline 167
; mode = 0;
clr R2
sts L24,R2
.dbline 168
; break;
.dbline 171
; case 0x06 : // F2
; // clr();
; break;
L62:
L63:
.dbline 174
L26:
.dbline -2
L21:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 22 c
.dbsym r sc 20 c
.dbend
.area vector(rom, abs)
.org 4
jmp _int0_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
L76:
.blkb 1
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
.dbfunc e int0_isr _int0_isr fV
.dbsym s data L76 c
.even
_int0_isr::
xcall push_lset
.dbline -1
.dbline 180
;
; }
; }
; }
;
;
; #pragma interrupt_handler int0_isr:iv_INT0
; void int0_isr(void)
; {
.dbline 184
; //external interupt on INT0
; static unsigned char data; // Holds the received scan code
;
; if(bitcount < 11 && bitcount > 2) // Bit 3 to 10 is data. Parity bit,
lds R24,_bitcount
cpi R24,11
brsh L77
ldi R24,2
lds R2,_bitcount
cp R24,R2
brsh L77
.dbline 185
; { // start and stop bits are ignored.
.dbline 186
; data = (data >> 1);
lds R2,L76
lsr R2
sts L76,R2
.dbline 187
; if(PIND & 8) //first receive lsb
sbis 0x10,3
rjmp L79
.dbline 188
; data = data | 0x80; // Store a '1'
mov R24,R2
ori R24,128
sts L76,R24
L79:
.dbline 189
; }
L77:
.dbline 191
lds R24,_bitcount
subi R24,1
mov R2,R24
sts _bitcount,R2
tst R24
brne L81
.dbline 192
.dbline 193
lds R16,L76
xcall _decode
.dbline 194
ldi R24,11
sts _bitcount,R24
.dbline 195
L81:
.dbline -2
L75:
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e delay_ms _delay_ms fV
; i -> R20,R21
; ms -> R16
.even
_delay_ms::
xcall push_gset1
.dbline -1
.dbline 201
;
; if(--bitcount == 0) // All bits received
; {
; decode(data);
; bitcount = 11;
; }
; }
;
;
;
; void delay_ms(unsigned char ms)
; {
xjmp L85
L84:
.dbline 204
ldi R20,11059
ldi R21,43
xjmp L90
L87:
.dbline 204
L88:
.dbline 204
subi R20,1
sbci R21,0
L90:
.dbline 204
clr R20
clr R21
clr R2
brne L87
L85:
.dbline 203
; unsigned int i;
; while(ms--)
mov R2,R16
clr R3
subi R16,1
tst R2
brne L84
.dbline -2
L83:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r ms 16 c
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 209
; for(i=11059;i=0;i--);
; }
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 211
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 212
; port_init();
xcall _port_init
.dbline 213
; InitKeyBoard();
xcall _InitKeyBoard
.dbline 215
;
; MCUCR = 0x02;
ldi R24,2
out 0x35,R24
.dbline 216
; GICR = 0x40;
ldi R24,64
out 0x3b,R24
.dbline 217
; TIMSK = 0x00; //timer interrupt sources
clr R2
out 0x39,R2
.dbline 218
; SEI(); //re-enable interrupts
sei
.dbline -2
L91:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; key -> R20
.even
_main::
.dbline -1
.dbline 228
; //all peripherals are now initialized
; }
;
; //#include <delay.h>
;
; //#include <lcd.h>
;
;
; void main(void)
; {
xjmp L94
L93:
.dbline 234
.dbline 235
xcall _getchar_kb
mov R20,R16
.dbline 237
ldi R16,5
xcall _delay_ms
.dbline 239
L94:
.dbline 233
xjmp L93
X7:
.dbline -2
L92:
.dbline 0 ; func end
ret
.dbsym r key 20 c
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
_buffcnt::
.blkb 1
.dbsym e buffcnt _buffcnt c
_outpt::
.blkb 2
.dbsym e outpt _outpt pc
_inpt::
.blkb 2
.dbsym e inpt _inpt pc
_kb_buffer::
.blkb 64
.dbsym e kb_buffer _kb_buffer A[64:64]c
_bitcount::
.blkb 1
.dbsym e bitcount _bitcount c
_edge::
.blkb 1
.dbsym e edge _edge c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -