独立按键控制程序分享
大小: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