📄 keypad lcd display based on interrupt.asm
字号:
;只有两个功能键,一个设置键,按下后,将后面的按键放入50H、51H
;二次按下此键将此后按下的两个键值 合并保存在52H,
;取消键功能:清零50H、51H
;
ORG 0000H
AJMP START
ORG 0013H
AJMP INT1
ORG 0100H
START:MOV SP,#60H
CLR F0
MOV R0,#40H;设置随机数字暂存首地址40H41H;50H为确认数据首地址50H51H ,保存的数字
MOV R1,#50H ;放到52H里面
MOV A,#0FH
MOV P1,A
MOV A,#38H ;FUNC:DL=1 FOR BITS,N=1 FOR 2 LINES
LCALL OUTI
MOV A,#01H ;CLEAR SCREEN
LCALL OUTI
MOV A,#0FH ;ON DISPLAY
LCALL OUTI
MOV A,#06H ;AC INCREMENT
LCALL OUTI
MOV A,#85H ;DDRAM ADDRESS
LCALL OUTI
MOV A,#57H
LCALL OUTD
LCALL MS40
MOV A,#45H
LCALL OUTD
LCALL MS40
MOV A,#4CH
LCALL OUTD
LCALL MS40
MOV A,#43H
LCALL OUTD
LCALL MS40
MOV A,#4FH
LCALL OUTD
LCALL MS40
MOV A,#4DH
LCALL OUTD
LCALL MS40
MOV A,#45H
LCALL OUTD
LCALL MS40
MOV A,#01H
LCALL OUTI
SETB IT1
SETB EX1
SETB EA
JMP $
INT1:CLR EA
ACALL DELAY3 ;键盘延时去抖动
JB P3.3,RETURN
ROW0:JB P1.3,ROW1
MOV R2,#00H
AJMP CIRCLE
ROW1:JB P1.2,ROW2
MOV R2,#01H
AJMP CIRCLE
ROW2:JB P1.1,RETURN
MOV R2,#02H
;上面是判断那一列按下
CIRCLE:
MOV A,#0EFH ;P1.4行为低电平,其他为高电平
MOV P1,A ;
JB P3.3,ONE ;
MOV A,#00H ;在第一行,显示1
AJMP LKP
ONE:MOV A,#0DFH
MOV P1,A
JB P3.3,TWO
MOV A,#03H ;在第二行,显示2
AJMP LKP
TWO: MOV A,#0BFH
MOV P1,A
JB P3.3,FOUR
MOV A,#06H ; 在第三行,显示3
AJMP LKP
FOUR:MOV A,#7FH
MOV P1,A
JB P3.3,RETURN
MOV A,#09H ;在第四行,显示4
LKP:ADD A,R2
CLR C
MOV R5,A
SUBB A,#0AH
JNC MATH ;转去功能键处理
MOV A,R5
LCALL DATE;调用数据键处理,包括显示
AJMP SS
MATH:LCALL SHEZHI
JNC SECOND ;第二次按下,保存按下的内容合并保存在52H
MOV A,#01H
LCALL OUTI
AJMP SS
CANCLE:LCALL CANCLE1
AJMP SS
SECOND:ACALL HEBING
MOV A,#01H
LCALL OUTI
SS:PUSH A ;等待按键释放
MOV A,#0FH
MOV P1,A
ACALL DELAY
POP A
JNB P3.3,SS;按键没有释放,则循环等待
RETURN: SETB EA
RETI
;下面全部为子程序
DELAY:MOV R3,#0A0H
DELAY1:MOV R4,#0FFH
DELAY2:DJNZ R4,DELAY2
DJNZ R3,DELAY1
RET
DELAY3:MOV R7,#20 ;6MHz晶振,延时10ms
DEL1:MOV R6,#123
NOP
DEL2:DJNZ R6,DEL2
DJNZ R7,DEL1
RET
HEBING:ANL 50H,#0FH
MOV A,50H
SWAP A
ANL 51H,#0FH
ORL A,51H
MOV 52H,A
RET
DATE: PUSH A
JB F0,LL;已经按下功能键,转LL,将数据保存在50H,和51H里面
MOV @R0,A ;如果没有按下功能键,则数据保存在以40H为首地址的空间里
INC R0
AJMP PP
LL:MOV @R1,A ;数据保存部分
INC R1
CLR C
MOV A,R1
SUBB A,#52H
JC LL1
MOV R1,#50H
LL1:
CJNE R1,#51H,NEXT ;如果现在是在R1=50H,则显示在第一个位置,否则显示在第二个位置
MOV A,#80H
LCALL OUTI
AJMP PP
NEXT:MOV A,#81H
LCALL OUTI
PP: POP A
ADD A,#30H
LCALL OUTD
RET
SHEZHI:MOV A,R5
CJNE A,#0AH,CANCLE ;如果不等于0AH则转去取消键功能
CLR C ;等于0AH则为设置键,
CPL F0 ;第一次按下设置键?
MOV C,F0
RET
CANCLE1:CLR F0
MOV 50H,#00H ;取消功能,存储区域清零,但53H里面不变
MOV 51H,#00H
MOV R1,#50H
MOV A,#01H
LCALL OUTI
RET
OUTI:CLR P3.1
CLR P3.1
CLR P3.2
CLR P3.2
SETB P3.0
SETB P3.0
MOV P2,A
MOV P2,A
CLR P3.0
CLR P3.0
MOV R4,#02H ;DELAY 1MS
TM4: MOV R5,#0FFH
TM5: DJNZ R5,TM5
DJNZ R4,TM4
RET
;OUT DATA
OUTD:SETB P3.2
SETB P3.2
CLR P3.1
CLR P3.1
SETB P3.0
SETB P3.0
MOV P2,A
MOV P2,A
CLR P3.0
CLR P3.0
MOV R4,#0FFH ;DELAY 0.5MS
TM2: DJNZ R4,TM2
RET
MS40:MOV R4,#0FFH ;DELAY ABOUT 132MS
MS2: MOV R5,#0FFH
MS1: DJNZ R5,MS1
DJNZ R4,MS2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -