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






