主要扫描矩阵按键,那是我自己写的好多错

qq_32319775 2016-06-08 09:30:20
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME
;**********************;
; 矩阵键盘扫描程序 ;
;**********************;
KEY_SCAN:
MOV P1,#00FH
NOP
MOV R1,P1
CJNE R1,#00FH,KEY_DOWN ;没有按键按下就返回主函数
SJMP DELAY10MS
KEY_DOWN:
ACALL DELAY10MS ;消抖
MOV R1,P1
CJNE R1,#00FH,NEXT0 ;没有按键按下就返回主函数
NEXT0:
CJNE R1,#007H,NEXT1 ;如果不等于007H就跳去检测下一个键值
MOV 70H,#00H ;如果是的话
SJMP NEXT_SCAN
NEXT1:
CJNE R1,#00BH,NEXT2
MOV 70H,#01H
SJMP NEXT_SCAN
NEXT2:
CJNE R1,#00DH,NEXT3
MOV 70H,#02H
SJMP NEXT_SCAN
NEXT3:
CJNE R1,#00EH,MAIN
MOV 70H,#03H
NEXT_SCAN:
MOV P1,#0F0H
MOV R1,P1
CJNE R1,#070H,NEXT4
MOV A,#00H
ADD A,70H
MOV 70H,A
NEXT4:
CJNE R1,#0B0H,NEXT5
MOV A,#04H
ADD A,70H
MOV 70H,A
NEXT5:
CJNE R1,#0D0H,NEXT6
MOV A,#08H
ADD A,70H
MOV 70H,A
NEXT6:
CJNE R1,#0E0H,MAIN
MOV A,#0CH
ADD A,70H
MOV 70H,A
MOV 71H,#030H
KEY_UP:
ACALL DELAY10MS
DJNZ 71H,KEY_UP
;*************;
; 延时程序 ;
;*************;
DELAY10MS:
MOV R6,#015H
DE1:
MOV R7,#0F8H
DE2:
DJNZ R7,DE2
DJNZ R6,DE1
RET

END

;×××××主程序部分:×××××
ORG 0100H
MAIN:MOV SP,#50H
MOV 20H,#00H ;秒钟 BIN
MOV 21H,#00H ;分钟 BIN
MOV 22H,#00H ;小时 BIN
MOV 23H,#01H
MOV 24H,#01H
MOV 25H,#00H
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,#00H
MOV 36H,#01H
MOV 37H,#00H
MOV 38H,#01H
MOV 39H,#00H
MOV TMOD,#01H ;16位计数器
MOV TH0,#03CH ;赋计数初值
MOV TL0,#0B0H
MOV IE,#10000111B
SETB TR0 ;T0启动计数
MOV R2,#14H
LOOP: LCALL TIMEPRO
LCALL DISPLAY1
JB P1.1,M1
LCALL SETTIME ;调用设定时间程序
LJMP LOOP
M1:JB P1.2,M2
LCALL SETATIME
LJMP LOOP
M2:JB P1.4,M4
LCALL LOOKATIME ;调用设定闹钟时间程序
M4:LJMP LOOP
DELAY:MOV R4,#030H ;延时时间
DL00:MOV R5,#0FFH
DL11:MOV R6,#9H
DL12:DJNZ R6,DL12
DJNZ R5,DL11
DJNZ R4,DL00
RET
SETTIME:
L0:LCALL DISPLAY1
MM1: JB P1.2,L1
MOV C,P1.2
JC MM1
LCALL DELAY1 ;调用延时
JC MM1
MSTOP1: MOV C,P1.2
JNC MSTOP1 ;判断P1.2是否释放?释放则继续
LCALL DELAY1 ;调用延时
MOV C,P1.2
JNC MSTOP1
INC 22H ;小时增加1
MOV A,22H
CJNE A,#18H,GO12 ;判断小时是否到24时?未到继续循环
MOV 22H,#00H ;小时复位
MOV 34H,#00H
MOV 35H,#00H
LJMP L0
L1:JB P1.3,L2
MOV C,P1.3
JC L1
LCALL DELAY1 ;延时
JC L1
MSTOP2: MOV C,P1.3
JNC MSTOP2 ;判断P1.3是否释放?释放则继续
LCALL DELAY1 ;调用延时
MOV C,P1.3
JNC MSTOP2
INC 21H ;分钟增加一
MOV A,21H
CJNE A,#3CH,GO11
MOV 21H,#00H ;分钟复位
MOV 32H,#00H
MOV 33H,#00H
LJMP L0
GO11:MOV B,#0AH ;将A中的内容分成高低两部分
DIV AB
MOV 32H,B
MOV 33H,A
LJMP L0
GO12: MOV B,#0AH
DIV AB
MOV 34H,B
MOV 35H,A
LJMP L0
L2:JB P1.4,L0
MOV C,P1.4
JC L2
LCALL DELAY1 ;调用延时
MOV C,P1.4
JC L2
STOP1:
MOV C,P1.4 ;判断按键P1.4是否释放?
JNC STOP1
LCALL DELAY1 ;调用延时
MOV C,P1.4
JNC STOP1
LJMP LOOP
;×××××设置闹钟时间×××××
SETATIME:LCALL DISPLAY2 ;调用时间运行
N0:LCALL DISPLAY2
MM2: JB P1.3,N1 ;判断P1.3是否按下?
MOV C,P1.3
JC MM2
LCALL DELAY1
JC MM2
MSTOP3: MOV C,P1.3 ;判断P1.3是否释放?
JNC MSTOP3
LCALL DELAY1
MOV C,P1.3
JNC MSTOP3
INC 24H ;设定小时增加1
MOV A,24H
CJNE A,#24,GO22
MOV 24H,#00H
MOV 38H,#00H
MOV 39H,#00H
LJMP N0
N1:JB P1.1,N2 ;判断P1.1是否按下?
MOV C,P1.1
JC N1
LCALL DELAY1
JC N1
MSTOP4: MOV C,P1.1 ;判断P1.1是否释放?
JNC MSTOP4
LCALL DELAY1
MOV C,P1.1
JNC MSTOP4
INC 23H ;设定闹钟分钟增加1
MOV A,23H
CJNE A,#60,GO21 ;判断A是否到60分?
MOV 23H,#00H ;分钟复位
MOV 36H,#00H
MOV 37H,#00H
LJMP N0
GO21:MOV B,#0AH ;将A中的内容分成高低两部分
DIV AB
MOV 36H,B
MOV 37H,A
LJMP N0
GO22: MOV B,#0AH
DIV AB
MOV 38H,B
MOV 39H,A
LJMP N0
N2:JB P1.4 ,N0 ;判断P1.4是否按下?
MOV C,P1.4
JC N2
LCALL DELAY1
MOV C,P1.4
JC N2
STOP2: MOV C,P1.4 ;判断P1.4是否释放?
JNC STOP2
LCALL DELAY1
MOV C,P1.4
JNC STOP2
LJMP LOOP
TIMEPRO:MOV A,21H
MOV B,23H
CJNE A,B,BK ;判断分钟是否运行到设定的闹钟的分钟?
MOV A,22H
MOV B,24H
CJNE A,B,BK ;判断时钟是否运行到设定的闹钟的时钟?
SETB 25H.0
MOV C,25H.0
JC XX
XX: LCALL TIMEOUT ;调用时间闹钟响应程序
BK:RET
TIMEOUT:
X1:LCALL BZ ;调用喇叭响应程序
LCALL DISPLAY2
CLR 25H.0
JB P1.4, X1 ;判断P1.4是否按下?
LCALL DELAY
CLR 25H.0
LJMP DISPLAY1
BZ: CLR P3.7 ;喇叭响应程序
MOV R7,#10 ;响应延时时间
T2: MOV R6,#10
T3: DJNZ R6,T3
DJNZ R7,T2
SETB P3.7
RET
LOOKATIME:LCALL DISPLAY2 ;调用时间运行程序
MM: JB P1.4,LOOKATIME ;判断按键P1.4是否按下
MOV C,P1.4
JC MM
LCALL DELAY1
MOV C,P1.4
JC MM
STOP3: MOV C,P1.4
JNC STOP3
LCALL DELAY1
MOV C,P1.4
JNC STOP3
LJMP LOOP
DELAY1: MOV R4,#14H ;时间延时
DL001: MOV R5,#0FFH
DL111: DJNZ R5,DL111
DJNZ R4,DL001
RET
;×××××时间运行程序×××××
TIME: PUSH ACC ;现场保护
PUSH PSW
MOV TH0,#03CH ;赋初值
MOV TL0,#0B0H
DJNZ R2,RET0
MOV R2,#14H
MOV A,20H
CLR C
INC A ;秒钟自加1
CJNE A,#3CH,GO1 ;判断秒钟是否到60秒?
MOV 20H,#0 ;到60秒复位
MOV 30H,#0
MOV 31H,#0
MOV A,21H
INC A ;分钟自加1
CJNE A,#3CH,GO2 ;判断分钟是否到60分?
MOV 21H,#0H ;到60分复位
MOV 32H,#0
MOV 33H,#0
MOV A,22H
INC A ;时钟自加1
CJNE A,#18H,GO3 ;判断时钟是否到24时?
MOV 22H,#00H ;到24时复位
MOV 34H,#0
MOV 35H,#0
AJMP RET0
GO1: MOV 20H,A
MOV B,#0AH
DIV AB
MOV 31H,A
MOV 30H,B
AJMP RET0
GO2: MOV 21H,A
MOV B,#0AH
DIV AB
MOV 33H,A
MOV 32H,B
AJMP RET0
GO3: MOV 22H,A
MOV B,#0AH
DIV AB
MOV 35H,A
MOV 34H,B
AJMP RET0
RET0: POP PSW ;恢复现场
POP ACC
RETI
;×××××运行部分×××××
DISPLAY1: MOV R0,#30H
MOV R3,#0FEH
MOV A,R3
PLAY1: MOV P2,A
MOV A,@R0
MOV DPTR,#DSEG1 ;表首地址送DPTR
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1
MOV P2,#0FFH ;送高电平到P2
MOV A,R3
RL A ;
JNB ACC.6,LD1
INC R0
MOV R3,A
LJMP PLAY1 ;调用查表程序
LD1: RET
DISPLAY2: PUSH ACC ;现场保护
PUSH PSW
MOV R0,#36H
MOV R3,#0FBH
MOV A,R3
PLAY2: MOV P2,A
MOV A,@R0
MOV DPTR,#DSEG1 ;表首地址送DPTR
MOVC A,@A+DPTR ;查ASCII特码
MOV P0,A ;查表结果送A
LCALL DL1
MOV P2,#0FFH ;送高电平到P2
MOV A,R3
RL A
JNB ACC.6,LD2
INC R0
MOV R3,A
LJMP PLAY2
LD2: POP PSW ;恢复现场
POP ACC
RET
;×××××延时时间×××××
DL1: MOV R7,#02H ;延时时间
DL: MOV R6,#0200H
DL6: DJNZ R6,$
DJNZ R7,DL
RET
DSEG1:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END


Build target 'Target 1'
assembling huibian.asm...
huibian.asm(2): error A45: UNDEFINED SYMBOL (PASS-2)
huibian.asm(4): error A45: UNDEFINED SYMBOL (PASS-2)
huibian.asm(31): error A45: UNDEFINED SYMBOL (PASS-2)
huibian.asm(51): error A45: UNDEFINED SYMBOL (PASS-2)
huibian.asm(74): warning A73: TEXT FOUND BEYOND END STATEMENT - IGNORED
Target not created
...全文
979 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang0635 2016-06-11
  • 打赏
  • 举报
回复
把main前面的end去掉

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧