您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>汇编编程>

独立按键控制程序分享

大小:0.11 MB 人气: 2017-09-06 需要积分:0

1、独立按键控制流水灯花样

; 使用独立按键K1,K2,K4,K4实现流水灯花样变化
; P1.4  开始按此键则灯开始流动(由左向右) 
;P1.5  停止按此键则停止流动所有灯为灭 
; P1.6  向左按此键则灯反向流动由右向左 
;1.7  向右按此键则灯正向流动由左向右
UpDown EQU 00H ;上下行标志
StartEnd EQU 01H ;起动及停止标志
LAMPCODE EQU 21H ;存放流动的数据代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P0,#0FFH
CLR UpDown ;启动时处于向上的状态
CLR StartEnd ;启动时处于停止状态
MOV LAMPCODE,#0FEH ;单灯流动的代码 
LOOP:
ACALL KEY ;调用键盘程序
JNB F0,LNEXT ;如果无键按下,则继续
ACALL KEYPROC ;否则调用键盘处理程序
LNEXT:
ACALL LAMP ;调用灯显示程序
AJMP LOOP ;反复循环,主程序到此结束
;---------------------------------------
DELAY:
MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;----------------------------------------延时程序,键盘处理中调用
KEYPROC:
MOV A,B ;从B寄存器中获取键值
JB ACC.4,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)
JB ACC.5,KeyOver
JB ACC.6,KeyUp
JB ACC.7,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 P1,#11110000B ;将P1口的接有键的四位置1
MOV A,P1 ;取P3的值
ORL A,#00001111B ;将其余4位置1
CPL A ;取反
JZ K_RET ;如果为0则一定无键按下
ACALL DELAY ;否则延时去键抖
ORL P1,#11110000B
MOV A,P1
ORL A,#00001111B
CPL A
JZ K_RET
MOV B,A ;确实有键按下,将键值存入B中
SETB F0 ;设置有键按下的标志
K_RET: 
ORL P1,#11110000B ;此处循环等待键的释放
MOV A,P1
ORL A,#00001111B
CPL A
JZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
AJMP K_RET
K_RET1: 
RET
;----------------------------------- 
D500MS: ;流水灯的延迟时间
PUSH PSW
SETB RS0
MOV R7,#200
D51: MOV R6,#250
D52: NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET 
;-----------------------------------
LAMP:
JB StartEnd,LampStart ;如果StartEnd=1,则启动
MOV P0,#0FFH
AJMP LAMPRET ;否则关闭所有显示,返回
LampStart:
JB UpDown,LAMPUP ;如果UpDown=1,则向上流动
MOV A,LAMPCODE
RL A ;实际就是左移位而已
MOV LAMPCODE,A 
MOV P0,A
LCALL D500MS
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A ;向下流动实际就是右移
MOV LAMPCODE,A
MOV P0,A
LCALL D500MS
LAMPRET: 
RET
END

2、去抖动独立按键实验

;按压(P1.4),D00交替亮灭。按压(P1.5),D01交替亮灭,加入去抖动功能
ORG 000H
AJMP START
ORG 30H
START: MOV SP,5FH
MOV P0,#0FFH
MOV P1,#0FFH
L1: JB P1.4,L2        ;P1.4为1,不做处理,转P1.5,否则说明有键按下
LCALL D10MS           ;调用延时程序,去除抖动
JB P1.4,L1            ;p1.4为0,说明此键被按下了
CPL P0.0              ;取反P0.0
L3: JNB P1.4,L3       ;直到P1.4释放后去判断第二个键
L2: JB P1.5,L1        ;P1.5为1,返回去继续处理P1.4
LCALL D10MS           ;调用延时程序,去除抖动
  JB P1.5,L2          ;p1.5为0,说明此键被按下了
  CPL P0.1            ;取反P0.1
L4: JNB P1.5,L4       ;直到P1.5释放为止
LJMP L1               ;返回
D10MS: MOV R7,#50     ;延时的时间一般为5-20ms
     D1:MOV R6,#100
     D2:DJNZ R6,D2
     DJNZ R7,D1
     RET
 END

3、独立按键实验

;按压(P1.4),D00交替亮灭。按压K2(P1.5),D01交替亮灭
ORG 000H
AJMP START
ORG 30H
START: MOV SP,5FH
MOV P0,#0FFH
MOV P1,#0FFH
L1: JNB P1.4,L2      ;按下按键开关K1,取反一次P0.0(灯亮),再按一下灭
JNB P1.5,L3          ;按下按键开关K2,取反一次P0.1(灯亮),再按一下灭
LJMP L1
L2: CPL P0.0
LJMP L1
L3: CPL P0.1
LJMP L1
END
 

4、直控按键演示

;按压P1.4直控键盘按钮流水灯减1,按压P1.5直控键盘按钮流水灯加11
CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA
 RSEG DATA_SEG
KEY_S: DS 1
KEY_V: DS 1
 RSEG STACK_SEG
STACK: DS 20

K1 BIT P1.4  ; 
K2 BIT P1.5  ;

 CSEG AT 0000H
 JMP MAIN
;=============================================================================== 
 RSEG CODE_SEG
MAIN:
 MOV SP,#(STACK-1)  ; 设置栈指针
 MOV P0,#0FEH  ; 初始点亮LED P00
 MOV KEY_V,#03H  ; 初始键值
KEY_CHKSW:    ; 循环检测按键是否按下     
 ACALL SCAN_KEY  ; 输入按键状态
 MOV KEY_S,A
 XRL A,KEY_V   ; 检查按键值是否改变
 JZ KEY_CHKSW  ; 若无键被按,则跳回KEY_CHKSW
 
 MOV R7,#10   ; 延时10ms
 ACALL DELAYMS   ; 延时去抖
 ACALL SCAN_KEY  ; 再次检查按键值
 MOV KEY_S,A
 XRL A,KEY_V
 JZ KEY_CHKSW
 
 MOV KEY_V,KEY_S  ; 保存按键状态
 ACALL PROC_KEY  ;
 SJMP KEY_CHKSW
;===============================================================================
SCAN_KEY:    
; 扫描按键
; 传入参数:无
; 返回值:A --- 按键状态
 CLR A
 MOV C,K1
 MOV ACC.0,C
 MOV C,K2
 MOV ACC.1,C
 RET
;=============================================================================== 
PROC_KEY:
; 按键处理子程序
; 传入参数: KEY_V --- 按键值
; 返回值: 无
 MOV A,KEY_V
 JNB ACC.0,PROC_K1
 JNB ACC.1,PROC_K2
 RET
 
PROC_K1:    ; 按键K1处理程序
 MOV A,P0   ; 右移
 RR A
 MOV P0,A
 RET
 
PROC_K2:    ; 按键K2处理程序
 MOV A,P0   ; 左移
 RL A
 MOV P0,A  
 RET
;=============================================================================== 
DELAYMS:
; 延时子程序
; 传入参数:R7 --- 延时值(MS) 
; 返回值:无
 MOV A,R7
 JZ END_DLYMS 
DLY_LP1:
 MOV R6,#185
DLY_LP2:
 NOP
 NOP
 NOP
 DJNZ R6,DLY_LP2
 DJNZ R7,DLY_LP1
END_DLYMS:
 RET 
 
; END OF DELAYMS
 
 END

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!