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

📄 key.asm

📁 Small RTOS51是为51系列单片机而编写的。它是完全免费的、源代码公开的多任务实时操作系统。它可在无任何外部数据存储器的单片80C51系统上运行
💻 ASM
字号:
;**************************************************
;    平凡单片机工作室
;  http://www.mcustudio.com
;   (c) Copyright 2003 Pingfan's McuStudio
;    All rights Reserved
;key.asm
;作者:周坚   
;功能描述:
;P3.2:开始,按此键则灯开始流动(由上而下)
;P3.3:停止,按此键则停止流动,所有灯为暗
;P3.4:上,按此键则灯由上向下流动
;P3.5:下,按此键则灯由下向上流动
;本例可用DSB-1A型单片机实验板验证
;本例可用dpj.dll或ledkey.dll实验仿真板验证
;**************************************************

UpDown      EQU 00H ;上下行标志
StartEnd    EQU 01H ;起动及停止标志
LAMPCODE    EQU 21H ;存放流动的数据代码
    ORG     0000H
    AJMP    MAIN
    ORG     30H
MAIN:   
    MOV     SP,#5FH
    MOV     P1,#0FFH
    CLR     UpDown      ;启动时处于向上的状态
    CLR     StartEnd        ;启动时处于停止状态
    MOV     LAMPCODE,#0FEH  ;单灯流动的代码 
LOOP:   
    ACALL   KEY     ;调用键盘程序
    JNB     F0,LNEXT    ;如果无键按下,则继续
    ACALL   KEYPROC ;否则调用键盘处理程序
LNEXT:  
    ACALL   LAMP        ;调用灯显示程序
    AJMP    LOOP        ;反复循环,主程序到此结束
;---------------------------------------
DELAY:  
    MOV     R7,#10
D1: MOV     R6,#100
    DJNZ    R6,$
    DJNZ    R7,D1
    RET
;---------延时程序,键盘处理中调用
KEYPROC:
    MOV     A,B         ;从B寄存器中获取键值
    JB      ACC.2,KeyStart  ;分析键的代码,某位被按下,则该位为1
    JB      ACC.3,KeyOver
    JB      ACC.4,KeyUp
    JB      ACC.5,KeyDown
    AJMP    KEY_RET
KeyStart:
    SETB    StartEnd    ;第一个键按下后的处理
    AJMP    KEY_RET
KeyOver:
    CLR     StartEnd    ;第二个键按下后的处理
    AJMP    KEY_RET
KeyUp:  
    SETB    UpDown      ;第三个键按下后的处理
    AJMP    KEY_RET
KeyDown:
    CLR     UpDown      ;第四个键按下后的处理
KEY_RET:
    RET

KEY:    
    CLR     F0          ;清F0,表示无键按下。
    ORL     P3,#00111100B   ;将P3口的接有键的四位置1
    MOV     A,P3        ;取P3的值
    ORL     A,#11000011B ;将其余4位置1
    CPL     A           ;取反
    JZ      K_RET       ;如果为0则一定无键按下
    ACALL   DELAY       ;否则延时去键抖
    ORL     P3,#00111100B
    MOV     A,P3
    ORL     A,#11000011B
    CPL     A
    JZ      K_RET
    MOV     B,A         ;确实有键按下,将键值存入B中
    SETB    F0          ;设置有键按下的标志
K_RET:
    ORL     P3,#00111100B   ;此处循环等待键的释放
    MOV     A,P3
    ORL     A,#11000011B
    CPL     A
    JZ      K_RET1      ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
    AJMP    K_RET
K_RET1: 
    RET
;----------------------------------- 
D500MS:                 ;流水灯的延迟时间
    PUSH    PSW
    SETB    RS0
    MOV     R7,#5       ;如果用实验仿真板,该值可根据你的机器运行情况更改,在1-255之间
D51:    
    MOV     R6,#250
D52:    
    MOV     R5,#200
D53:    
    DJNZ    R5,D53
    DJNZ    R6,D52
    DJNZ    R7,D51
    POP     PSW
    RET 
;-----------------------------------
LAMP:
    JB      StartEnd,LampStart ;如果StartEnd=1,则启动
    MOV     P1,#0FFH
    AJMP    LAMPRET     ;否则关闭所有显示,返回
LampStart:
    JB      UpDown,LAMPUP ;如果UpDown=1,则向上流动
    MOV     A,LAMPCODE
    RL      A           ;向上移动实际就是左移位
    MOV     LAMPCODE,A 
    MOV     P1,A
    LCALL   D500MS
    AJMP    LAMPRET
LAMPUP: 
    MOV     A,LAMPCODE
    RR      A           ;向下流动实际就是右移
    MOV     LAMPCODE,A
    MOV     P1,A
    LCALL   D500MS
LAMPRET:
    RET
    END

⌨️ 快捷键说明

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