📄 ps2.lis
字号:
0062 .dbline -1
0062 .dbline 38
0062 ; }
0062 ;
0062 ;
0062 ;
0062 ;
0062 ; // 数据发送【发送5 到8 位数据位的帧】
0062 ; void USART_Transmit( unsigned char data )
0062 ; {
0062 L3:
0062 .dbline 41
0062 ; /* 等待发送缓冲器为空 */
0062 ; while ( !( UCSRA & (1<<UDRE)) )
0062 ; ;
0062 L4:
0062 .dbline 40
0062 5D9B sbis 0xb,5
0064 FECF rjmp L3
0066 X0:
0066 .dbline 43
0066 ; /* 将数据放入缓冲器,发送数据 */
0066 ; UDR = data;
0066 0CB9 out 0xc,R16
0068 .dbline -2
0068 L2:
0068 .dbline 0 ; func end
0068 0895 ret
006A .dbsym r data 16 c
006A .dbend
.area vector(rom, abs)
.org 8
0008 0C943500 jmp _int1_isr
.area text(rom, con, rel)
006A .dbfile D:\电子设计\AVR程序\PS2\PS2.C
006A .dbfunc e int1_isr _int1_isr fV
.even
006A _int1_isr::
006A 1A92 st -y,R1
006C 2A92 st -y,R2
006E 3A92 st -y,R3
0070 8A93 st -y,R24
0072 9A93 st -y,R25
0074 1FB6 in R1,0x3f
0076 1A92 st -y,R1
0078 .dbline -1
0078 .dbline 50
0078 ; }
0078 ;
0078 ;
0078 ;
0078 ; #pragma interrupt_handler int1_isr:iv_INT1
0078 ; void int1_isr(void)
0078 ; {
0078 .dbline 51
0078 ; if ((IntNum > 0) && (IntNum < 9))
0078 20900000 lds R2,_IntNum
007C 80E0 ldi R24,0
007E 8215 cp R24,R2
0080 88F4 brsh L7
0082 X1:
0082 822D mov R24,R2
0084 8930 cpi R24,9
0086 70F4 brsh L7
0088 X2:
0088 .dbline 52
0088 ; {
0088 .dbline 53
0088 ; KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
0088 20900000 lds R2,_KeyV
008C 2694 lsr R2
008E 20920000 sts _KeyV,R2
0092 .dbline 54
0092 ; if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
0092 80B3 in R24,0x10
0094 8071 andi R24,16
0096 8295 swap R24
0098 8F70 andi R24,#0x0F
009A 21F0 breq L9
009C X3:
009C .dbline 54
009C 822D mov R24,R2
009E 8068 ori R24,128
00A0 80930000 sts _KeyV,R24
00A4 L9:
00A4 .dbline 55
00A4 ; }
00A4 L7:
00A4 .dbline 56
00A4 ; IntNum++;
00A4 80910000 lds R24,_IntNum
00A8 8F5F subi R24,255 ; addi 1
00AA 80930000 sts _IntNum,R24
00AE L11:
00AE .dbline 57
00AE ; while (!Key_CLK); //等待PS/2CLK拉高
00AE L12:
00AE .dbline 57
00AE 80B3 in R24,0x10
00B0 8870 andi R24,8
00B2 8695 lsr R24
00B4 8695 lsr R24
00B6 8695 lsr R24
00B8 D1F3 breq L11
00BA X4:
00BA .dbline 59
00BA ;
00BA ; if (IntNum > 10)
00BA 8AE0 ldi R24,10
00BC 20900000 lds R2,_IntNum
00C0 8215 cp R24,R2
00C2 38F4 brsh L14
00C4 X5:
00C4 .dbline 60
00C4 ; {
00C4 .dbline 61
00C4 ; IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
00C4 2224 clr R2
00C6 20920000 sts _IntNum,R2
00CA .dbline 62
00CA ; BF = 1; //标识有字符输入完了
00CA 81E0 ldi R24,1
00CC 80930300 sts _BF,R24
00D0 .dbline 63
00D0 ; CLI(); //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)
00D0 F894 cli
00D2 .dbline 64
00D2 ; }
00D2 L14:
00D2 .dbline -2
00D2 L6:
00D2 .dbline 0 ; func end
00D2 1990 ld R1,y+
00D4 1FBE out 0x3f,R1
00D6 9991 ld R25,y+
00D8 8991 ld R24,y+
00DA 3990 ld R3,y+
00DC 2990 ld R2,y+
00DE 1990 ld R1,y+
00E0 1895 reti
00E2 .dbend
00E2 .dbfunc e Decode _Decode fV
00E2 ; TempCyc -> R20
00E2 ; ScanCode -> R10
.even
00E2 _Decode::
00E2 0E940000 xcall push_xgset300C
00E6 A02E mov R10,R16
00E8 .dbline -1
00E8 .dbline 68
00E8 ; }
00E8 ;
00E8 ; void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
00E8 ; {
00E8 .dbline 71
00E8 ; unsigned char TempCyc;
00E8 ;
00E8 ; if (!Key_UP) //当键盘松开时
00E8 20900100 lds R2,_Key_UP
00EC 2220 tst R2
00EE 09F0 breq X21
00F0 72C0 xjmp L17
00F2 X21:
00F2 X6:
00F2 .dbline 72
00F2 ; {
00F2 .dbline 73
00F2 ; switch (ScanCode)
00F2 4A2D mov R20,R10
00F4 5527 clr R21
00F6 4935 cpi R20,89
00F8 E0E0 ldi R30,0
00FA 5E07 cpc R21,R30
00FC B9F0 breq L24
00FE X7:
00FE 89E5 ldi R24,89
0100 90E0 ldi R25,0
0102 8417 cp R24,R20
0104 9507 cpc R25,R21
0106 2CF0 brlt L44
0108 X8:
0108 L43:
0108 4231 cpi R20,18
010A E0E0 ldi R30,0
010C 5E07 cpc R21,R30
010E 51F0 breq L23
0110 X9:
0110 11C0 xjmp L19
0112 L44:
0112 403F cpi R20,240
0114 E0E0 ldi R30,0
0116 5E07 cpc R21,R30
0118 09F0 breq L22
011A X10:
011A 0CC0 xjmp L19
011C L22:
011C .dbline 76
011C ; {
011C ; case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
011C ; Key_UP = 1;
011C 81E0 ldi R24,1
011E 80930100 sts _Key_UP,R24
0122 .dbline 77
0122 ; break;
0122 72C0 xjmp L18
0124 L23:
0124 .dbline 80
0124 ;
0124 ; case 0x12 : // 左 SHIFT
0124 ; Shift = 1;
0124 81E0 ldi R24,1
0126 80930200 sts _Shift,R24
012A .dbline 81
012A ; break;
012A 6EC0 xjmp L18
012C L24:
012C .dbline 84
012C ;
012C ; case 0x59 : // 右 SHIFT
012C ; Shift = 1;
012C 81E0 ldi R24,1
012E 80930200 sts _Shift,R24
0132 .dbline 85
0132 ; break;
0132 6AC0 xjmp L18
0134 L19:
0134 .dbline 93
0134 ;
0134 ; default:
0134 ; //if (DisNum > 15)
0134 ; //{
0134 ; // DisplayListChar(0, 1, Cls);//清LCD第二行
0134 ; // DisNum = 0;
0134 ; //}
0134 ; if(!Shift) //如果SHIFT没按下
0134 20900200 lds R2,_Shift
0138 2220 tst R2
013A 39F5 brne L25
013C X11:
013C .dbline 94
013C ; {
013C .dbline 95
013C ; for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
013C 4427 clr R20
013E 01C0 xjmp L30
0140 L27:
0140 .dbline 95
0140 L28:
0140 .dbline 95
0140 4395 inc R20
0142 L30:
0142 .dbline 95
0142 80E0 ldi R24,<_UnShifted
0144 90E0 ldi R25,>_UnShifted
0146 E42F mov R30,R20
0148 FF27 clr R31
014A EE0F lsl R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -