共2条
1/1 1 跳转至页

问
各位高手和同仁,我遇到了问题,希望大家帮我解决一下.我写一个液晶显示和键盘的程序.但是只能输入一次,不能第二次输入,不知道为什么.下面是我的程序.
RS EQU P2.5
RW EQU P2.6
E EQU P2.7
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R0,#16
CSH: MOV P1,#01H ;液晶初始化。
LCALL ENABLE
MOV P1,#01H
LCALL ENABLE
MOV P1, #38H
LCALL ENABLE
MOV P1,#0FH
LCALL ENABLE
MOV P1,#06H
LCALL ENABLE
MOV P1,#80H
LCALL ENABLE
;键盘程序。
START:MOV R1,#00H
MOV 21H,#80H
KINP: LCALL KAP /*调用查询函数*/
JNZ KP1 /*调用延时去抖函数*/
LJMP KINP
KP1: LCALL DLY
LCALL KAP /*调用是否松开按键*/
JNZ KP2 /*调用判断按键函数开始*/
LJMP KINP
KP2: MOV R2,#0FEH
KP4: MOV P3,R2
MOV A,P3
JB ACC.4,L1
MOV A,#0
LJMP KP5 /*判断按键函数*/
L1: JB ACC.5,L2
MOV A,#1
LJMP KP5
L2: JB ACC.6,L3 /*A存储相对偏移量*/
MOV A,#2
LJMP KP5
L3: JB ACC.7,NEXT
MOV A,#3
KP5: MOV B,A /*先将A 的值放在B 中*/
LCALL JS
MOV A,B
ADD A,R4 /*保存键值*/
MOV 20H,A
MOV R4,#0
KP3: LCALL KAP /*显示调用*/
JNZ KP3
POP ACC
MOV R3,A
LCALL XIANSHI
LCALL DELAY
LCALL KINP
NEXT: MOV A,R2
RL A
MOV R2,A /*列值判断函数*/
JNB ACC.4,START
INC R1
LJMP KP4
KAP: MOV P3,#0F0H /*查询函数*/
MOV A,P3
CPL A
ANL A,#0F0H
RET
DLY: MOV R5,#14H /*延时函数*/
DL: MOV R7,#0FFH
LS: DJNZ R7,LS
DJNZ R5,DL
RET
JS: MOV DPTR,#BDS /*基数的首地址*/
MOV A,R1 /*查基数函数*/
MOVC A,@A+DPTR
MOV R4,A
RET
XIANSHI:MOV A,20H /*显示函数*/
MOV DPTR,#DISPTABLE
MOVC A,@A+DPTR
LCALL DISP
MOV R4,#255
D4:MOV R5,#255
D3:DJNZ R5,DELAY
DJNZ R4,D4
INC 21H
MOV A,21H
MOV P1,A
LCALL ENABLE
CJNE A,#90H,RET1
LJMP D5
RET1: RET
ENABLE:CLR RS
CLR RW
CLR E
NOP
LCALL DELAY
SETB E
RET
DISP: MOV P1,A
SETB RS
CLR RW
CLR E
NOP
NOP
LCALL DELAY
SETB E
RET
DELAY: MOV R7,#255
D1:MOV R6,#255
D2:DJNZ R6,D2
DJNZ R7,D1
RET
D5:MOV 21H,#80H
RET
BDS: DB 0H,4H,8H,0CH /*基数*/
DISPTABLE:DB 43H,38H,34H,30H,44H,39H,35H,31H,45H,41H,36H,32H,46H,42H,37H,33H /*键符*/
END 答 1: 没仔细看不过LCALL KINP有问题,kinp并非一个子程序。
RS EQU P2.5
RW EQU P2.6
E EQU P2.7
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R0,#16
CSH: MOV P1,#01H ;液晶初始化。
LCALL ENABLE
MOV P1,#01H
LCALL ENABLE
MOV P1, #38H
LCALL ENABLE
MOV P1,#0FH
LCALL ENABLE
MOV P1,#06H
LCALL ENABLE
MOV P1,#80H
LCALL ENABLE
;键盘程序。
START:MOV R1,#00H
MOV 21H,#80H
KINP: LCALL KAP /*调用查询函数*/
JNZ KP1 /*调用延时去抖函数*/
LJMP KINP
KP1: LCALL DLY
LCALL KAP /*调用是否松开按键*/
JNZ KP2 /*调用判断按键函数开始*/
LJMP KINP
KP2: MOV R2,#0FEH
KP4: MOV P3,R2
MOV A,P3
JB ACC.4,L1
MOV A,#0
LJMP KP5 /*判断按键函数*/
L1: JB ACC.5,L2
MOV A,#1
LJMP KP5
L2: JB ACC.6,L3 /*A存储相对偏移量*/
MOV A,#2
LJMP KP5
L3: JB ACC.7,NEXT
MOV A,#3
KP5: MOV B,A /*先将A 的值放在B 中*/
LCALL JS
MOV A,B
ADD A,R4 /*保存键值*/
MOV 20H,A
MOV R4,#0
KP3: LCALL KAP /*显示调用*/
JNZ KP3
POP ACC
MOV R3,A
LCALL XIANSHI
LCALL DELAY
LCALL KINP
NEXT: MOV A,R2
RL A
MOV R2,A /*列值判断函数*/
JNB ACC.4,START
INC R1
LJMP KP4
KAP: MOV P3,#0F0H /*查询函数*/
MOV A,P3
CPL A
ANL A,#0F0H
RET
DLY: MOV R5,#14H /*延时函数*/
DL: MOV R7,#0FFH
LS: DJNZ R7,LS
DJNZ R5,DL
RET
JS: MOV DPTR,#BDS /*基数的首地址*/
MOV A,R1 /*查基数函数*/
MOVC A,@A+DPTR
MOV R4,A
RET
XIANSHI:MOV A,20H /*显示函数*/
MOV DPTR,#DISPTABLE
MOVC A,@A+DPTR
LCALL DISP
MOV R4,#255
D4:MOV R5,#255
D3:DJNZ R5,DELAY
DJNZ R4,D4
INC 21H
MOV A,21H
MOV P1,A
LCALL ENABLE
CJNE A,#90H,RET1
LJMP D5
RET1: RET
ENABLE:CLR RS
CLR RW
CLR E
NOP
LCALL DELAY
SETB E
RET
DISP: MOV P1,A
SETB RS
CLR RW
CLR E
NOP
NOP
LCALL DELAY
SETB E
RET
DELAY: MOV R7,#255
D1:MOV R6,#255
D2:DJNZ R6,D2
DJNZ R7,D1
RET
D5:MOV 21H,#80H
RET
BDS: DB 0H,4H,8H,0CH /*基数*/
DISPTABLE:DB 43H,38H,34H,30H,44H,39H,35H,31H,45H,41H,36H,32H,46H,42H,37H,33H /*键符*/
END 答 1: 没仔细看不过LCALL KINP有问题,kinp并非一个子程序。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |