?? ps2_bin.src
字號:
; Delay(5);
; SOURCE LINE # 186
MOV R7,#05H
LCALL _Delay
;
; Order(COMMAND_SETSTATUS);//設置狀態燈CapsLock,NumLock,ScrollLock
; SOURCE LINE # 188
MOV R7,#0EDH
LCALL _Order
; ReadPS2(); //等待鍵盤應答
; SOURCE LINE # 189
LCALL ReadPS2
; LedStatus = DISALL;
; SOURCE LINE # 190
CLR A
MOV LedStatus,A
; Order(LedStatus); //關閉所有燈
; SOURCE LINE # 191
MOV R7,LedStatus
LCALL _Order
; ReadPS2(); //等待鍵盤應答
; SOURCE LINE # 192
LCALL ReadPS2
; /*
; Order(COMMAND_READID); //讀鍵盤ID
; ReadPS2(); //等待鍵盤應答
; KeyIDLo = ReadPS2(); //獲得鍵盤ID低字節
; KeyIDHi = ReadPS2(); //獲得鍵盤ID高字節
; */
; LedStatus = NUMLOCK_EN; //開NumLock燈
; SOURCE LINE # 199
MOV LedStatus,#02H
; Order(COMMAND_SETSTATUS);
; SOURCE LINE # 200
MOV R7,#0EDH
LCALL _Order
; ReadPS2(); //等待應答
; SOURCE LINE # 201
LCALL ReadPS2
; Order(LedStatus); //
; SOURCE LINE # 202
MOV R7,LedStatus
LCALL _Order
; ReadPS2(); //等待應答
; SOURCE LINE # 203
LCALL ReadPS2
; Order(COMMAND_SETRATE); //設置速率延時
; SOURCE LINE # 204
MOV R7,#0F3H
LCALL _Order
; ReadPS2(); //等待應答
; SOURCE LINE # 205
LCALL ReadPS2
; Order(0x20); //500ms/30
; SOURCE LINE # 206
MOV R7,#020H
LCALL _Order
; ReadPS2();
; SOURCE LINE # 207
LCALL ReadPS2
; Order(COMMAND_ENABLE); //使能鍵盤
; SOURCE LINE # 208
MOV R7,#0F4H
LCALL _Order
; ReadPS2();
; SOURCE LINE # 209
LCALL ReadPS2
; Order(COMMAND_SETRATE); //設置速率延時
; SOURCE LINE # 210
MOV R7,#0F3H
LCALL _Order
; ReadPS2();
; SOURCE LINE # 211
LCALL ReadPS2
; Order(0x20); //
; SOURCE LINE # 212
MOV R7,#020H
LCALL _Order
; ReadPS2();
; SOURCE LINE # 213
LCALL ReadPS2
;
; Delay(200); //延時
; SOURCE LINE # 215
MOV R7,#0C8H
LCALL _Delay
;
; EINT; //開總中斷
; SOURCE LINE # 217
SETB EA
?C0012:
;
; while(1)
; SOURCE LINE # 219
; {
; SOURCE LINE # 220
; // KeyScan();//掃描鍵盤
; if(KeyFlag == 1)
; SOURCE LINE # 222
JNB KeyFlag,?C0014
; {
; SOURCE LINE # 223
; KeyFlag = 0;
; SOURCE LINE # 224
CLR KeyFlag
; KeyTransmit();//
; SOURCE LINE # 225
LCALL KeyTransmit
;
; }
; SOURCE LINE # 227
?C0014:
;
; KickDog();
; SOURCE LINE # 229
LCALL KickDog
;
; }
; SOURCE LINE # 231
SJMP ?C0012
; END OF main
CSEG AT 00023H
LJMP uart
; }
;
; /*********************************************************/
; //函數:uart
; //功能:串口中斷
; //輸入:無
; //輸出:無
; //描述:
; /*********************************************************/
; void uart() interrupt 4 using 2
RSEG ?PR?uart?PS2_BIN
USING 2
uart:
PUSH ACC
PUSH PSW
; SOURCE LINE # 241
; {
; ES=0;
; SOURCE LINE # 243
CLR ES
; TH1=0xfa; //裝入初值,22.1184MHZ 的晶振,9600 的波特率
; SOURCE LINE # 244
MOV TH1,#0FAH
; TL1=0xfa;
; SOURCE LINE # 245
MOV TL1,#0FAH
;
; if(RI == 1) //接收中斷
; SOURCE LINE # 247
JNB RI,?C0016
; {
; SOURCE LINE # 248
; RI= 0;
; SOURCE LINE # 249
CLR RI
;
; }
; SOURCE LINE # 251
SJMP ?C0017
?C0016:
; else if(TI == 1) //發送中斷
; SOURCE LINE # 252
JNB TI,?C0017
; {
; SOURCE LINE # 253
; if(KeyCodeSum >1)
; SOURCE LINE # 254
MOV A,KeyCodeSum
SETB C
SUBB A,#01H
JNC ?C0020
; {
; SOURCE LINE # 255
; // SBUF = KeyCodeBuff[--KeyCodeSum];
; // SBUF = 0x00;
; }
; SOURCE LINE # 258
?C0019:
; else
; {
; SOURCE LINE # 260
; KeyCodeSum = 0;
; SOURCE LINE # 261
MOV KeyCodeSum,#00H
; }
; SOURCE LINE # 262
?C0020:
; TI = 0;
; SOURCE LINE # 263
CLR TI
; }
; SOURCE LINE # 264
?C0017:
; ES=1;
; SOURCE LINE # 265
SETB ES
; }
; SOURCE LINE # 266
POP PSW
POP ACC
RETI
; END OF uart
;
; unsigned char findcode(unsigned char dat,unsigned char sort)
RSEG ?PR?_findcode?PS2_BIN
_findcode:
USING 0
; SOURCE LINE # 268
;---- Variable 'dat?240' assigned to Register 'R7' ----
;---- Variable 'sort?241' assigned to Register 'R5' ----
; {
; SOURCE LINE # 269
; unsigned char conter=0x00;
; SOURCE LINE # 270
;---- Variable 'conter?242' assigned to Register 'R6' ----
; switch (sort)
; SOURCE LINE # 271
MOV A,R5
ADD A,#01FH
JZ ?C0029
INC A
JNZ ?C0034
; {
; SOURCE LINE # 272
; case 0xE0:
; SOURCE LINE # 273
?C0023:
; {
; SOURCE LINE # 274
; for(conter=0x00;conter<22;conter++)
; SOURCE LINE # 275
CLR A
MOV R6,A
?C0024:
; {
; SOURCE LINE # 276
; if(dat==e0_keyval[conter])return conter;
; SOURCE LINE # 277
MOV A,R6
MOV DPTR,#e0_keyval
MOVC A,@A+DPTR
CJNE A,AR7,?C0026
MOV R7,AR6
RET
; }
; SOURCE LINE # 278
?C0026:
INC R6
CJNE R6,#016H,?C0024
?C0025:
; return nodefinedkey;
; SOURCE LINE # 279
MOV R7,#00H
RET
; //break;
; }
; SOURCE LINE # 281
; case 0xE1:
; SOURCE LINE # 282
?C0029:
; {
; SOURCE LINE # 283
; for(conter=0x00;conter<2;conter++)
; SOURCE LINE # 284
CLR A
MOV R6,A
?C0030:
; {
; SOURCE LINE # 285
; if(dat==pausekey[conter])return conter;
; SOURCE LINE # 286
MOV A,R6
MOV DPTR,#pausekey
MOVC A,@A+DPTR
CJNE A,AR7,?C0032
MOV R7,AR6
RET
; }
; SOURCE LINE # 287
?C0032:
INC R6
CJNE R6,#02H,?C0030
?C0031:
; return nodefinedkey;
; SOURCE LINE # 288
MOV R7,#00H
RET
; //break;
;
; }
; SOURCE LINE # 291
; default:
; SOURCE LINE # 292
?C0034:
; for(conter=0x00;conter<86;conter++)
; SOURCE LINE # 293
CLR A
MOV R6,A
?C0035:
; {
; SOURCE LINE # 294
; if(dat==keyval[conter])return conter;
; SOURCE LINE # 295
MOV A,R6
MOV DPTR,#keyval
MOVC A,@A+DPTR
CJNE A,AR7,?C0037
MOV R7,AR6
RET
; }
; SOURCE LINE # 296
?C0037:
INC R6
CJNE R6,#056H,?C0035
?C0036:
; return nodefinedkey;
; SOURCE LINE # 297
MOV R7,#00H
; //break;
; }
; SOURCE LINE # 299
;
; }
; SOURCE LINE # 301
?C0028:
RET
; END OF _findcode
; /*********************************************************/
; //函數:KeyTransmit()
; //功能:串口中斷
; //輸入:
; //輸出:
; //描述:
; /*********************************************************/
; void KeyTransmit(void)
RSEG ?PR?KeyTransmit?PS2_BIN
KeyTransmit:
USING 0
; SOURCE LINE # 309
; {
; SOURCE LINE # 310
; EA=0;
; SOURCE LINE # 311
CLR EA
;
; if((KeyCodeBuff[0x00]==0xE0)&(KeyCodeBuff[0x01]==0x12)&(KeyCodeBuff[0x02]!=0x00))
; SOURCE LINE # 313
MOV A,KeyCodeBuff+01H
CJNE A,#012H,?C0040
MOV R7,#01H
SJMP ?C0041
?C0040:
MOV R7,#00H
?C0041:
MOV A,KeyCodeBuff
CJNE A,#0E0H,?C0042
MOV R6,#01H
SJMP ?C0043
?C0042:
MOV R6,#00H
?C0043:
MOV A,R6
ANL A,R7
MOV R7,A
MOV A,KeyCodeBuff+02H
JZ ?C0044
MOV R6,#01H
SJMP ?C0045
?C0044:
MOV R6,#00H
?C0045:
MOV A,R6
ANL A,R7
JZ ?C0039
; {
; SOURCE LINE # 314
; OUTPORT=findcode(KeyCodeBuff[0x02],0xE0)+80;//是擴展建?
; SOURCE LINE # 315
MOV R5,#0E0H
MOV R7,KeyCodeBuff+02H
LCALL _findcode
MOV A,R7
ADD A,#050H
MOV P2,A
; }
; SOURCE LINE # 316
SJMP ?C0046
?C0039:
; else if((KeyCodeBuff[0x00]==0xE0)&(KeyCodeBuff[0x02]==0x00))
; SOURCE LINE # 317
MOV A,KeyCodeBuff+02H
JNZ ?C0048
MOV R7,#01H
SJMP ?C0049
?C0048:
MOV R7,#00H
?C0049:
MOV A,KeyCodeBuff
CJNE A,#0E0H,?C0050
MOV R6,#01H
SJMP ?C0051
?C0050:
MOV R6,#00H
?C0051:
MOV A,R6
ANL A,R7
JZ ?C0046
; {
; SOURCE LINE # 318
; OUTPORT=findcode(KeyCodeBuff[0x01],0xE0)+58;//是普通擴展鍵?
; SOURCE LINE # 319
MOV R5,#0E0H
MOV R7,KeyCodeBuff+01H
LCALL _findcode
MOV A,R7
ADD A,#03AH
MOV P2,A
; }
; SOURCE LINE # 320
?C0046:
; if(KeyCodeBuff[0x00]==0xE1)OUTPORT=200; //pause的鍵顯示200
; SOURCE LINE # 321
MOV A,KeyCodeBuff
CJNE A,#0E1H,?C0052
MOV P2,#0C8H
SJMP ?C0053
?C0052:
; else
; {
; SOURCE LINE # 323
; if((KeyCodeBuff[0x00]!=0xE0)&(KeyCodeBuff[0x00]!=0x00))
; SOURCE LINE # 324
MOV A,KeyCodeBuff
JZ ?C0055
MOV R7,#01H
SJMP ?C0056
?C0055:
MOV R7,#00H
?C0056:
MOV A,KeyCodeBuff
XRL A,#0E0H
JZ ?C0057
MOV R6,#01H
SJMP ?C0058
?C0057:
MOV R6,#00H
?C0058:
MOV A,R6
ANL A,R7
JZ ?C0053
; {
; SOURCE LINE # 325
; OUTPORT=findcode(KeyCodeBuff[0x00],0x12);//是普通鍵嗎?
; SOURCE LINE # 326
MOV R5,#012H
MOV R7,KeyCodeBuff
LCALL _findcode
MOV P2,R7
; }
; SOURCE LINE # 327
; }
; SOURCE LINE # 328
?C0053:
; //KeyCodeSum -= 0x01;
; SBUF = KeyCodeBuff[0x00];//發送鍵值
; SOURCE LINE # 330
MOV SBUF,KeyCodeBuff
; // KeyCodeSum += 0x01;
; //KeyCodeSum = 0; //
; // KeyExtendFlag = 0;
; EA=1;
; SOURCE LINE # 334
SETB EA
; }
; SOURCE LINE # 335
RET
; END OF KeyTransmit
CSEG AT 0000BH
LJMP timer0
; /*********************************************************/
; //函數:timer0()
; //功能:定時器0中斷
; //輸入:
; //輸出:
; //描述:
; /*********************************************************/
; void timer0(void) interrupt 1 using 3
RSEG ?PR?timer0?PS2_BIN
USING 3
timer0:
PUSH ACC
PUSH DPH
PUSH DPL
PUSH PSW
USING 3
MOV PSW,#018H
; SOURCE LINE # 343
; {
; unsigned char compare=0x00;
; SOURCE LINE # 345
;---- Variable 'compare?443' assigned to Register 'R7' ----
CLR A
MOV R7,A
; switch(dat[0x00])
; SOURCE LINE # 346
MOV A,dat
ADD A,#020H
JNZ ?C0066
;
; case 0xe0: //是擴展鍵嗎?
; SOURCE LINE # 348
?C0061:
; for(compare=0x00;compare<100;compare++)
; SOURCE LINE # 349
MOV R7,#00H
?C0062:
; {
; SOURCE LINE # 350
; if(dat[0x01]==e0_keyval[compare])break;
; SOURCE LINE # 351
MOV A,R7
MOV DPTR,#e0_keyval
MOVC A,@A+DPTR
XRL A,dat+01H
JZ ?C0066
; }
; SOURCE LINE # 352
?C0064:
INC R7
CJNE R7,#064H,?C0062
; }
; SOURCE LINE # 353
?C0066:
POP PSW
POP DPL
POP DPH
POP ACC
RETI
; END OF timer0
CSEG AT 00003H
LJMP ex0
; /*********************************************************/
; //函數:ex0()
; //功能:外部中斷0服務程序
; //輸入:
; //輸出:
; //描述:
; /*********************************************************/
; void ex0() interrupt 0 using 3
RSEG ?PR?ex0?PS2_BIN
USING 3
ex0:
PUSH ACC
PUSH PSW
USING 3
MOV PSW,#018H
; SOURCE LINE # 361
; { //時鐘線變低
; unsigned char bitCount;
; unsigned char KeyCode = 0;
; SOURCE LINE # 364
;---- Variable 'KeyCode?545' assigned to Register 'R7' ----
CLR A
MOV R7,A
; if(KeyCodeSum < MAXBUFFER) KeyCodeBuff[KeyCodeSum] = 0;
; SOURCE LINE # 365
MOV A,KeyCodeSum
CLR C
SUBB A,#0FH
JNC ?C0067
MOV A,#LOW (KeyCodeBuff)
ADD A,KeyCodeSum
MOV R0,A
MOV @R0,#00H
?C0067:
; for(bitCount = 8; bitCount != 0; bitCount --) // 把起始位算入
; SOURCE LINE # 366
;---- Variable 'bitCount?544' assigned to Register 'R6' ----
MOV R6,#08H
?C0068:
; {
; SOURCE LINE # 367
?C0071:
; WAITFORKEYBOARDPULSE; // 等待一個有效的下跳沿
; SOURCE LINE # 368
JNB scl,?C0071
?C0073:
JB scl,?C0073
?C0074:
; KeyCode >>= 1; // 按照PS2格式,數據低位在前
; SOURCE LINE # 369
MOV A,R7
CLR C
RRC A
MOV R7,A
; scl = 1;
; SOURCE LINE # 370
SETB scl
; sda = 1;
; SOURCE LINE # 371
SETB sda
; if(sda == 1)
; SOURCE LINE # 372
JNB sda,?C0070
; {
; SOURCE LINE # 373
; KeyCode |= 0x80; // 得到有效的數據位
; SOURCE LINE # 374
ORL AR7,#080H
; }
; SOURCE LINE # 375
; }
; SOURCE LINE # 376
?C0070:
DJNZ R6,?C0068
?C0076:
; WAITFORKEYBOARDPULSE; // 等待按鍵發送效驗位
; SOURCE LINE # 377
JNB scl,?C0076
?C0078:
JB scl,?C0078
?C0080:
; WAITFORKEYBOARDPULSE; // 等待按鍵發送終止位
; SOURCE LINE # 378
JNB scl,?C0080
?C0082:
JB scl,?C0082
?C0084:
; while(!scl); // 等待鍵盤把時鐘線拉高
; SOURCE LINE # 379
JNB scl,?C0084
?C0085:
; switch(KeyCode)
; SOURCE LINE # 380
MOV A,R7
ADD A,#020H
JZ ?C0092
DEC A
JZ ?C0094
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -