ORG 0000H
SJMP STAR
ORG 000BH
LJMP KEYS
ORG 0050H
STAR:MOV SCON,#50H ;設(shè)置串行接口方式1,允許接收
MOV TMOD,#01H ;設(shè)置T0方式一
MOV PCON,#0H ;波特率不加倍
MOV TH1,#0ECH ;5ms中斷檢查一次
MOV TL1,#78H
SETB EA
SETB ET0;開中斷
SETB TR0
CLR ES ;禁止串行口中斷
MOV SP,#5FH
ACALL DLY
MOV A,SBUF ;接收乙機數(shù)據(jù)
JNB RI,$ ;等待接收完一幀數(shù)據(jù)
CLR RI
D0: JNB ACC.0, D1
MOV 10H,A
SJMP K1
D1: JNB ACC.1,D2
MOV 10H,A
SJMP A1
D2: JNB ACC.2 ,KEYS
MOV 10H,A
SJMP B1
K1 : MOV A, #0FEH ; 從右向左流水燈顯示
MOV R0,#08H
K2 : MOV P0,A
RL A
LCALL DELAY
DJNZ R0,K2
SJMP K1
A1: MOV A, #07FH ; 從左向右流水燈顯示
MOV R0,#08H
A2 : MOV P0,A
RR A
LCALL DELAY
DJNZ R0,A2
SJMP A1
B1 : MOV A, #03FH ; 兩個燈從下到上流水顯示
MOV R0,#04H
B2 : MOV P0,A
RR A
RR A
LCALL DELAY
DJNZ R0, B2
SJMP B1
KEYS:MOV TH1,#0ECH ;5ms中斷檢查一次
MOV TL1,#78H
MOV R0,#4
MOV R1,#11101111B ;行顯示
MOV R2,#11111111B
SNEXT:MOV A,R1 ;送出行掃描碼
MOV P1,A
MOV A,P1 ;讀鍵狀態(tài)
ORL A,#0F0H
CJNE A,#0FFH,KEYIN ;判斷是否按鍵
MOV A,R1
RL A
MOV R1,A ;保存行鍵掃描數(shù)
DJNZ R0,SNEXT
RETI ;沒有按鍵按下則返回斷點
MUU1:LJMP D0
KEYIN:MOV R2,A
ACALL DLY ; 除按鍵抖動并等待按鍵彈起
NOPEN:MOV A,P1
ORL A,#0F0H
CJNE A,#0FFH,NOPEN ;鍵未彈起,轉(zhuǎn)NOPEN等待彈起
LCALL DLY
LCALL KEYV ;將掃描碼換成按鍵碼
MOV SBUF,A ;發(fā)送數(shù)據(jù)
JNB TI,$ ; 等待一幀發(fā)送完畢
CLR TI
CLR RI
RETI
DLY: MOV R7,#30
MOV R6,#0
S1: DJNZ R6,$
DJNZ R7,S1
RET
KEYV: MOV B,#0 ;B=按鍵碼,賦初值為0
MOV A,R2 ;判斷目前的列數(shù)
C1: RRC A
JNC C2
INC B ;按鍵不在本列,B+4,(ADD只能對A使用)
INC B
INC B
INC B
LJMP C1
C2: MOV A,R1 ;行掃描碼
RR A ;右移4位,高四位到低四位,
RR A
RR A
RR A
C3 : RRC A ;判斷哪一行被按下
JNC C4 ;在當(dāng)前行,轉(zhuǎn)c4
INC B ;非當(dāng)前行,鍵值+1(每一行每個按鍵差1)
LJMP C3
C4: MOV A,B ;(A) = (B)按鍵碼給A
RET ;鍵值判斷子程序返回
DELAY:MOV R7,#100 ; 延時100ms
L0:MOV R6,#250
L1:NOP
NOP
DJNZ R6,L1
DJNZ R7,L0
MOV A,SBUF ;接收乙機數(shù)據(jù)
JNB RI,$ ;等待接收完一幀數(shù)據(jù)
CLR RI
CJNE A,10H,MUU1
RET
END
|