独立按键控制程序分享
大小: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直控键盘按钮流水灯加11CODE_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%
下载地址
独立按键控制程序分享下载
相关电子资料下载
- 火遍童年的FC游戏是使用什么语言编写的 330
- 汇编语言中常见的两个指令 167
- 汇编语言的产生 汇编语言的组成 233
- 汇编语言之内存访问(寄存器) 242
- 单片机独立按键控制led灯程序 1534
- 单片机独立按键控制4个LED灯亮灭 760
- 为什么要反汇编?反汇编文件的生成和解读 500
- Linux内核调试:指令追踪大法简析 360
- 基于单片机的按键电路软件设计 独立按键的工作原理 356
- Linux的gcc编译过程介绍 157