;动态按键扫描程序,必须使用P2口,因为P3口有下载线
;P3.7为蜂鸣器
;P0,P1两个端口的灯共计16个,分别由16个
;按键控制点亮
;--------清端口-------------------------------------
MOV P0,#0FFH;关灯
MOV P1,#0FFH;关灯
CLR P3.7;关蜂鸣器
;---------按钮是否按下识别--------------------------
KAI:MOV P2,#00001111B;横坐标加1,纵坐标加0
MOV A,P2;将按键值读回到累加器A
CJNE A,#00001111B,SAO1;判断按键是否按下
AJMP KAI
;---------读取按键值------------------------------------------
SAO1:MOV B,A;将外部按键数据存入B寄存器,横坐标值
MOV P2,#11110000B;将纵坐标值传送到P3口
MOV A,P2;读出纵坐标值
ORL A,B;将横纵坐标值相加,和存入A中
MOV 40H,A;将第一次读取的按键值存入到内存40H单元
;---------------------------------------------------------------
LCALL YAN
;--------二次按键值读取-----------------------------------------
SAO2:MOV P2,#00001111B
MOV A,P2
CJNE A,#00001111B,SAO3
AJMP KAI
;-------------------------------------------------------
SAO3:MOV B,A
MOV P2,#11110000B
MOV A,P2
ORL A,B;再次读取的按键值相加
MOV 41H,A;将第二次读出的按键值存入41H内存单元
;-----两次读取的值比较确定是否一致----------------------
BIJIAO: CJNE A,40H,KAI
AJMP BBBB;将第一次与第二次读取的值做比较,看是否一样
;---------将按键值转换为按键号码-----------------------
PANDUAN:INC R7
AJMP AAAA
BBBB:MOV R7,#00D;按键号码
MOV R6,#16D;需要判断16个按键
AAAA:MOV A,R7
MOV DPTR,#TAB;装入按键数据表
MOVC A,@A+DPTR
CJNE A,40H,CUO
AJMP ZHIXING
CUO:DJNZ R6,PANDUAN;按键值判断16次限位
AJMP KAI
;---------功能执行-------------------------------------
ZHIXING:CJNE R7,#1D,JIAN2
CPL P0.0
LCALL FENG
LJMP DENG
JIAN2:CJNE R7,#2D,JIAN3
CPL P0.1
LCALL FENG
LJMP DENG
JIAN3:CJNE R7,#3D,JIAN4
CPL P0.2
LCALL FENG
LJMP DENG
JIAN4:CJNE R7,#4D,JIAN5
CPL P0.3
LCALL FENG
LJMP DENG
JIAN5:CJNE R7,#5D,JIAN6
CPL P0.4
LCALL FENG
LJMP DENG
JIAN6:CJNE R7,#6D,JIAN7
CPL P0.5
LCALL FENG
LJMP DENG
JIAN7:CJNE R7,#7D,JIAN8
CPL P0.6
LCALL FENG
LJMP DENG
JIAN8:CJNE R7,#8D,JIAN9
CPL P0.7
LCALL FENG
LJMP DENG
JIAN9:CJNE R7,#9D,JIAN10
CPL P1.0
LCALL FENG
LJMP DENG
JIAN10:CJNE R7,#10D,JIAN11
CPL P1.1
LCALL FENG
LJMP DENG
JIAN11:CJNE R7,#11D,JIAN12
CPL P1.2
LCALL FENG
LJMP DENG
JIAN12:CJNE R7,#12D,JIAN13
CPL P1.3
LCALL FENG
LJMP DENG
JIAN13:CJNE R7,#13D,JIAN14
CPL P1.4
LCALL FENG
LJMP DENG
JIAN14:CJNE R7,#14D,JIAN15
CPL P1.5
LCALL FENG
LJMP DENG
JIAN15:CJNE R7,#15D,JIAN16
CPL P1.6
LCALL FENG
LJMP DENG
JIAN16: CPL P1.7
LCALL FENG
LJMP DENG
;--------等待按钮释放服务程序----------------------------
DENG:MOV P2,#11110000B
MOV A,P2
CJNE A,#11110000B,DENG
LJMP KAI
;-----蜂鸣器服务程序----------------------------------------
FENG:CPL P3.7
MOV R2,#5D
SS: LCALL YAN
DJNZ R2,SS
CPL P3.7
RET
;-----延时服务程序----------------------------
YAN:MOV R0,#250D
YANA:MOV R1,#100D
DJNZ R1,$
DJNZ R0,YANA
RET
;--------按键数据表---------------------------
TAB:DB 7EH,0BEH,0DEH,0EEH
DB 7DH,0BDH,0DDH,0EDH
DB 7BH,0BBH,0DBH,0EBH
DB 77H,0B7H,0D7H,0E7H
END
|