液晶显示:8位输入器16位键盘显示输入的字符
RS EQU p2.0;液晶接口的定义 RW EQU p2.1 E EQU p2.2 MAIN: org 0000h 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
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 ;CALL WRITE2 JMP KEY CLEAR: MOV p0,#080H;清除6个数为000000 CALL ENABLE MOV R7,#08H 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
end |