资源描述
******************************************************************************
;键盘程序:从4×4键盘读取键值,显示在数码管上,格式为000X。
LEDDATA EQU P1.0 ;显示电路接口数据线
LEDCLK EQU P1.1 ;显示电路接口时钟线
LEDBUF1 EQU 30H ;显示缓冲区
LEDBUF2 EQU 31H
LEDBUF3 EQU 32H
LEDBUF4 EQU 33H
ADDR_KEY EQU 8040H ;键盘地址
KEY_TMP EQU 70H ;键特征码暂存单元
;*********************************************************************************
;主程序
;*******************************************************************************
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: LCALL CLEARDISP ;清显示器
START: LCALL KEY ;进入键盘子程序
CJNE A, #0FFH, DISPA ;有键按下进入显示
SJMP START
DISPA: MOV LEDBUF1, A ;显示缓冲区装入显示数据
MOV LEDBUF2, #00H
MOV LEDBUF3, #00H
MOV LEDBUF4, #00H
LCALL DISPNUMBER ;进入显示子程序
LJMP START ;程序重复
;*******************************************************************************
;清显示器程序,即将所有显示器“灭”。
;******************************************************************************
CLEARDISP: MOV R0, #04H ;四位显示器
CLEARDISP_0: MOV A, #0FFH ;灯灭数据
LCALL SENDDATA ;传送一个字节数据到显示电路
DJNZ R0, CLEARDISP_0;四位传送完成了吗?
RET
;********************************************************************************
;输出一个字节数据到74LS164
;*******************************************************************************
SENDDATA: PUSH 01H
CPL A
MOV R1, #08H
SENDDATA_0: CLR C
RRC A
MOV LEDDATA, C ;送一位到74LS164
CLR LEDCLK ;产生时钟
SETB LEDCLK
DJNZ R1, SENDDATA_0;一个字节传完吗?
POP 01H
RET
;***********************************************************************************
;键盘子程序
;功能:有键闭合,键值存放在A中,否则将无键闭合标志FFH送A。
;键值计算采用查表指令
;入口参数: 无;出口参数: ACC R2—R7 DPTR KEY-TMP单元
;**********************************************************************************
KEY: LCALL KS1 ;检测键盘有无键按下
JNZ LK1 ;有转LK1
LJMP MK8 ;无转MK8
LK1: LCALL DL10MS ;延时消抖动
LCALL DL10MS
LCALL KS1 ;键稳定闭合吗?
JNZ LK2 ;是
LJMP MK8 ;不是
LK2: MOV R3 #00H ;行计数器清零
MOV R2, #0FEH ;从0行开始扫描键盘
LK3: MOV DPTR, # ADDR_KEY;键盘地址
MOV A, R2
MOVX @DPTR, A ;送出行信号
MOVX A, @DPTR ;读入键状态
ANL A, #0F0H ;屏蔽低四位
MOV R4, A ;暂存
CJNE A, #0F0H, LK4;行有键按下吗?有
MOV A, R2 ;无
JNB ACC.7 MK8 ;四行扫描完成了吗?干扰
RL A ;未完修改行代码
MOV R2, A
INC R3 ;行计数器加1
SJMP LK3 ;继续进行行扫描
LK4: MOV A, R3 ;某行有键按下时,行计数器送A
ADD A, R4 ;形成键特征代码
MOV R2, A ;暂存R2
MAKE_KEY: MOV R3, #00H ;键序号计数器
MOV DPTR, #TAB_KEY;键特征码表首地址
MOV R4, #16 ;16个键
CLR A ;从0开始查找
MOVC A, @A+DPTR ;查表
MOV KEY-TMP , A ;暂存于KEY-TMP单元
MOV A, R2
CJNE A, KEY-TMP, MK6;比较(不相同)
LK7: LCALL DL10MS ;相同时等待键释放
LCALL KS1
JNZ LK7
LCALL DL10MS;延时消抖动
LCALL DL10MS
MOV A, R3 ;键值送A
RET
MK6: INC R3 ;查下一个
INC DPTR
DJNZ R4, MK4 ;查完了吗?
MK8: MOV A, #0FFH;未按下或未找到
RET
;***********************************************************************************
;键盘检测程序
;************************************************************************************
KS1: MOV DPTR, #ADDR_KEY ;键盘地址
MOV A, #0F0H ;全键检测
MOVX @DPTR, A ;送出
MOVX A, @DPT ;读入
ANL A, #0F0H ;处理
ORL A, #0FH
CPL A ;A=0无键按下。
RET
;*************************************************************************************
;延时程序
;*************************************************************************************
DL10MS: MOV R6, #20
DTEMP: MOV R7, #0A7H
DJNZ R7, $
DJNZ R6, DTEMP
RET
;************************************************************************************
;显示程序:将缓冲区“LEDBUF1~ LEDBUF4”里的实据转换为字型代码送显示电路显示。
;*************************************************************************************
DISPNUMBER:MOV R0, #LEDBUF1 ;设置缓冲区地址
MOV R1, #04H ;四位显示器
DISPNUMBER_0: MOV A, @R0 ;取数
MOV DPTR, #TABLE
MOVC A, @A+DPTR ;查表
LCALL SENDDATA ;送出
INC R0
DJNZ R1, DISPNUMBER_0;四位送完了吗?
RET
;**********************************************************************************
;键特征码表,对应数字为键值。
;***********************************************************************************
TAB_KEY: DB 073H, 072H, 071H, 070H
; 0 1 2 3
DB 0B3H, 0B2H, 0B1H, 0B0H
;4 5 6 7
DB 0D3H,0D2H, 0D1H, 0D0H
;8 9 A B
DB 0E3H, 0E2H, 0E1H, 0E0H
;C D E F
;************************************************************************************
;字型码表
;*************************************************************************************
TABLE: DB 011H
DB 0D7H
DB 032H
DB 092H
DB 0D4H
DB 098H
DB 018H
DB 0D3H
DB 010H
DB 090H
DB 050H
DB 01CH
DB 039H
DB 016H
DB 038H
DB 078H
;************************************************************************************
END
展开阅读全文