求汇编按键程序!!!

求汇编按键程序!!!,第1张

P1口接键盘进行扫描,P2口接数码管的位码,P0口接数码管的段码

ORG 0000H

LJMP START

ORG 0030H

START:

MOV 30H,#10H 第8个数码管显示数据缓存寄存器

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:DATA

DATA 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 SEGMENT

STR 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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12302077.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存