⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 键盘 - copy.asm

📁 我学单片机89C51时编的大部分程序都在里面
💻 ASM
字号:
        ORG 0000H
        SJMP START
        ORG 0030H
START:  MOV SCON,#00H           ;初始化串行口方式0
        MOV DPTR,#TABLE         ;查表
        LCALL QINGLING

        MOV P1,#0FFH            ;读取键值
        MOV A,P1
        CPL A
        ANL A,#0FH
        JZ START
        LCALL D10MS
        MOV A,P1
        CPL A
        ANL A,#0FFH
        JZ START
        MOV B,A
KEY:    MOV A,P1
        CPL A
        ANL A,#0FFH
        JNZ KEY                  ;判断是那个键按下,并执行相应操作
        LCALL D10MS
        MOV A,B
        MOV R2,#04H        ;操作数R2,R3
        MOV R3,#02H
        JB ACC.0,K1
        JB ACC.1,K2
        JB ACC.2,K3
        JB ACC.3,K4
        AJMP start
K1:     AJMP  JIA
K2:     AJMP JIAN
K3:     AJMP  CHENG
K4:     AJMP CHU

JIA:    MOV A,R2            ;加
        MOV B,R3
        MOV R4,#15
        ADD A,B
        AJMP SHOW
JIAN:   MOV A,R2             ;减
        MOV B,R3
        MOV R4,#16
        SUBB A,B
        AJMP SHOW
CHENG:  MOV A,R2              ;乘
        MOV B,R3
        MOV R4,#17
        MUL AB
        AJMP SHOW
CHU:    MOV A,R2               ;除
        MOV B,R3
        MOV R4,#18
        DIV AB
        AJMP SHOW

SHOW:   MOV R1,A                ;结果存入R5
        MOV A,#19               ;等号
        LCALL DISPLAY
        MOV A,R3                ;第二位数
        LCALL DISPLAY
        MOV A,R4                ;符号
        LCALL DISPLAY
        MOV A,R2                ;第一位数
        LCALL DISPLAY
        LCALL D1S
        LCALL QINGLING
;结果
;分几种情况讨论:
;1、加法和乘法是结果可能有两位,高低位分别输出
;2、除法可能会有余数
;3、减法可能会有负数      
RESULT: MOV A,R1                 ;结果                    ;
        CJNE A,#00H,NEXTZF       ;判断A的正负,A不等于0跳转到NEXTZF
NEXTZF: JC SMALL                 ;A小于0,则CY=1,跳转到SMALL,输出负数
        AJMP BIG                 ;否则跳转到BIG
BIG:    CJNE A,#0FH,NEXTYE       ;判断A,是否为两位
NEXTYE: JNC LIANGWEI             ;A大于0FH,CY=0,A为两位跳转到LIANGWEI
        LJMP YIWEI               ;否则跳转到YIWEI
YIWEI:  MOV R7,B
        CJNE R7,#00H,YUSHU        ;B不为0,则有余数,跳转到YUSHU
        AJMP WUYU                ;否则没有余数,跳转到WUYU
        SJMP $


;子程序
D10MS:  MOV R7,#10H           ;10MS延时程序
DS11:   MOV R6,#0FFH
DS22:   DJNZ R6,DS22
        DJNZ R7,DS11
        RET

QINGLING:MOV R0,#04H             ;清零
LOOP:   MOV A,#20
        LCALL DISPLAY
        DJNZ R0,LOOP
        LCALL D1S
        RET
                                ;显示
DISPLAY:MOVC A,@A+DPTR          ;查表
        MOV SBUF,A              ;输出
DELAY:  JNB TI,DELAY            ;八个字节是否发送完
        CLR TI                  ;清标志位
        RET

D1S:    MOV R7,#010       ;1S延时程序
DS1:    MOV R6,#200
DS2:    MOV R5,#250
DS3:    DJNZ R5,DS3
        DJNZ R6,DS2
        DJNZ R7,DS1
        RET
        
SMALL:  LCALL DISPLAY            ;有负数存在,先输出A
        MOV A,#16                ;输出负号
        LCALL DISPLAY            ;
        LCALL D1S                ;
        LJMP START               ;主程序循环

LIANGWEI:MOV B,#10H              ;取16模
        DIV AB                   ;分高低位输出
        PUSH A                   ;
        MOV A,B                  ;
        LCALL DISPLAY            ;
        POP A                    ;
        LCALL DISPLAY            ;
        LCALL D1S                ;
        LJMP START
        
YUSHU:  PUSH A                   ;有余数,将A压入堆栈
        MOV A,B                  ;将余数B输出
        LCALL DISPLAY            ;
        POP A                    ;弹出A
        ORL A,#04H               ;加小数点,并输出A
        LCALL DISPLAY            ;
        LCALL D1S
        LJMP START               ;
        
WUYU:   LCALL DISPLAY            ;无余数,直接输出A
        LCALL D1S                ;
        LJMP START               ;

TABLE:  DB 0BBH,09H,0EAH,6BH,59H,73H,0F3H,0BH,0FBH,7BH
        DB 0F1H,0B2H,0E9H,0F2H,0D2H
        DB 49h,40h,0d9h,51h,60H,00H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -