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

📄 mcs_51键盘显示子程序2.asm

📁 单片机键盘例子!是学习单片机初级时很好的程序例子!
💻 ASM
字号:




;****************************************************************************
                 

        ORG 0000H
        LJMP start       ;复位后程序计数器PC=0000H
        ORG 0003H
        LJMP MY_INT0     ;外部中断0入口
        ORG 000BH
        LJMP MY_T0       ;定时器中断0入口
        ORG 0013H
        JMP MY_INT1     ;外部中断1入口
        ORG 001BH
        LJMP MY_T1       ;定时器中断1入口
        ORG 0023H
        LJMP MY_TX       ;串行口中断入口
        ORG 002BH
        LJMP MY_T2       ;定时器中断2入口(8032/8052)
        ORG 0030H
;------------------------------------------------------------------
START:
       ;程序开始
       ;设置堆栈指针
       MOV IE,#10001001B   ;EA X ET2 ES ET1 EX1 ET0 EX0
       mov tmod,#00010000b
       Mov th1,#3ch
       mov tl1,#0afh
       setb tr1


KEY:
       LCALL KS1      ;是否有键按下
       JZ KEY;END      ;无键按下,返回
       LCALL YS10MS   ;10MS  延时
       LCALL KS1      ;是否有键按下
       JZ KEY;END      ;无键按下,返回
       MOV R2,#0EFH   ;赋首列扫描字
       MOV R3,#00H    ;赋首列指针
LK1:   MOV P1,R2      ;扫描字=>P1
       MOV A,P1       ;读P1口
       JB ACC.0,LONE  ;0行无键按下,转1行
       MOV A,#0       ;0行有键按下,赋行号=>A
       LJMP LKP       ;转求键号
LONE:  JB ACC.1,LTW0  ;1行无键按下,转2行
       MOV A,#4       ;1行有键按下,赋行号=>A
       LJMP LKP       ;转求键号
LTW0:  JB ACC.2,LTHR  ;2行无键按下,转3行
       MOV A,#8       ;2行有键按下,赋行号=>A
       LJMP LKP       ;转求键号
LTHR:  JB ACC.3,NEXT  ;3行无键按下,转列加一
       MOV A,#12      ;3行有键按下,赋行号=>A
       LJMP LKP       ;转求键号
NEXT:  INC R3         ;列加一,指向下一列
       MOV A,R2       ;扫描字=>A
       RL A           ;扫描字左移
       MOV R2,A       ;暂存扫描字
       LJMP LK1       ;转下一列扫描
LKP:   ADD A,R3       ;求键值(当前行+当前列)
       PUSH Acc       ;键值-->压入堆栈
LK2:   LCALL KS1      ;是否有键按下
       JNZ LK2        ;A不等于0,再判断
       POP Acc        ;键已经释放,A=键值
       lcall YS10MS   ;10MS  延时
       lcall YS10MS   ;10MS  延时
                     ;MOV A,#1
                     ;LCALL YS01S
KEYEND:                ;返回
       RET
;*********************************************************
KS1:    ;是否有键按下,有A=1,否则A=0
       MOV P1,#0FH  ;列线全部有效
       MOV A,P1     ;
       CPL A        ;
       ANL A,#0FH   ;
       RET
;*********************************************************

YS10MS: ;延时10毫秒,晶振频率为12.00MHZ
        MOV R6,#50
LOOP:   MOV R7,#98
        DJNZ R7,$
        NOP
        JNZ R6,LOOP
        RET
;*********************************************************
YS01S:
        MOV R4,A
LOOP12:
        MOV R5,#20
LOOP11:
        MOV R6,#100
LOOP10:
        MOV R7,#248
        DJNZ R7,$
        DJNZ R6,LOOP10
        DJNZ R5,LOOP11
        DJNZ R4,LOOP12
        RET
;*********************************************************
LED_OUT: ;显示输出子程序
        ;MOV SCON,#0
        MOV R2,#6      ;显示模块长度
        MOV R0,#30H    ;显示缓冲区首地址
        MOV DPTR,#TAB
        CLR TI
LED_O1:
        MOV A,@R0
        INC R0
        MOVC A,@A+DPTR
        CLR EA
        MOV SBUF,A
        JNB TI,$
        CLR TI
        SETB EA
        DJNZ R2,LED_O1
        CLR P3.4
        SETB P3.4    ;锁存脉冲
        RET
TAB: ;段码
        DB   00000011B  ;0    A B C D E F G .
        DB   10011111B  ;1
        DB   00100101B  ;2
        DB   00001101B  ;3
        DB   10011001B  ;4
        DB   01001001B  ;5
        DB   01000001B  ;6
        DB   00011111B  ;7
        DB   00000001B  ;8
        DB   00001001B  ;9
        DB   11111111B  ;空
        DB   11111101B  ;-
;*********************************************************
MY_R:  ;显示缓冲区左移
        MOV 35H,34H
        MOV 34H,33H
        MOV 33H,32H
        MOV 32H,31H
        MOV 31H,30H
        RET
;*********************************************************
GO_TO:   ;散转程序
        MOV DPTR,#TBJ   ;散转表首地址
        MOV 40H,A       ;键值
        ADD A,40H       ;乘3
        ADD A,40H
        JMP @A+DPTR
TBJ:
           MY_K0:    LJMP MY_KEY0    ;0键值 转移
           MY_K1:    LJMP MY_KEY1    ;1键值 转移
           MY_K2:    LJMP MY_KEY2    ;2键值 转移
           MY_K3:    LJMP MY_KEY3    ;3键值 转移
           MY_K4:    LJMP MY_KEY4    ;4键值 转移
           MY_K5:    LJMP MY_KEY5    ;5键值 转移
           MY_K6:    LJMP MY_KEY6    ;6键值 转移
           MY_K7:    LJMP MY_KEY7    ;7键值 转移
           MY_K8:    LJMP MY_KEY8    ;8键值 转移
           MY_K9:    LJMP MY_KEY9    ;9键值 转移
           MY_K10:   LJMP MY_KEY10   ;10键值 转移
           MY_K11:   LJMP MY_KEY11   ;11键值 转移
           MY_K12:   LJMP MY_KEY12   ;12键值 转移
           MY_K13:   LJMP MY_KEY13   ;13键值 转移
           MY_K14:   LJMP MY_KEY14   ;14键值 转移
           MY_K15:   LJMP MY_KEY15   ;15键值 转移
;-----------------------------------------------------------------
        MY_KEY0:  ;0键值 转移
        LCALL MY_R
        MOV 30H,#0
        LJMP INT0_END    ;中断结束,返回主程序
        MY_KEY1:  ;1键值 转移
        LCALL MY_R
        MOV 30H,#1
        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY2:  ;2键值 转移
        LCALL MY_R
        MOV 30H,#2
        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY3:  ;3键值 转移
        LCALL MY_R
        MOV 30H,#3
        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY4:  ;4键值 转移
        LCALL MY_R
        MOV 30H,#4
        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY5:  ;5键值 转移
        LCALL MY_R
        MOV 30H,#5
        LJMP INT0_END  ;中断结束,返回主程序
        MY_KEY6:  ;6键值 转移
        LCALL MY_R
        MOV 30H,#6
        LJMP INT0_END  ;中断结束,返回主程序
        MY_KEY7:   ;7键值 转移
        LCALL MY_R
        MOV 30H,#7
        LJMP INT0_END  ;中断结束,返回主程序
        MY_KEY8:   ;8键值 转移
        LCALL MY_R
        MOV 30H,#8
        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY9:   ;9键值 转移
        LCALL MY_R
        MOV 30H,#9
        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY10:   ;10键值 转移 加法

        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY11:   ;11键值 转移 减法

        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY12:
        jnb tr1,sy         ;12键值 转移  乘法
        clr tr1
        ;setb tr1

        LJMP INT0_END
        sy: setb tr1
        ljmp INT0_END
                            ;中断结束,返回主程序
        MY_KEY13:    ;14键值 转移    除法

        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY14:    ;14键值 转移  等号

        LJMP INT0_END   ;中断结束,返回主程序
        MY_KEY15:    ;15键值 转移
        MOV 30H,#0
        MOV 31H,#10
        MOV 32H,#10
        MOV 33H,#10
        MOV 34H,#10
        MOV 35H,#10
        LJMP INT0_END  ;中断结束,返回主程序
        END          ;程序结尾

⌨️ 快捷键说明

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