📄 key.lst
字号:
__start:
__text_start:
0011 E5CF LDI R28,0x5F
0012 E0D2 LDI R29,2
0013 BFCD OUT 0x3D,R28
0014 BFDE OUT 0x3E,R29
0015 51C0 SUBI R28,0x10
0016 40D0 SBCI R29,0
0017 EA0A LDI R16,0xAA
0018 8308 STD Y+0,R16
0019 2400 CLR R0
001A E6E0 LDI R30,0x60
001B E0F0 LDI R31,0
001C E010 LDI R17,0
001D 36E1 CPI R30,0x61
001E 07F1 CPC R31,R17
001F F011 BEQ 0x0022
0020 9201 ST R0,Z+
0021 CFFB RJMP 0x001D
0022 8300 STD Z+0,R16
0023 E2E2 LDI R30,0x22
0024 E0F0 LDI R31,0
0025 E6A0 LDI R26,0x60
0026 E0B0 LDI R27,0
0027 E010 LDI R17,0
0028 32E2 CPI R30,0x22
0029 07F1 CPC R31,R17
002A F021 BEQ 0x002F
002B 95C8 LPM
002C 9631 ADIW R30,1
002D 920D ST R0,X+
002E CFF9 RJMP 0x0028
002F D047 RCALL _main
_exit:
0030 CFFF RJMP _exit
FILE: E:\zh\avr\8515板\PS2KEY~1\PS2KEY.C
(0001) //ps2 keyboard
(0002) //clk=pd2,dat=pb3
(0003) #include<io8515v.h>
(0004) #include<macros.h>
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007) unsigned char KeyCode; //键盘键值
(0008) void data()
(0009) {
(0010) uchar num; //位数
(0011) DDRD=0X00;
_data:
num --> R16
0031 2422 CLR R2
0032 BA21 OUT 0x11,R2
(0012) while((PIND|0XFB)==0XFF); // 等待键盘把时钟第一次拉低
0033 B380 IN R24,0x10
0034 6F8B ORI R24,0xFB
0035 3F8F CPI R24,0xFF
0036 F3E1 BEQ 0x0033
(0013) for(num=8;num!=0;num--) // 把起始位算入
0037 E008 LDI R16,0x8
0038 C018 RJMP 0x0051
(0014) {DDRD=0X00;
0039 2422 CLR R2
003A BA21 OUT 0x11,R2
(0015) while((PIND|0XFB)!=0XFF); // 等待一个有效的下跳沿
003B B380 IN R24,0x10
003C 6F8B ORI R24,0xFB
003D 3F8F CPI R24,0xFF
003E F7E1 BNE 0x003B
(0016) while((PIND|0XFB)==0XFF);
003F B380 IN R24,0x10
0040 6F8B ORI R24,0xFB
0041 3F8F CPI R24,0xFF
0042 F3E1 BEQ 0x003F
(0017) KeyCode>>=1; // 按照PS2格式,数据低位在前
0043 90200060 LDS R2,KeyCode
0045 9426 LSR R2
0046 92200060 STS KeyCode,R2
(0018) if((PINB|0XF7)==0XFF)
0048 B386 IN R24,0x16
0049 6F87 ORI R24,0xF7
004A 3F8F CPI R24,0xFF
004B F421 BNE 0x0050
(0019) {
(0020) KeyCode|=0x80; // 得到有效的数据位
004C 2D82 MOV R24,R2
004D 6880 ORI R24,0x80
004E 93800060 STS KeyCode,R24
0050 950A DEC R16
0051 2300 TST R16
0052 F731 BNE 0x0039
(0021) }
(0022) }
(0023) DDRD=0X00;
0053 2422 CLR R2
0054 BA21 OUT 0x11,R2
(0024) while((PIND|0XFB)!=0XFF);
0055 B380 IN R24,0x10
0056 6F8B ORI R24,0xFB
0057 3F8F CPI R24,0xFF
0058 F7E1 BNE 0x0055
(0025) while((PIND|0XFB)==0XFF);
0059 B380 IN R24,0x10
005A 6F8B ORI R24,0xFB
005B 3F8F CPI R24,0xFF
005C F3E1 BEQ 0x0059
(0026) while((PIND|0XFB)!=0XFF);
005D B380 IN R24,0x10
005E 6F8B ORI R24,0xFB
005F 3F8F CPI R24,0xFF
0060 F7E1 BNE 0x005D
(0027) while((PIND|0XFB)==0XFF);
0061 B380 IN R24,0x10
0062 6F8B ORI R24,0xFB
0063 3F8F CPI R24,0xFF
0064 F3E1 BEQ 0x0061
(0028) while((PIND|0XFB)!=0XFF);
0065 B380 IN R24,0x10
0066 6F8B ORI R24,0xFB
0067 3F8F CPI R24,0xFF
0068 F7E1 BNE 0x0065
0069 9508 RET
(0029) }
(0030) void m8515_init()
(0031) {
(0032) DDRA=0XFF;
_m8515_init:
006A EF8F LDI R24,0xFF
006B BB8A OUT 0x1A,R24
(0033) PORTA=0X00;
006C 2422 CLR R2
006D BA2B OUT 0x1B,R2
(0034) DDRB=0X00;
006E BA27 OUT 0x17,R2
(0035) PORTB=0XFF;
006F BB88 OUT 0x18,R24
(0036) DDRC=0X00;
0070 BA24 OUT 0x14,R2
(0037) PORTC=0XFF;
0071 BB85 OUT 0x15,R24
(0038) DDRD=0X04; //clk=1
0072 E084 LDI R24,4
0073 BB81 OUT 0x11,R24
(0039) PORTD=0XFF;
0074 EF8F LDI R24,0xFF
0075 BB82 OUT 0x12,R24
0076 9508 RET
(0040) }
(0041) void main()
(0042) {
(0043) m8515_init();
_main:
0077 DFF2 RCALL _m8515_init
0078 C009 RJMP 0x0082
(0044) while(1)
(0045) {
(0046) data();
0079 DFB7 RCALL _data
(0047) if(KeyCode==0xe0)
007A 91800060 LDS R24,KeyCode
007C 3E80 CPI R24,0xE0
007D F409 BNE 0x007F
(0048) {data();}
007E DFB2 RCALL _data
(0049) PORTA=KeyCode;
FILE: <library>
007F 90200060 LDS R2,KeyCode
0081 BA2B OUT 0x1B,R2
0082 CFF6 RJMP 0x0079
0083 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -