📄 ps2key.s
字号:
.module PS2KEY.C
.area text(rom, con, rel)
.dbfile E:\zh\avr\8515板\PS2KEY~1\PS2KEY.C
.dbfunc e data _data fV
; num -> R16
.even
_data::
.dbline -1
.dbline 9
; //ps2 keyboard
; //clk=pd2,dat=pb3
; #include<io8515v.h>
; #include<macros.h>
; #define uchar unsigned char
; #define uint unsigned int
; unsigned char KeyCode; //键盘键值
; void data()
; {
.dbline 11
; uchar num; //位数
; DDRD=0X00;
clr R2
out 0x11,R2
L2:
.dbline 12
L3:
.dbline 12
; while((PIND|0XFB)==0XFF); // 等待键盘把时钟第一次拉低
in R24,0x10
ori R24,251
cpi R24,255
breq L2
.dbline 13
; for(num=8;num!=0;num--) // 把起始位算入
ldi R16,8
rjmp L8
L5:
.dbline 14
; {DDRD=0X00;
.dbline 14
clr R2
out 0x11,R2
L9:
.dbline 15
L10:
.dbline 15
; while((PIND|0XFB)!=0XFF); // 等待一个有效的下跳沿
in R24,0x10
ori R24,251
cpi R24,255
brne L9
L12:
.dbline 16
L13:
.dbline 16
; while((PIND|0XFB)==0XFF);
in R24,0x10
ori R24,251
cpi R24,255
breq L12
.dbline 17
; KeyCode>>=1; // 按照PS2格式,数据低位在前
lds R2,_KeyCode
lsr R2
sts _KeyCode,R2
.dbline 18
; if((PINB|0XF7)==0XFF)
in R24,0x16
ori R24,247
cpi R24,255
brne L15
.dbline 19
; {
.dbline 20
; KeyCode|=0x80; // 得到有效的数据位
mov R24,R2
ori R24,128
sts _KeyCode,R24
.dbline 21
; }
L15:
.dbline 22
L6:
.dbline 13
dec R16
L8:
.dbline 13
tst R16
brne L5
.dbline 23
; }
; DDRD=0X00;
clr R2
out 0x11,R2
L17:
.dbline 24
L18:
.dbline 24
; while((PIND|0XFB)!=0XFF);
in R24,0x10
ori R24,251
cpi R24,255
brne L17
L20:
.dbline 25
L21:
.dbline 25
; while((PIND|0XFB)==0XFF);
in R24,0x10
ori R24,251
cpi R24,255
breq L20
L23:
.dbline 26
L24:
.dbline 26
; while((PIND|0XFB)!=0XFF);
in R24,0x10
ori R24,251
cpi R24,255
brne L23
L26:
.dbline 27
L27:
.dbline 27
; while((PIND|0XFB)==0XFF);
in R24,0x10
ori R24,251
cpi R24,255
breq L26
L29:
.dbline 28
L30:
.dbline 28
; while((PIND|0XFB)!=0XFF);
in R24,0x10
ori R24,251
cpi R24,255
brne L29
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r num 16 c
.dbend
.dbfunc e m8515_init _m8515_init fV
.even
_m8515_init::
.dbline -1
.dbline 31
; }
; void m8515_init()
; {
.dbline 32
; DDRA=0XFF;
ldi R24,255
out 0x1a,R24
.dbline 33
; PORTA=0X00;
clr R2
out 0x1b,R2
.dbline 34
; DDRB=0X00;
out 0x17,R2
.dbline 35
; PORTB=0XFF;
out 0x18,R24
.dbline 36
; DDRC=0X00;
out 0x14,R2
.dbline 37
; PORTC=0XFF;
out 0x15,R24
.dbline 38
; DDRD=0X04; //clk=1
ldi R24,4
out 0x11,R24
.dbline 39
; PORTD=0XFF;
ldi R24,255
out 0x12,R24
.dbline -2
L32:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 42
; }
; void main()
; {
.dbline 43
; m8515_init();
rcall _m8515_init
rjmp L35
L34:
.dbline 45
; while(1)
; {
.dbline 46
; data();
rcall _data
.dbline 47
; if(KeyCode==0xe0)
lds R24,_KeyCode
cpi R24,224
brne L37
.dbline 48
; {data();}
.dbline 48
rcall _data
.dbline 48
L37:
.dbline 49
lds R2,_KeyCode
out 0x1b,R2
.dbline 50
L35:
.dbline 44
rjmp L34
X0:
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile E:\zh\avr\8515板\PS2KEY~1\PS2KEY.C
_KeyCode::
.blkb 1
.dbsym e KeyCode _KeyCode c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -