/*************************************************************************** 006.asm 讀入獨立鍵盤上的按鍵,并把相應的LED燈點亮,若一段時間無按鍵,剛循環點亮LED 接線:P0口接八位LED P2口接八位獨立按鍵 定時器T0計時,中斷方式 2010.09.04 ***************************************************************************/ 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 ;初始化循環閃鑠初值 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 ;否則去判斷定時是否到,定時到,循環點亮八位LED LCALL LEED LJMP L1 /*點亮相應LED*/ LIGH: MOV A,R2 ;取鍵值 MOV P0,A ;輸出 RET /*循環點亮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