⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2.lis

📁 mega16的ps2程序 自己修改
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 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 + -