;******************************************************************************** ;1602液晶矩阵按键输入器:键盘P1口,按键液晶显示数字 最后键全屏幕清除显示* * ;******************************************************************************** ;* 日期: 2007-3-25 * ;* 版本: 3.0 * ;* 作者: 深圳学林电子有限公司 专业8051单片机教程站 * ;* 邮箱: sxj1974@163.com * ;* 网站: http://www.51c51.com http://www.8951.com 更多例程请登陆网站 * ;******************************************************************************** ;* 硬件:此程序在本公司xlisp系列单片机实验仪运行通过 * ;******************************************************************************** ;* 【版权】 Copyright(C)深圳学林电子有限公司 www.51c51.com All Rights Reserved * ;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! * ;********************************************************************************
RS EQU p2.0 ;液晶接口的定义 RW EQU p2.1 E EQU p2.2 MAIN: org0000h MOV SP ,#70H ;设置堆栈 MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE MOV p0,#080H ;第二行的位置 CALL ENABLE MOV p0,#01H ;清屏 CALL ENABLE KEY: LCALL KS ;调用检测按键子程序 JNZ K1 ;有键按下继续 LCALL DELAY2 ;无键按下调用延时去抖动程序 AJMP KEY ;返回继续检测有无按键按下 K1: LCALL DELAY2 LCALL DELAY2 ;有键按下继续延时去抖动 LCALL KS ;再一次调用检测按键程序 JNZ K2 ;确认有按下进行下一步 AJMP KEY ;无键按下返回继续检测 K2:MOV R2,#0EFH ;将扫描值送入 R2暂存 MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列值。 K3:MOV P1,R2 ;将R2的值送入P1口 L6:JB P1.0,L1 ;P1.0等于1跳转到L1 MOV A,#00H ;将第一行的行值00H送入ACC AJMP LK ;跳转到键值处理程序 L1:JB P1.1,L2 ;P1.1等于1跳转到L2 MOV A,#04H ;将第二行的行值送入ACC AJMP LK ;跳转到键值理程序进行键值处理 L2: JB P1.2,L3 ;P1.2等于1跳转到L3 MOV A,#08H ;将第三行的行值送入ACC AJMP LK ;跳转到键值处理程序 L3:JB P1.3,NEXT ;P1.3等于1跳转到NEXT处 MOV A,#0cH ;将第四行的行值送入ACC LK:ADD A,R4 ;行值与列值相加后的键值送入A PUSH ACC ;将A中的值送入堆栈暂存 K4: LCALL DELAY2 ;调用延时去抖动程序 LCALL KS ;调用按键检测程序 JNZ K4 ;按键没有松开继续返回检测 POP ACC ;将堆栈的值送入ACC MOV DPTR,#TABLE3 MOVC A,@A+DPTR MOV R1,A CALL WRITE2 XRL A,#44H JZ CLEAR JMP KEY CLEAR: MOV p0,#80H ;清除6个数为000000 CALL ENABLE MOV R7,#0F1H A2: MOV A,#2AH ;2Ah是*0的ascii码 CALL WRITE2 DJNZ R7,A2 MOV p0,#80H ;光标返回 CALL ENABLE JMP KEY RET NEXT: INC R4 ;将列值加一 MOV A,R2 ;将R2的值送入A JNB ACC.7,KEY ;扫描完成跳至KEY处进行下一回合的扫描 RL A ;扫描未完成将A中的值右移一位进行下一列的扫描 MOV R2,A ;将ACC的值送入R2暂存 AJMP K3 ;跳转到K3继续 KS:MOV P1,#0FH ;将P1口高四位置0低四位值1 MOV A,P1 ;读P1口 XRL A,#0FH ;将A中的值与A中的值相异或 RET ;子程序返回 DELAY2: ;40ms延时去抖动子程序8*FA*2=40ms MOV R5,#08H L7:MOV R6,#0FAH L8:DJNZ R6,L8 DJNZ R5,L7 RET ENABLE: CLR RS ;送命令 CLR RW CLR E ACALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1 ;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET DELAY: MOV R4,#05 D1:MOV R5,#0FFH DJNZ R5,$ DJNZ R4,D1 RET TABLE3:DB 44H,23H,30H,2AH,43H,39H,38H,37H,42H,36H,35H,34H,41H,33H,32H,31H,00H END
hex格式文件下载(点右键,目标另存为hex即可直接烧写)

|