📄 ps2.lst
字号:
(0011) uchar Key_Up=0; //键盘被释放标志;
(0012) uchar Finish=0; //键盘编码接收完成标志
(0013)
(0014) unsigned char const KeyCode[59][2] = {
(0015) 0x1C, 'A',
(0016) 0x32, 'B',
(0017) 0x21, 'C',
(0018) 0x23, 'D',
(0019) 0x24, 'E',
(0020) 0x2B, 'F',
(0021) 0x34, 'G',
(0022) 0x33, 'H',
(0023) 0x43, 'I',
(0024) 0x3B, 'J',
(0025) 0x42, 'K',
(0026) 0x4B, 'L',
(0027) 0x3A, 'M',
(0028) 0x31, 'N',
(0029) 0x44, 'O',
(0030) 0x4D, 'P',
(0031) 0x15, 'Q',
(0032) 0x2D, 'R',
(0033) 0x1B, 'S',
(0034) 0x2C, 'T',
(0035) 0x3C, 'U',
(0036) 0x2A, 'V',
(0037) 0x1D, 'W',
(0038) 0x22, 'X',
(0039) 0x35, 'Y',
(0040) 0x1A, 'Z',
(0041) 0x45, '0',//48
(0042) 0x16, '1',//49
(0043) 0x1E, '2',//50
(0044) 0x26, '3',//51
(0045) 0x25, '4',//52
(0046) 0x2E, '5',//53
(0047) 0x36, '6',//54
(0048) 0x3D, '7',//55
(0049) 0x3E, '8',//56
(0050) 0x46, '9',//57
(0051) 0x0E, '~',
(0052) 0x7B, 62, //'_',
(0053) 0x79, 61, //'+',
(0054) 0x7C, 63, //'*',
(0055) 0x77, 64, //'NUM',
(0056) 0x54, '{',
(0057) 0x5B, '}',
(0058) 0x4C, ':',
(0059) 0x52, '"',
(0060) 0x41, '<',
(0061) //0x49, '>',
(0062) 0xE0, 60,//回车
(0063) //0x4A, '?',
(0064) 0x5a, 59, //59, //定义回车开始键;
(0065) 0x71, 58, //定义删除键;
(0066) 0x70, '0',//48
(0067) 0x69, '1',//49
(0068) 0x72, '2',//50
(0069) 0x7A, '3',//51
(0070) 0x6B, '4',//52
(0071) 0x73, '5',//53
(0072) 0x74, '6',//54
(0073) 0x6C, '7',//55
(0074) 0x75, '8',//56
(0075) 0x7D, '9',//57
(0076) };
(0077)
(0078) //***************************PS/2键盘译码******************//
(0079) //参数说明:ScanCode:扫描码;返回值:按键号:0~9,Enter,Del..
(0080) uchar Decode(uchar ScanCode)
(0081) {uchar temp;
(0082) uchar i;
(0083) switch (ScanCode)
0170 2F40 MOV R20,R16
0171 2755 CLR R21
0172 3E40 CPI R20,0xE0
0173 E0E0 LDI R30,0
0174 075E CPC R21,R30
0175 F009 BEQ 0x0177
0176 C005 RJMP 0x017C
(0084) {case 0xE0:
(0085) {Key_Up = 1;i=12;break;} // 当收到0xF0,Key_UP置1表示断码开始
0177 E081 LDI R24,1
0178 93800060 STS Key_Up,R24
017A E04C LDI R20,0xC
017B C022 RJMP 0x019E
(0086) default: //查表显示
(0087) for(temp=0;(KeyCode[temp][0]!=ScanCode)&&(temp<59);temp++);
017C 2766 CLR R22
017D C001 RJMP 0x017F
017E 9563 INC R22
017F E082 LDI R24,2
0180 9F86 MUL R24,R22
0181 01F0 MOVW R30,R0
0182 E584 LDI R24,0x54
0183 E090 LDI R25,0
0184 0FE8 ADD R30,R24
0185 1FF9 ADC R31,R25
0186 91E4 LPM R30,0(Z)
0187 17E0 CP R30,R16
0188 F011 BEQ 0x018B
0189 336B CPI R22,0x3B
018A F398 BCS 0x017E
(0088) if (KeyCode[temp][0]==ScanCode)
018B E082 LDI R24,2
018C 9F86 MUL R24,R22
018D 01F0 MOVW R30,R0
018E E584 LDI R24,0x54
018F E090 LDI R25,0
0190 0FE8 ADD R30,R24
0191 1FF9 ADC R31,R25
0192 91E4 LPM R30,0(Z)
0193 17E0 CP R30,R16
0194 F449 BNE 0x019E
(0089) i=KeyCode[temp][1]-48;
0195 E082 LDI R24,2
0196 9F86 MUL R24,R22
0197 01F0 MOVW R30,R0
0198 E585 LDI R24,0x55
0199 E090 LDI R25,0
019A 0FE8 ADD R30,R24
019B 1FF9 ADC R31,R25
019C 9144 LPM R20,0(Z)
019D 5340 SUBI R20,0x30
(0090) }
(0091) Finish = 0; //标识字符处理完了
019E 2422 CLR R2
019F 92200061 STS Finish,R2
(0092) return i;
01A1 2F04 MOV R16,R20
01A2 940E0267 CALL pop_gset2
01A4 9508 RET
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2\ps2main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602.h"
(0004) #include "KeyCode.h"
(0005)
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008)
(0009) uchar Int_Number=0; //中断计数器;
(0010) uchar Key_Value=0; //键盘编码值;
(0011) //extern Finish;
(0012) //extern Key_Up;
(0013)
(0014) void Init()
(0015) {PORTD = 0x06;
_Init:
01A5 E086 LDI R24,6
01A6 BB82 OUT 0x12,R24
(0016) DDRD = 0x00;
01A7 2422 CLR R2
01A8 BA21 OUT 0x11,R2
(0017) // DDRD&=~0x06; //110b,
(0018) //PORTD|=0x06; //110b,PD1,PD2输入,上拉
(0019) MCUCR=MCUCR&0xfc; //INT0低电平中断
01A9 B785 IN R24,0x35
01AA 7F8C ANDI R24,0xFC
01AB BF85 OUT 0x35,R24
(0020) GICR|=(1<<INT0); //INT0中断使能
01AC B78B IN R24,0x3B
01AD 6480 ORI R24,0x40
01AE BF8B OUT 0x3B,R24
(0021) SEI();
01AF 9478 BSET 7
(0022) LCD_Init();
01B0 DFA8 RCALL _LCD_Init
01B1 9508 RET
_main:
j --> R20
i --> R22
01B2 9722 SBIW R28,2
(0023) }
(0024)
(0025) void main()
(0026) {uchar i,j;
(0027) j=0;
01B3 2744 CLR R20
(0028) Init();
01B4 DFF0 RCALL _Init
(0029) LCD_Write_String(0,1,"Please input");
01B5 E980 LDI R24,0x90
01B6 E090 LDI R25,0
01B7 8399 STD Y+1,R25
01B8 8388 STD Y+0,R24
01B9 E021 LDI R18,1
01BA 2700 CLR R16
01BB DF87 RCALL _LCD_Write_String
(0030) LCD_SetXY(0,2);
01BC E022 LDI R18,2
01BD 2700 CLR R16
01BE DF54 RCALL _LCD_SetXY
01BF C028 RJMP 0x01E8
(0031) while(1){
(0032) if(Finish) //检测到键盘输入
01C0 90200061 LDS R2,Finish
01C2 2022 TST R2
01C3 F121 BEQ 0x01E8
(0033) {Finish=0; //清除检测标志
01C4 2422 CLR R2
01C5 92200061 STS Finish,R2
(0034) i=Decode(Key_Value); //键盘译码
01C7 91000063 LDS R16,Key_Value
01C9 DFA4 RCALL _Decode
01CA 2F60 MOV R22,R16
(0035) if((i>=0)&&(i<=9)){//数字键处理
01CB 3000 CPI R16,0
01CC F080 BCS 0x01DD
01CD E089 LDI R24,0x9
01CE 1780 CP R24,R16
01CF F068 BCS 0x01DD
(0036) LCD_Write_String(0,1,"Success! ");
01D0 E882 LDI R24,0x82
01D1 E090 LDI R25,0
01D2 8399 STD Y+1,R25
01D3 8388 STD Y+0,R24
01D4 E021 LDI R18,1
01D5 2700 CLR R16
01D6 DF6C RCALL _LCD_Write_String
(0037) LCD_Write_Char(j,2,0x30+i);} //显示
01D7 2F86 MOV R24,R22
01D8 5D80 SUBI R24,0xD0
01D9 8388 STD Y+0,R24
01DA E022 LDI R18,2
01DB 2F04 MOV R16,R20
01DC DF5A RCALL _LCD_Write_Char
(0038) j++;
01DD 9543 INC R20
(0039) if(j==16) {
01DE 3140 CPI R20,0x10
01DF F441 BNE 0x01E8
(0040) j=0;LCD_Write_String(0,2," ");}
01E0 2744 CLR R20
01E1 E684 LDI R24,0x64
01E2 E090 LDI R25,0
01E3 8399 STD Y+1,R25
01E4 8388 STD Y+0,R24
01E5 E022 LDI R18,2
01E6 2700 CLR R16
01E7 DF5B RCALL _LCD_Write_String
01E8 CFD7 RJMP 0x01C0
01E9 9622 ADIW R28,2
01EA 9508 RET
_Serve1:
01EB 922A ST R2,-Y
01EC 923A ST R3,-Y
01ED 938A ST R24,-Y
01EE 939A ST R25,-Y
01EF B62F IN R2,0x3F
01F0 922A ST R2,-Y
(0041) }}
(0042) }
(0043)
(0044)
(0045)
(0046)
(0047) #pragma interrupt_handler Serve1:INT0 //2
(0048) void Serve1(void)
(0049) {if(!Key_Up)
01F1 90200060 LDS R2,Key_Up
01F3 2022 TST R2
01F4 F549 BNE 0x021E
(0050) {if ((Int_Number > 0) && (Int_Number < 9)) //接受只有一字节通码字符
01F5 2422 CLR R2
01F6 90300062 LDS R3,Int_Number
01F8 1423 CP R2,R3
01F9 F470 BCC 0x0208
01FA 2D83 MOV R24,R3
01FB 3089 CPI R24,0x9
01FC F458 BCC 0x0208
(0051) {Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
01FD 90200063 LDS R2,Key_Value
01FF 9426 LSR R2
0200 92200063 STS Key_Value,R2
(0052) if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
0202 9B81 SBIS 0x10,1
0203 C004 RJMP 0x0208
0204 2D82 MOV R24,R2
0205 6880 ORI R24,0x80
0206 93800063 STS Key_Value,R24
(0053) if(Int_Number==10) Finish=1;//收到第10个脉冲表示一字节传送完成
0208 91800062 LDS R24,Int_Number
020A 308A CPI R24,0xA
020B F419 BNE 0x020F
020C E081 LDI R24,1
020D 93800061 STS Finish,R24
(0054) if(Int_Number==33) Int_Number=0;//收到第33个脉冲表示按键断码传送完成
020F 91800062 LDS R24,Int_Number
0211 3281 CPI R24,0x21
0212 F419 BNE 0x0216
0213 2422 CLR R2
0214 92200062 STS Int_Number,R2
(0055) while (!(PIND&0x04)); //等待PS/2CLK拉高
0216 9B82 SBIS 0x10,2
0217 CFFE RJMP 0x0216
(0056) Int_Number++;}
0218 91800062 LDS R24,Int_Number
021A 5F8F SUBI R24,0xFF
021B 93800062 STS Int_Number,R24
021D C02A RJMP 0x0248
(0057) else
(0058) {if ((Int_Number > 0) && (Int_Number < 9)) //接受双字节通码字符
021E 2422 CLR R2
021F 90300062 LDS R3,Int_Number
0221 1423 CP R2,R3
0222 F470 BCC 0x0231
0223 2D83 MOV R24,R3
0224 3089 CPI R24,0x9
0225 F458 BCC 0x0231
(0059) {Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
0226 90200063 LDS R2,Key_Value
0228 9426 LSR R2
0229 92200063 STS Key_Value,R2
(0060) if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
022B 9B81 SBIS 0x10,1
022C C004 RJMP 0x0231
022D 2D82 MOV R24,R2
022E 6880 ORI R24,0x80
022F 93800063 STS Key_Value,R24
(0061) if(Int_Number==10) Finish=1;
0231 91800062 LDS R24,Int_Number
0233 308A CPI R24,0xA
0234 F419 BNE 0x0238
0235 E081 LDI R24,1
0236 93800061 STS Finish,R24
(0062) if(Int_Number==55) {Int_Number=0;Key_Up=0;}
0238 91800062 LDS R24,Int_Number
023A 3387 CPI R24,0x37
023B F429 BNE 0x0241
023C 2422 CLR R2
023D 92200062 STS Int_Number,R2
023F 92200060 STS Key_Up,R2
(0063) while (!(PIND&0x04)); //等待PS/2CLK拉高
0241 9B82 SBIS 0x10,2
0242 CFFE RJMP 0x0241
(0064) Int_Number++;}
FILE: <library>
0243 91800062 LDS R24,Int_Number
0245 5F8F SUBI R24,0xFF
0246 93800062 STS Int_Number,R24
0248 9029 LD R2,Y+
0249 BE2F OUT 0x3F,R2
024A 9199 LD R25,Y+
024B 9189 LD R24,Y+
024C 9039 LD R3,Y+
024D 9029 LD R2,Y+
024E 9518 RETI
mod8u:
024F 9468 BSET 6
0250 C001 RJMP xdiv8u
div8u:
0251 94E8 BCLR 6
xdiv8u:
0252 932A ST R18,-Y
0253 92FA ST R15,-Y
0254 92EA ST R14,-Y
0255 24FF CLR R15
0256 24EE CLR R14
0257 E120 LDI R18,0x10
0258 0F00 LSL R16
0259 1CFF ROL R15
025A 1CEE ROL R14
025B 16E1 CP R14,R17
025C F010 BCS 0x025F
025D 1AE1 SUB R14,R17
025E 9503 INC R16
025F 952A DEC R18
0260 F7B9 BNE 0x0258
0261 F40E BRTC 0x0263
0262 2D0E MOV R16,R14
0263 90E9 LD R14,Y+
0264 90F9 LD R15,Y+
0265 9129 LD R18,Y+
0266 9508 RET
pop_gset2:
0267 E0E2 LDI R30,2
0268 940C0279 JMP pop
pop_gset3:
026A E0E4 LDI R30,4
026B 940C0279 JMP pop
push_gset5:
026D 92FA ST R15,-Y
026E 92EA ST R14,-Y
push_gset4:
026F 92DA ST R13,-Y
0270 92CA ST R12,-Y
push_gset3:
0271 92BA ST R11,-Y
0272 92AA ST R10,-Y
push_gset2:
0273 937A ST R23,-Y
0274 936A ST R22,-Y
push_gset1:
0275 935A ST R21,-Y
0276 934A ST R20,-Y
0277 9508 RET
pop_gset1:
0278 E0E1 LDI R30,1
pop:
0279 9149 LD R20,Y+
027A 9159 LD R21,Y+
027B FDE0 SBRC R30,0
027C 9508 RET
027D 9169 LD R22,Y+
027E 9179 LD R23,Y+
027F FDE1 SBRC R30,1
0280 9508 RET
0281 90A9 LD R10,Y+
0282 90B9 LD R11,Y+
0283 FDE2 SBRC R30,2
0284 9508 RET
0285 90C9 LD R12,Y+
0286 90D9 LD R13,Y+
0287 FDE3 SBRC R30,3
0288 9508 RET
0289 90E9 LD R14,Y+
028A 90F9 LD R15,Y+
028B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -