***************************************************************************
006.asm
讀入獨立鍵盤上的按鍵,并把相應的LED燈點亮,若一段時間無按鍵,剛循環(huán)點亮LED
接線:P0口接八位LED
P2口接八位獨立按鍵
定時器T0計時,中斷方式
***************************************************************************/
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INT_T0
ORG 0100H
MAIN: ;主程序入口
MOV SP,#50H ;設置堆棧
MOV TMOD,#01H ;設置定時模式
MOV TH0,#15H ;賦定時初值
MOV TL0,#9FH
CLR 20H.0 ;初始化按鍵標志
MOV R2,#0FFH ;初始化鍵值
MOV R3,#01H ;初始化循環(huán)閃鑠初值
MOV R4,#00H ;初始化定時初值
SETB TR0 ;啟動定時器
MOV IE,#82H ;開中斷
LOOP:
LCALL KEY_READ ;掃描鍵盤
L1: JB 20H.0,LIGH ;有鍵輸入,則去點亮相應LED
JBC 20H.0,LOOP
MOV A,R4
CJNE A,#0C8H,LOOP ;否則去判斷定時是否到,定時到,循環(huán)點亮八位LED
LCALL LEED
LJMP L1
/*點亮相應LED*/
LIGH:
MOV A,R2 ;取鍵值
MOV P0,A ;輸出
RET
/*循環(huán)點亮LED*/
LEED:
MOV A,R3
LOOP1:
CPL A
MOV P0,A
LCALL KEY_READ
JB 20H.0,RETUN0
MOV R0,#0FFH
LCALL DELAY
MOV A,R3
RL A
MOV R3,A
CJNE A,#80H,LOOP1
LOOP2:
CPL A
MOV P0,A
LCALL KEY_READ
JB 20H.0,RETUN0
MOV R0,#0FFH
LCALL DELAY
MOV A,R3
RR A
MOV R3,A
CJNE A,#01H,LOOP2
SJMP LOOP1
RETUN0:
RET
/*鍵盤掃描程序*/
KEY_READ:
CLR EA ;掃描鍵盤時關定時中斷
MOV A,P2
CJNE A,#0FFH,DE
LJMP RETUN
DE: MOV R0,#8AH
LCALL DELAY
MOV A,P2
CJNE A,#0FFH,DE0
LJMP RETUN
DE0:MOV R2,A
SETB 20H.0
MOV R4,#00H
DE1:MOV A,P2
CJNE A,#0FFH,DE1
RETUN:
SETB EA
RET
/*中斷子程序*/
INT_T0:
CLR EA
PUSH ACC
MOV TH0,#15H ;重賦定時初值
MOV TL0,#9FH
INC R4
POP ACC
SETB EA
RETI
/*延時子程序 */
DELAY:
D1: MOV R1,#0FFH
D0: DJNZ R1,D0
DJNZ R0,D1
RET
END