单片机按键连按长按汇编程序.docx
《单片机按键连按长按汇编程序.docx》由会员分享,可在线阅读,更多相关《单片机按键连按长按汇编程序.docx(23页珍藏版)》请在冰豆网上搜索。
单片机按键连按长按汇编程序
单片机按键连按长按汇编程序
;===============================================================
;程序编写人:
兰建文
;编写地点:
51hei培训机构
;时间:
6月7日下午星期日
;功能:
本程序实现P0口的对2个数码管显示0到99,一个按键实现一次
;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时
;刻,任何一个按键,若按键连续按键3次,每次间隔时间不大于1秒,循
;环显示0到9回到0。
若间隔时间大于1秒,显示加1,低电平亮
;P2口实现对数码管的片选功能
;===============================================================
;==========================系统程序=============================
;=========================开始初始化============================
SHUCHUEQUP0;定义P0口为输出口
PIANXUANEQUP2;定义P2口为片选口
SHUZIEQU30H;设置处理数据存放地址
JIANBIT0BIT20H.0;设置按键标志位
XIAN0BIT20H.2;显示标志位
T_BITBIT21H.0;设置中断定时器0标志位
LIANANBIT20H.1;设置连按标志位
BIT4BIT20H.2
MODEEQU01H
SHUEQU40H
;========================程序开始==============================
ORG00H;程序开始
LJMPSTART;跳到START
ORG0BH;中断定时器0入口地址
JMPT0_1;跳到定时器0服务程序
ORG0030H;入口地址
;=========================主程序===============================
START:
MOVSP,#60H;移开指针
MOVSHUZI,#00;数据初始化
MOVDPTR,#TAB;查表初始化
MOVP1,#0F8H;设置P1.0口为输入
CALLINIT;开中断
CLRJIANBIT0;按键标志位清0
CLRLIANAN;连按标志位清0
CLRBIT4
SETBT_BIT;中断标志位置1
MOVSHU,#0
MOVR2,#0
MOVR3,#0
MOVR4,#0
MOVR5,#200
MAIN:
JNBT_BIT,MAIN;等待中断
CLRT_BIT;中断标志位清0
JBBIT4,VV
INCR3
CJNER3,#25,XX
MOVR3,#00
MOVR2,#0
JMPDD
XX:
CJNER2,#3,VV
SETBLIANAN
MOVR2,#00
DD:
CLRBIT4
VV:
JBLIANAN,XUNHUAN;判断是否有连按
CC:
CALLJISUAN;计算分离十位和个位
CALLDISPLAY;显示个位和十位
JNBJIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起
JNBP1.3,XIANSHI0;若没抬起(P1.3=0)则调到XIANSHI0
SETBBIT4
INCR2
MOVR3,#0
CLRJIANBIT0;按键标志位清0
CLRXIAN0;显示标志位清0
JMPMAIN;返回MAIN
PANDUAN:
JBP1.3,MAIN;若按键抬起则返回MAIN,若没有抬起按键标志位清0
SETBJIANBIT0
JMPMAIN
XIANSHI0:
JBXIAN0,MAIN
SETBXIAN0;显示标志位清0
CALLJIACHULI;加处理
JMPMAIN
XUNHUAN:
MOVA,SHU
CJNEA,#10,KKK
MOVSHU,#0
CLRLIANAN
MOVA,SHU
KKK:
MOVCA,@A+DPTR;查表
MOVSHUCHU,A
MOVPIANXUAN,#05
INCR4
CJNER4,#50,OUTT
INCSHU
MOVR4,#0
OUTT:
JMPMAIN
;====================定时中断0服务子程序========================
;输入:
无
;输出:
无
;实现的功能:
实现定时20MS,影响标志位T_BIT
;===============================================================
T0_1:
MOVTMOD,#MODE;定时器1工作方式1
MOVTL0,#0E0H;设置定时初值
MOVTH0,#0B1H
SETBT_BIT;定时标志位清0
RETI
;========================中断设置子程序=========================
;输入:
无
;输出:
无
;实现的功能:
初始化设置定时器,设置初值
;===============================================================
INIT:
MOVTMOD,#MODE;定时器0工作方式1
MOVTL0,#0E0H
MOVTH0,#0B1H
MOVIE,#82H;开定时器中断0
SETBTR0;开定时器0
RET
;========================计算子程序=============================
;输入:
30H
;输出:
"A和B"
;实现的功能:
把30H的数据的十位和个位分离出来
;===============================================================
JISUAN:
MOVA,SHUZI;数据放在A中
MOVB,#10;除数放在B中
DIVAB;商放在A中,余数放在B中
RET
;========================显示子程序=============================
;输入:
"A"
;输出:
"P0口"
;实现的功能:
把A的数输出到P0口显示,十位和个位分开显示
;===============================================================
DISPLAY:
MOVCA,@A+DPTR;查表
MOVSHUCHU,A;显示十位
MOVPIANXUAN,#04H;片选
CALLDELAY;查表
MOVSHUCHU,#0FFH;关闭数码管
MOVA,B
MOVCA,@A+DPTR;查表
MOVSHUCHU,A;显示个位
MOVPIANXUAN,#05H;片选
CALLDELAY;延时
MOVSHUCHU,#0FFH;关闭数码管
RET
;======================加处理子程序=============================
;输入:
无
;输出:
无
;实现的功能:
把30H地址加1
;===============================================================
JIACHULI:
MOVA,SHUZI
CJNEA,#99,L0;若A不等于9,则跳到LL
MOVA,#00
JMPL1
L0:
INCA;自加一
L1:
MOVSHUZI,A
RET
;========================延时程序===============================
;输入;无
;输出:
无
;实现的功能:
延时一段时间
;===============================================================
DELAY:
MOVR6,#80
L7:
MOVR7,#80
L8:
DJNZR7,L8
DJNZR6,L7
RET
;=====================共阳查表数据==============================
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;=======================程序结束================================
END
一个按键控制一个灯,要求按一下按键,灯亮一直亮,再按一下按键灯灭,要带按键的去抖程序。
郑锦朋|浏览2150次
推荐于2016-07-0216:
59:
04
最佳答案
试一下这个,灯接在p1.2,按键接在p3.3
ORG00H;
MOVP3,#0FFH;
SETBP1.2;
START:
JNBP3.3,TT0;
AJMPSTART;
TT0:
LCALLD1MS;
JNBP3.3,TT0;
CPLP1.2;
AJMPSTART;
D1MS:
MOVR7,#10;
D1:
MOVR6,#250;
DJNZR6,$;
DJNZR7,D1;
RET;
END
本回答由电脑网络分类达人董辉推荐
评论
(2)
赞11踩3
zxc15813191501
采纳率:
17%擅长:
暂未定制
其他回答
很完美的按键控制可调时钟。
消抖都在里面包含。
好好研究~~~~~~~R_QHEQU44HR_BZBIT18HR_1EQU26HR_2EQU27HR_3EQU28HB_DEBOUNCEEQU65HB_HASKEYEQU66HORG0000HLJMPL_MAINORG000BHLJMPI_T0ORG001BHLJMPI_T1ORG0030HL_MAIN:
MOVSP,#62HMOVTMOD,#11HMOVTH0,#HIGH(62536)MOVTL0,#LOW(62536)MOVTH1,#HIGH(15536)MOVTL1,#LOW(15536)MOVIE,#10001010BSETBTR0SETBTR1SETBPT1SETBR_BZMOV40H,#59HMOV41H,#58HMOV42H,#23HMOVR_1,#20MOVR_2,#0MOVR_3,#55HMOV55H,#0MOV56H,#0MOV57H,#0MOV58H,#0MOV59H,#0MOV5AH,#0MOVB_HASKEY,#00HMOVB_DEBOUNCE,#00HLCALLF_CHAIFENL_LOOP:
JBB_DEBOUNCE,L_JSJZ...很完美的按键控制可调时钟。
消抖都在里面包含。
好好研究~~~~~~~
R_QHEQU44H
R_BZBIT18H
R_1EQU26H
R_2EQU27H
R_3EQU28H
B_DEBOUNCEEQU65H
B_HASKEYEQU66H
ORG0000H
LJMPL_MAIN
ORG000BH
LJMPI_T0
ORG001BH
LJMPI_T1
ORG0030H
L_MAIN:
MOVSP,#62H
MOVTMOD,#11H
MOVTH0,#HIGH(62536)
MOVTL0,#LOW(62536)
MOVTH1,#HIGH(15536)
MOVTL1,#LOW(15536)
MOVIE,#10001010B
SETBTR0
SETBTR1
SETBPT1
SETBR_BZ
MOV40H,#59H
MOV41H,#58H
MOV42H,#23H
MOVR_1,#20
MOVR_2,#0
MOVR_3,#55H
MOV55H,#0
MOV56H,#0
MOV57H,#0
MOV58H,#0
MOV59H,#0
MOV5AH,#0
MOVB_HASKEY,#00H
MOVB_DEBOUNCE,#00H
LCALLF_CHAIFEN
L_LOOP:
JBB_DEBOUNCE,L_JSJZ
MOVP1,#0FH
MOVA,P1
ANLA,#0FH
CJNEA,#0FH,L_PRESS
JNBB_HASKEY,L_WAJ
LCALLF_KEYRELEASE
CLRB_HASKEY
L_WAJ:
LJMPL_FANHUI
L_JSJZ:
CLRB_DEBOUNCE
LCALLF_KEYSCAN
LCALLF_KEYservice
SETBB_HASKEY
LJMPL_FANHUI
L_PRESS:
JNBB_HASKEY,L_GAX
LCALLF_XDYS200ms
LCALLF_KEYHOLD
LJMPL_FANHUI
L_GAX:
SETBB_DEBOUNCE
LCALLF_XDYS20ms
LJMPL_FANHUI
F_KEYRELEASE:
CPLP2.0
RET
F_KEYHOLD:
MOVA,75H
CJNEA,#02H,L_NEXT3
LJMPKEY2
RET
L_NEXT3:
CJNEA,#03H,L_FANHUI0
LJMPKEY3
L_FANHUI0:
RET
L_FANHUI:
LJMPL_LOOP
F_KEYSCAN:
MOVP1,#0FH
MOVA,P1
MOVR4,#0FFH
L_LOOP1:
INCR4;计算移动次数,得到第几位为0
RRCA
JCL_LOOP1
MOVP1,#0F0H
MOVA,P1
MOVR5,#0FFH
L_LOOP2:
INCR5;计算移动次数,得到第几位为0
RLCA
JCL_LOOP2
MOVB,#4
MOVA,R4
MULAB
ADDA,R5
MOV75H,A
RET
F_KEYservice:
MOVA,75H
MOVDPTR,#T_LJMP
MOVB,#3
MULAB
JMP@A+DPTR
T_LJMP:
LJMPKEY0
LJMPKEY1
LJMPKEY2
LJMPKEY3
LJMPKEY0
LJMPKEY1
LJMPKEY2
LJMPKEY3
LJMPKEY0
LJMPKEY1
LJMPKEY2
LJMPKEY3
LJMPKEY0
LJMPKEY1
LJMPKEY2
LJMPKEY3
KEY0:
CPLR_BZ
MOVR_QH,#40H
LJMPL_D
KEY1:
JBR_BZ,L_D
MOVA,R_QH
ADDA,#1
MOVR0,A
MOVR_QH,R0
CJNER0,#43H,L_D
MOVR_QH,#40H
LJMPL_D
KEY2:
JBR_BZ,L_D
MOVR1,R_QH
MOVA,@R1
ADDA,#1
DAA
MOV@R1,A
CJNER1,#42H,L_LL
CJNE@R1,#24H,L_D
MOV@R1,#00H
LJMPL_D
L_LL:
CJNE@R1,#60H,L_D
MOV@R1,#00H
LJMPL_D
KEY3:
JBR_BZ,L_D
MOVR0,R_QH
CJNER0,#42H,L_FENMIAO
DEC@R0
CJNE@R0,#0FFH,L_JJ
MOV@R0,#23H
LJMPL_D
L_FENMIAO:
MOVR0,R_QH
DEC@R0
CJNE@R0,#0FFH,L_JJ
MOV@R0,#59H
LJMPL_D
L_JJ:
MOVA,@R0
ANLA,#0FH
MOVR1,A
MOVR0,R_QH
MOVA,@R0
ANLA,#0F0H
CJNER1,#0FH,L_D
ADDA,#09H
MOV@R0,A
L_D:
LCALLF_CHAIFEN
RET
F_CHAIFEN:
MOVR0,#40H
MOVR1,#55H
L_DD:
MOVA,@R0
ANLA,#0FH
MOV@R1,A
INCR1
MOVA,@R0
ANLA,#0F0H
SWAPA
MOV@R1,A
INCR0
INCR1
CJNER0,#43H,L_DD
RET
;中断T0
I_T0:
PUSHPSW
PUSHACC
SETBRS0
MOVTH0,#HIGH(62536)
MOVTL0,#LOW(62536)
MOVA,R_2
SWAPA
MOVR0,R_3
ORLA,@R0
MOVP0,A
INCR_2
INCR_3
MOVR0,R_2
CJNER0,#06H,L_EXIT
MOVR_3,#55H
MOVR_2,#0
L_EXIT:
POPACC
POPPSW
RETI
;中断T1
I_T1:
PUSHACC
PUSHPSW
SETBRS1
MOVTH1,#HIGH(15536)
MOVTL1,#LOW(15536)
DJNZR_1,L_EXIT2
MOVR_1,#20
JNBR_BZ,L_EXIT2
MOVA,40H
ADDA,#1
DAA
MOV40H,A
CJNEA,#60H,L_LCHAIFEN
MOV40H,#00H
MOVA,41H
ADDA,#1
DAA
MOV41H,A
CJNEA,#60H,L_LCHAIFEN
MOV41H,#00H
MOVA,42H
ADDA,#1
DAA
MOV42H,A
CJNEA,#24H,L_LCHAIFEN
MOV42H,#00H
L_EXIT2:
L_LCHAIFEN:
LCALLF_CHAIFEN
POPPSW
POPACC
RETI
F_XDYS20ms:
MOVR6,#100
L_LOOP9:
MOVR5,#100
DJNZR5,$
DJNZR6,L_LOOP9
RET
F_XDYS200ms:
MOVR6,#50
L_LOOP11:
MOVR7,#100
L_LOOP10:
MOVR5,#40
DJNZR5,$
DJNZR7,L_LOOP10
DJNZR6,L_LOOP11
RET
END收起
Rainting☆☆☆|发布于2010-08-2317:
27
评论
赞0踩0
(1);P3.3小键盘按下P1.3亮再按0.5秒灭。
org0000hajmpmain0org0080hMAIN0:
CLR21H;清标志main:
movc,p3.3;检测按键jcmainMOVR6,#200;设定延时MOVR7,#200TT0:
JNB21H,TT2;检测灯状态tt:
movc,p3.3;检测按键jnctt1JNB20H,MAIN;检测时间标志CLR20HAJMPTT3TT2:
movc,p3.3;检测按键jnctt2TT3:
CPL21H;改变灯状态cplp1.3ajmpmainTT1:
NOP;延时但不是子程序NOPNOPNOPNOPNOPDJNZR6,TTMOVR6,#200DJNZR7,TTMOVR7,#200SETB20HAJMPTTend
(2)数码管数据p0,数码管控制p2独立按键p1口,;对独立键进行按键次数计数,三位数码管显示。
*;K1按下后,进行加1计数*;K2按下后,进行减1计数。
*;K3按下后,进行加5计数。
*;K4按下后,清计数单元,数码管显示0。
*;按住键可以快速计数。
K1BITP1.4K2BITP1.5K3BITP1.6K4...
(1);P3.3小键盘按下P1.3亮再按0.5秒灭。
org0000h
ajmpmain0
org0080h
MAIN0:
CLR21H;清标志
main:
movc,p3.3;检测按键
jcmain
MOVR6,#200;设定延时
MOVR7,#200
TT0:
JNB21H,TT2;检测灯状态
tt:
movc,p3.3;检测按键
jnctt1
JNB20H,MAIN;检测时间标志
CLR20H
AJMPTT3
TT2:
movc,p3.3;检测按键
jnctt2
TT3:
CPL21H;改变灯状态
cplp1.3
ajmpmain
TT1:
NOP;延时但不是子程序
NOP
NOP
NOP
NOP
NOP
DJNZR6,TT
MOVR6,#200
DJNZR7,TT
MOVR7,#200
SETB20H
AJMPTT
end
(2)数码管数据p0,数码管控制p2独立按键p1口,;对独立键进行按键次数计数,三位数码管显示。
*
;K1按下后,进行加1计数*
;K2按下后,进行减1计数。
*
;K3按下后,进行加5计数。
*
;K4按下后,清计数单元,数码管显示0。
*
;按住键可以快速计数。
K1BITP1.4
K2BITP1.5
K3BITP1.6
K4BITP1.7
K_OLDEQU30H
K_NEWEQU31H
K_COUNTEQU32H
DISSTARTEQU40H;显示单元首地址
LED_DATAEQUP0;数码管数据口定义
;---------------------------------------------------------
ORG0000H
JMPMAIN
ORG0080H