
ORG 0000H
LJMP START
ORG 0030H
START:
MOV 31H,#10H 第7个数码管显示数据缓存寄存器
MOV 32H,#10H 第6个数码管显示数据缓存寄存器
MOV 33H,#10H 第5个数码管显示数据缓存寄存器
MOV 34H,#10H 第4个数码管显示数据缓存寄存器
MOV 35H,#10H 第3个数码管显示数据缓存寄存器
MOV 36H,#10H 第2个数码管显闭睁示数据缓存寄存器
MOV 37H,#10H 第1个数码管显示数据缓存寄存器
MAIN:
LCALL SAOMIAO 调用键盘扫描寄存器
LCALL DISPLAY 调用显示寄存器
LJMP MAIN
SAOMIAO:
MOV P1,#11111110B 将轿茄岁P1.4-P1.7口做为输入检测口,屏蔽P1.0-P1.3三行按键,扫描P0.0行的按键
JNB P1.4,A0第一行第一个按键被按下,则跳至A0
JNB P1.5,A1第一行第二个按键被按下,则跳至A1
JNB P1.6,A2第一行第三个按键被按下,则跳至A2
JNB P1.7,A3第一行第四个按键被按下,纳指则跳至A3
MOV P1,#11111101B 扫描P0.1接的第二行
JNB P1.4,A4第二行第一个按键被按下,则跳至A4
JNB P1.5,A5
JNB P1.6,A6
JNB P1.7,A7
MOV P1,#11111011B
JNB P1.4,A8
JNB P1.5,A9
JNB P1.6,A10
JNB P1.7,A11
MOV P1,#11110111B
JNB P1.4,A12
JNB P1.5,A13
JNB P1.6,A14
JNB P1.7,A15
RET
A0:
LJMP AN0 由于JNB指令的跳转范围仅为8位,所以用LJMP跳入按键处理子程序
A1:
LJMP AN1
A2:
LJMP AN2
A3:
LJMP AN3
A4:
LJMP AN4
A5:
LJMP AN5
A6:
LJMP AN6
A7:
LJMP AN7
A8:
LJMP AN8
A9:
LJMP AN9
A10:
LJMP AN10
A11:
LJMP AN11
A12:
LJMP AN12
A13:
LJMP AN13
A14:
LJMP AN14
A15:
LJMP AN15
AN0:
LCALL DISPLAY
MOV P1,#11111110B
JNB P1.4,AN0 按键消抖
MOV 3FH,#0 将按键值送入按键缓存寄存器
LJMP YIDONG调用移动子程序
AN1:
LCALL DISPLAY
MOV P1,#11111110B
JNB P1.5,AN1
MOV 3FH,#1
LJMP YIDONG
AN2:
LCALL DISPLAY
MOV P1,#11111110B
JNB P1.6,AN2
MOV 3FH,#2
LJMP YIDONG
AN3:
LCALL DISPLAY
MOV P1,#11111110B
JNB P1.7,AN3
MOV 3FH,#3
LJMP YIDONG
AN4:
LCALL DISPLAY
MOV P1,#11111101B
JNB P1.4,AN4
MOV 3FH,#4
LJMP YIDONG
AN5:
LCALL DISPLAY
MOV P1,#11111101B
JNB P1.5,AN5
MOV 3FH,#5
LJMP YIDONG
AN6:
LCALL DISPLAY
MOV P1,#11111101B
JNB P1.6,AN6
MOV 3FH,#6
LJMP YIDONG
AN7:
LCALL DISPLAY
MOV P1,#11111101B
JNB P1.7,AN7
MOV 3FH,#7
LJMP YIDONG
AN8:
LCALL DISPLAY
MOV P1,#11111011B
JNB P1.4,AN8
MOV 3FH,#8
LJMP YIDONG
AN9:
LCALL DISPLAY
MOV P1,#11111011B
JNB P1.5,AN9
MOV 3FH,#9
LJMP YIDONG
AN10:
LCALL DISPLAY
MOV P1,#11111011B
JNB P1.6,AN10
MOV 3FH,#10
LJMP YIDONG
AN11:
LCALL DISPLAY
MOV P1,#11111011B
JNB P1.7,AN11
MOV 3FH,#11
LJMP YIDONG
AN12:
LCALL DISPLAY
MOV P1,#11110111B
JNB P1.4,AN12
MOV 3FH,#12
LJMP YIDONG
AN13:
LCALL DISPLAY
MOV P1,#11110111B
JNB P1.5,AN13
MOV 3FH,#13
LJMP YIDONG
AN14:
LCALL DISPLAY
MOV P1,#11110111B
JNB P1.6,AN14
MOV 3FH,#14
LJMP YIDONG
AN15:
LCALL DISPLAY
MOV P1,#11110111B
JNB P1.7,AN15
MOV 3FH,#15
LJMP YIDONG
YIDONG: 移动子程序,将数码管数字向左移动一位
MOV 37H,36H
MOV 36H,35H
MOV 35H,34H
MOV 34H,33H
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,3FH
RET
DISPLAY:
MOV DPTR,#TAB
MOV A,30H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11101111B
LCALL DELAY
MOV DPTR,#TAB
MOV A,31H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11011111B
LCALL DELAY
MOV DPTR,#TAB
MOV A,32H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#10111111B
LCALL DELAY
MOV DPTR,#TAB
MOV A,33H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#01111111B
LCALL DELAY
MOV DPTR,#TAB
MOV A,34H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11111110B
LCALL DELAY
MOV DPTR,#TAB
MOV A,35H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11111101B
LCALL DELAY
MOV DPTR,#TAB
MOV A,36H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11111011B
LCALL DELAY
MOV DPTR,#TAB
MOV A,37H
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11110111B
LCALL DELAY
RET
TAB:
DB 03H 9FH 25H 0DH 99H 49H 41H 1FH 03H到071H是表示0到F
DB 01H 19H 11H 0C1H 0E5H 85H 21H 71H
DB 0FFH“0”——“F”再加上不显示,一共十七个代码
DELAY:
MOV R6,#5
D1:
MOV R7,#255
DJNZ R7,$
DJNZ R6,D1
RET
ASSUME CS:CODE, DS:DATADATA SEGMENT
MSG1DB 13, 10, 'Please input string: ', 13, 10, '$'
IN_MAX DB 8
IN_NDB ?
IN_BUF DB 10 DUP(?)
MSG2DB 90 DUP('$')
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
---------------------------
LEA DX, MSG1
MOV AH, 9
INT 21H
LEA DX, IN_MAX
MOV AH, 10
INT 21H
CMP IN_N, 0
JZEXIT
---------------------------
RIGHT:
MOV SI, 0
MOV DI, 0
MOV BYTE PTR MSG2[BX - 1], ' '
ADD DI, BX
CALL UP_DISP
LEA DX, MSG2
MOV AH, 9
INT 21H
MOV AH, 2
MOV DL, 13
INT 21H
INC BX
CALL DELAY
CMP DI, 80
JNZ RIGHT
---------------------------
EXIT:
MOV AH, 4CH
INT 21H
---------------------------
UP_DISP:
MOV CH, 0
MOV CL, IN_N
LP1:
MOV AL, IN_BUF[SI]
MOV MSG2[DI], AL
INC SI
INC DI
CMP DI, 80
JZEXIT_UP
LOOP LP1
EXIT_UP:
RET
---------------------------
DELAY:
PUSH CX
PUSH DX
MOV DX, 1000
DL1:
LOOP $
DEC DX
CMP DX, 0
JNZ DL1
POP DX
POP CX
RET
---------------------------
CODE ENDS
END START
DATAS SEGMENTSTR DB"please input a string:$"
BUF DB 20这里的20为指定存放字符的个数(理论上的)
DB ?这的?可变,实际存放字符的个数(系统自动计算)
DB 20 DUP (?)这里的20是你在数据段开辟的空间
CRLF DB 0AH,0DH,"$"此处输入数据段代码 回车换行
DATAS ENDS
STACKS SEGMENT STACK从你的代码看来,这堆栈段可删去
DB 200 DUP(?) 此处输入堆猛洞栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START: MOV AX,DATAS
MOV DS,AX
LEA DX,STR9号中断前提,给参数DX赋值,指定输出字符串所在的有效地址
MOV AH,9
INT 21H
MOV AH,1010号中断,接收输入字符串,此时DX为存放字符串的吵缓有效地址
LEA DX,BUF
INT 21H
LEA DX,CRLF
MOV AH,9
INT 21H
MOV CL,BUF+1获取字符串中字符的个数
LEA SI,BUF+2间接寻址
NEXT: MOV DL,[SI]
MOV AH,22号中断输出单个字符
INT 21H
INC SI输出一个地址往后加1
DEC CL顺便减少输出的次数
JNZ NEXT此处输入代码段枝碰枯代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)