📄 ps2kb_uart.s
字号:
L20:
L17:
L13:
.dbline -2
L11:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Decode _Decode fV
; TempCyc -> R22
; ScanCode -> R20
.even
_Decode::
xcall push_gset2
mov R20,R16
.dbline -1
.dbline 115
; }
;
; void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
; {
.dbline 118
; unsigned char TempCyc;
;
; if (!Key_UP) //当键盘松开时
lds R2,_Key_UP
tst R2
breq X2
xjmp L23
X2:
.dbline 119
; {
.dbline 120
; switch (ScanCode)
mov R22,R20
clr R23
cpi R22,89
ldi R30,0
cpc R23,R30
breq L30
ldi R24,89
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L50
L49:
cpi R22,18
ldi R30,0
cpc R23,R30
breq L29
xjmp L25
L50:
cpi R22,240
ldi R30,0
cpc R23,R30
breq L28
xjmp L25
X0:
.dbline 121
; {
L28:
.dbline 123
; case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
; Key_UP = 1;
ldi R24,1
sts _Key_UP,R24
.dbline 124
; break;
xjmp L24
L29:
.dbline 127
;
; case 0x12 : // 左 SHIFT
; Shift = 1;
ldi R24,1
sts _Shift,R24
.dbline 128
; break;
xjmp L24
L30:
.dbline 131
;
; case 0x59 : // 右 SHIFT
; Shift = 1;
ldi R24,1
sts _Shift,R24
.dbline 132
; break;
xjmp L24
L25:
.dbline 135
;
; default:
; if(!Shift) //如果SHIFT没按下
lds R2,_Shift
tst R2
brne L31
.dbline 136
; {
.dbline 137
clr R22
xjmp L36
L33:
.dbline 137
L34:
.dbline 137
inc R22
L36:
.dbline 137
; for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
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 L37
cpi R22,59
brlo L33
L37:
.dbline 138
; if (UnShifted[TempCyc][0] == ScanCode)
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 X3
xjmp L24
X3:
.dbline 139
; uart_transmit(UnShifted[TempCyc][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 _uart_transmit
.dbline 140
; }
xjmp L24
L31:
.dbline 142
; else //按下SHIFT
; {
.dbline 143
clr R22
xjmp L44
L41:
.dbline 143
L42:
.dbline 143
inc R22
L44:
.dbline 143
; for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
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 L45
cpi R22,59
brlo L41
L45:
.dbline 144
; if (Shifted[TempCyc][0] == ScanCode)
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
brne L24
.dbline 145
; uart_transmit(Shifted[TempCyc][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 _uart_transmit
.dbline 146
; }
.dbline 148
;
; break;
.dbline 150
; }
; }
xjmp L24
L23:
.dbline 152
; else
; {
.dbline 153
; Key_UP = 0;
clr R2
sts _Key_UP,R2
.dbline 154
; switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
clr R21
cpi R20,18
ldi R30,0
cpc R21,R30
breq L54
cpi R20,18
ldi R30,0
cpc R21,R30
brlt L51
L56:
cpi R20,89
ldi R30,0
cpc R21,R30
breq L55
xjmp L51
X1:
.dbline 155
; {
L54:
.dbline 157
; case 0x12 : // 左 SHIFT
; Shift = 0;
clr R2
sts _Shift,R2
.dbline 158
; break;
xjmp L52
L55:
.dbline 161
;
; case 0x59 : // 右 SHIFT
; Shift = 0;
clr R2
sts _Shift,R2
.dbline 162
; break;
L51:
L52:
.dbline 164
; }
; }
L24:
.dbline 165
; BF = 0; //标识字符处理完了
clr R2
sts _BF,R2
.dbline -2
L22:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r TempCyc 22 c
.dbsym r ScanCode 20 c
.dbend
.dbfunc e main _main fV
; i -> R20,R21
.even
_main::
.dbline -1
.dbline 170
; }
;
;
; void main(void)
; {
.dbline 172
; unsigned int i;
; CLI(); //disable all interrupts
cli
.dbline 173
; port_init();
xcall _port_init
.dbline 174
; UART_init();
xcall _UART_init
.dbline 175
; MCUCR = 0x08;
ldi R24,8
out 0x35,R24
.dbline 176
; GICR = 0x80;
ldi R24,128
out 0x3b,R24
.dbline 177
; SEI();
sei
.dbline 178
; for(i=0;i<60000;i++)//延时
clr R20
clr R21
xjmp L61
L58:
.dbline 179
L59:
.dbline 178
subi R20,255 ; offset = 1
sbci R21,255
L61:
.dbline 178
cpi R20,96
ldi R30,234
cpc R21,R30
brlo L58
.dbline 180
; ;
; uart_transmit('\n');
ldi R16,10
xcall _uart_transmit
.dbline 181
; uart_trans_str(" Welcome You!");
ldi R16,<L62
ldi R17,>L62
xcall _uart_trans_str
.dbline 182
; uart_transmit('\n');
ldi R16,10
xcall _uart_transmit
.dbline 183
; uart_trans_str(" You are the best!");
ldi R16,<L63
ldi R17,>L63
xcall _uart_trans_str
.dbline 184
; uart_transmit('\n');
ldi R16,10
xcall _uart_transmit
.dbline 185
; uart_trans_str(" EndyLu AVR 2.0");
ldi R16,<L64
ldi R17,>L64
xcall _uart_trans_str
.dbline 186
; uart_transmit('\n');
ldi R16,10
xcall _uart_transmit
.dbline 187
; uart_trans_str(" PS2 Keyboard test program 1.0");
ldi R16,<L65
ldi R17,>L65
xcall _uart_trans_str
.dbline 188
; uart_transmit('\n');
ldi R16,10
xcall _uart_transmit
.dbline 189
; uart_trans_str("Please input with keyboard:");
ldi R16,<L66
ldi R17,>L66
xcall _uart_trans_str
xjmp L68
L67:
.dbline 191
; while(1)
; {
.dbline 193
;
; if(flag ==1)
lds R24,_flag
cpi R24,1
brne L70
.dbline 194
; {
.dbline 196
; //uart_transmit(keycode); //发送未解码信息,了解原理时可用
; Decode(keycode); //键盘解码
lds R16,_keycode
xcall _Decode
.dbline 198
;
; keycode = 0;
clr R2
sts _keycode,R2
.dbline 200
;
; flag = 0;
sts _flag,R2
.dbline 201
; }
L70:
.dbline 202
L68:
.dbline 190
xjmp L67
X4:
.dbline -2
L57:
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbend
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.2\PS2KB_UART\PS2KB_UART.c
L66:
.blkb 28
.area idata
.byte 'P,'l,'e,'a,'s,'e,32,'i,'n,'p,'u,'t,32,'w,'i,'t
.byte 'h,32,'k,'e,'y,'b,'o,'a,'r,'d,58,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.2\PS2KB_UART\PS2KB_UART.c
L65:
.blkb 31
.area idata
.byte 32,'P,'S,50,32,'K,'e,'y,'b,'o,'a,'r,'d,32,'t,'e
.byte 's,'t,32,'p,'r,'o,'g,'r,'a,'m,32,49,46,48,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.2\PS2KB_UART\PS2KB_UART.c
L64:
.blkb 18
.area idata
.byte 32,32,32,'E,'n,'d,'y,'L,'u,32,'A,'V,'R,32,50,46
.byte 48,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.2\PS2KB_UART\PS2KB_UART.c
L63:
.blkb 22
.area idata
.byte 32,32,32,32,'Y,'o,'u,32,'a,'r,'e,32,'t,'h,'e,32
.byte 'b,'e,'s,'t,33,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.2\PS2KB_UART\PS2KB_UART.c
L62:
.blkb 18
.area idata
.byte 32,32,32,32,32,'W,'e,'l,'c,'o,'m,'e,32,'Y,'o,'u
.byte 33,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.2\PS2KB_UART\PS2KB_UART.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -