📄 训练项目九:ps2键盘的使用.lis
字号:
000C ; if((count>0)&&(count<9))
000C 20900400 lds R2,_count
0010 80E0 ldi R24,0
0012 8215 cp R24,R2
0014 C0F4 brsh L2
0016 X0:
0016 822D mov R24,R2
0018 8930 cpi R24,9
001A A8F4 brsh L2
001C X1:
001C ; {
001C ; flag=0; /* 标志位 */
001C 2224 clr R2
001E 20920300 sts _flag,R2
0022 ; key=key>>1;
0022 20900000 lds R2,_key
0026 2694 lsr R2
0028 20920000 sts _key,R2
002C ; if(DATA)
002C 0D9B sbis 0x1,5
002E 05C0 rjmp L4
0030 X2:
0030 ; key|=0x80;
0030 822D mov R24,R2
0032 8068 ori R24,128
0034 80930000 sts _key,R24
0038 09C0 xjmp L3
003A L4:
003A ; else
003A ; key&=0x7f;
003A 80910000 lds R24,_key
003E 8F77 andi R24,127
0040 80930000 sts _key,R24
0044 ; }
0044 03C0 xjmp L3
0046 L2:
0046 ; else
0046 ; flag=1;
0046 81E0 ldi R24,1
0048 80930300 sts _flag,R24
004C L3:
004C ; count++;
004C 80910400 lds R24,_count
0050 8F5F subi R24,255 ; addi 1
0052 80930400 sts _count,R24
0056 L6:
0056 ;
0056 ; while(!(PINE&0x10));
0056 L7:
0056 0C9B sbis 0x1,4
0058 FECF rjmp L6
005A X3:
005A ;
005A ; if(count>10)
005A 8AE0 ldi R24,10
005C 20900400 lds R2,_count
0060 8215 cp R24,R2
0062 18F4 brsh L9
0064 X4:
0064 ; {
0064 ; count=0;
0064 2224 clr R2
0066 20920400 sts _count,R2
006A ; }
006A L9:
006A L1:
006A .dbline 0 ; func end
006A 1990 ld R1,y+
006C 1FBE out 0x3f,R1
006E 9991 ld R25,y+
0070 8991 ld R24,y+
0072 2990 ld R2,y+
0074 1990 ld R1,y+
0076 1895 reti
0078 ; i -> R20
0078 ; data -> R16
.even
0078 _key_check::
0078 0E940000 xcall push_xgsetF000
007C ; }
007C ;
007C ; unsigned char key_check (unsigned char data) /* 查表,处理键值 */
007C ; {
007C ; unsigned char i=0;
007C 4427 clr R20
007E ;
007E ; switch(data)
007E 602F mov R22,R16
0080 7727 clr R23
0082 6935 cpi R22,89
0084 E0E0 ldi R30,0
0086 7E07 cpc R23,R30
0088 09F1 breq L19
008A X5:
008A 89E5 ldi R24,89
008C 90E0 ldi R25,0
008E 8617 cp R24,R22
0090 9707 cpc R25,R23
0092 2CF0 brlt L43
0094 X6:
0094 L42:
0094 6231 cpi R22,18
0096 E0E0 ldi R30,0
0098 7E07 cpc R23,R30
009A 59F0 breq L16
009C X7:
009C 24C0 xjmp L12
009E L43:
009E 603F cpi R22,240
00A0 E0E0 ldi R30,0
00A2 7E07 cpc R23,R30
00A4 09F0 breq L15
00A6 X8:
00A6 1FC0 xjmp L12
00A8 L15:
00A8 ; {
00A8 ; case 0xf0:up=1;return(0);
00A8 81E0 ldi R24,1
00AA 80930200 sts _up,R24
00AE 0027 clr R16
00B0 61C0 xjmp L11
00B2 L16:
00B2 ; case 0x12:shift=(up==0)?1:0;return(0);
00B2 20900200 lds R2,_up
00B6 2220 tst R2
00B8 19F4 brne L17
00BA X9:
00BA 61E0 ldi R22,1
00BC 70E0 ldi R23,0
00BE 02C0 xjmp L18
00C0 L17:
00C0 6627 clr R22
00C2 7727 clr R23
00C4 L18:
00C4 60930100 sts _shift,R22
00C8 0027 clr R16
00CA 54C0 xjmp L11
00CC L19:
00CC ; case 0x59:shift=(up==0)?1:0;return(0);
00CC 20900200 lds R2,_up
00D0 2220 tst R2
00D2 19F4 brne L20
00D4 X10:
00D4 61E0 ldi R22,1
00D6 70E0 ldi R23,0
00D8 02C0 xjmp L21
00DA L20:
00DA 6627 clr R22
00DC 7727 clr R23
00DE L21:
00DE 60930100 sts _shift,R22
00E2 0027 clr R16
00E4 47C0 xjmp L11
00E6 L12:
00E6 ; default:
00E6 ; {
00E6 ; if(up==0)
00E6 20900200 lds R2,_up
00EA 2220 tst R2
00EC 09F0 breq X18
00EE 3EC0 xjmp L22
00F0 X18:
00F0 X11:
00F0 ; {
00F0 ; if(shift==0)
00F0 20900100 lds R2,_shift
00F4 2220 tst R2
00F6 D9F4 brne L24
00F8 X12:
00F8 ; {
00F8 ; for(i=0;i<60;i++)
00F8 4427 clr R20
00FA 16C0 xjmp L29
00FC L26:
00FC ; {
00FC ; if (UnShifted[i][0]==data)
00FC 80E0 ldi R24,<_UnShifted
00FE 90E0 ldi R25,>_UnShifted
0100 E42F mov R30,R20
0102 FF27 clr R31
0104 EE0F lsl R30
0106 FF1F rol R31
0108 E80F add R30,R24
010A F91F adc R31,R25
010C 2080 ldd R2,z+0
010E 2016 cp R2,R16
0110 51F4 brne L30
0112 X13:
0112 ; return(UnShifted[i][1]);
0112 80E0 ldi R24,<_UnShifted+1
0114 90E0 ldi R25,>_UnShifted+1
0116 E42F mov R30,R20
0118 FF27 clr R31
011A EE0F lsl R30
011C FF1F rol R31
011E E80F add R30,R24
0120 F91F adc R31,R25
0122 0081 ldd R16,z+0
0124 27C0 xjmp L11
0126 L30:
0126 ; }
0126 L27:
0126 4395 inc R20
0128 L29:
0128 4C33 cpi R20,60
012A 40F3 brlo L26
012C X14:
012C ; }
012C 23C0 xjmp L23
012E L24:
012E ; else if(shift==1)
012E 80910100 lds R24,_shift
0132 8130 cpi R24,1
0134 F9F4 brne L23
0136 X15:
0136 ; {
0136 ; for(i=0;i<59;i++)
0136 4427 clr R20
0138 16C0 xjmp L38
013A L35:
013A ; {
013A ; if (Shifted[i][0]==data)
013A 80E0 ldi R24,<_Shifted
013C 90E0 ldi R25,>_Shifted
013E E42F mov R30,R20
0140 FF27 clr R31
0142 EE0F lsl R30
0144 FF1F rol R31
0146 E80F add R30,R24
0148 F91F adc R31,R25
014A 2080 ldd R2,z+0
014C 2016 cp R2,R16
014E 51F4 brne L39
0150 X16:
0150 ; return(Shifted[i][1]);
0150 80E0 ldi R24,<_Shifted+1
0152 90E0 ldi R25,>_Shifted+1
0154 E42F mov R30,R20
0156 FF27 clr R31
0158 EE0F lsl R30
015A FF1F rol R31
015C E80F add R30,R24
015E F91F adc R31,R25
0160 0081 ldd R16,z+0
0162 08C0 xjmp L11
0164 L39:
0164 ; }
0164 L36:
0164 4395 inc R20
0166 L38:
0166 4B33 cpi R20,59
0168 40F3 brlo L35
016A X17:
016A ; }
016A ; }
016A 04C0 xjmp L23
016C L22:
016C ; else
016C ; {
016C ; up=0;
016C 2224 clr R2
016E 20920200 sts _up,R2
0172 ; return(0);
0172 0027 clr R16
0174 L23:
0174 ; }
0174 ; }
0174 ; }
0174 L11:
0174 .dbline 0 ; func end
0174 0C940000 xjmp pop_xgsetF000
0178 ; a -> R10
.even
0178 _main::
0178 2297 sbiw R28,2
017A ; }
017A ;
017A ; /****************************************************************************
017A ; ** Function Name: main
017A ; ** Descriptions:
017A ; ** Input Parameters: void
017A ; ** Output parameters: void
017A ; ** Returned Value: void
017A ; **---------------------------------------------------------------------------
017A ; ****************************************************************************/
017A ;
017A ; void main(void)
017A ; {
017A ;
017A ; unsigned char a=0;
017A AA24 clr R10
017C ;
017C ; MCUCR=0; /* MCU控制寄存器 */
017C 2224 clr R2
017E 25BE out 0x35,R2
0180 ; SEI();
0180 7894 sei
0182 ; lcd_init();
0182 0E940000 xcall _lcd_init
0186 ; DDRE&=0xcf; /* PE4和PE5作输入 */
0186 82B1 in R24,0x2
0188 8F7C andi R24,207
018A 82B9 out 0x2,R24
018C ; EIMSK=0x10; /* 外部中断屏蔽寄存器 */
018C 80E1 ldi R24,16
018E 89BF out 0x39,R24
0190 ; EICRB=0x02; /* 外部中断寄存器B */
0190 82E0 ldi R24,2
0192 8ABF out 0x3a,R24
0194 ; lcd_clear();
0194 0E940000 xcall _lcd_clear
0198 0EC0 xjmp L46
019A L45:
019A ; while(1) /* 显示在液晶显示器上 */
019A ; {
019A ; a=key_check(key); lcd_putss(0,0,a);}
019A 00910000 lds R16,_key
019E 6CDF xcall _key_check
01A0 A02E mov R10,R16
01A2 2A2C mov R2,R10
01A4 3324 clr R3
01A6 3982 std y+1,R3
01A8 2882 std y+0,R2
01AA 2227 clr R18
01AC 3327 clr R19
01AE 0027 clr R16
01B0 1127 clr R17
01B2 0E940000 xcall _lcd_putss
01B6 L46:
01B6 F1CF xjmp L45
01B8 X19:
01B8 L44:
01B8 .dbline 0 ; func end
01B8 2296 adiw R28,2
01BA 0895 ret
01BC ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -