/*************************************************************************** 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