标题:
单片机按键连按长按汇编程序
[打印本页]
作者:
daniu
时间:
2014-12-27 18:16
标题:
单片机按键连按长按汇编程序
;===============================================================
;程序编写人:兰建文
;编写地点:51hei培训机构
;时间:6月7日下午 星期日
;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次
;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时
;刻,任何一个按键,若按键连续按键3次,每次间隔时间不大于1秒,循
;环显示0到9回到0。若间隔时间大于1秒,显示加1,低电平亮
;P2口实现对数码管的片选功能
;===============================================================
;==========================系统程序=============================
;=========================开始初始化============================
SHUCHU EQU P0 ;定义P0口为输出口
PIANXUAN EQU P2 ;定义P2口为片选口
SHUZI EQU 30H ;设置处理数据存放地址
JIANBIT0 BIT 20H.0 ;设置按键标志位
XIAN0 BIT 20H.2 ;显示标志位
T_BIT BIT 21H.0 ;设置中断定时器0标志位
LIANAN BIT 20H.1 ;设置连按标志位
BIT4 BIT 20H.2
MODE EQU 01H
SHU EQU 40H
;========================程序开始==============================
ORG 00H ;程序开始
LJMP START ;跳到START
ORG 0BH ;中断定时器0入口地址
JMP T0_1 ;跳到定时器0服务程序
ORG 0030H ;入口地址
;=========================主程序===============================
START:MOV SP,#60H ;移开指针
MOV SHUZI,#00 ;数据初始化
MOV DPTR,#TAB ;查表初始化
MOV P1,#0F8H ;设置P1.0口为输入
CALL INIT ;开中断
CLR JIANBIT0 ;按键标志位清0
CLR LIANAN ;连按标志位清0
CLR BIT4
SETB T_BIT ;中断标志位置1
MOV SHU,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#200
MAIN:JNB T_BIT,MAIN ;等待中断
CLR T_BIT ;中断标志位清0
JB BIT4,VV
INC R3
CJNE R3,#25,XX
MOV R3,#00
MOV R2,#0
JMP DD
XX:CJNE R2,#3,VV
SETB LIANAN
MOV R2,#00
DD:CLR BIT4
VV:JB LIANAN,XUNHUAN ;判断是否有连按
CC:CALL JISUAN ;计算分离十位和个位
CALL DISPLAY ;显示个位和十位
JNB JIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起
JNB P1.3,XIANSHI0 ;若没抬起(P1.3=0)则调到XIANSHI0
SETB BIT4
INC R2
MOV R3,#0
CLR JIANBIT0 ;按键标志位清0
CLR XIAN0 ;显示标志位清0
JMP MAIN ;返回MAIN
PANDUAN:
JB P1.3,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0
SETB JIANBIT0
JMP MAIN
XIANSHI0:
JB XIAN0,MAIN
SETB XIAN0 ;显示标志位清0
CALL JIACHULI ;加处理
JMP MAIN
XUNHUAN:
MOV A,SHU
CJNE A,#10,KKK
MOV SHU,#0
CLR LIANAN
MOV A,SHU
KKK: MOVC A,@A+DPTR ;查表
MOV SHUCHU,A
MOV PIANXUAN,#05
INC R4
CJNE R4,#50,OUTT
INC SHU
MOV R4,#0
OUTT:JMP MAIN
;====================定时中断0服务子程序========================
;输入:无
;输出:无
;实现的功能:实现定时20MS,影响标志位T_BIT
;===============================================================
T0_1:MOV TMOD,#MODE ;定时器1工作方式1
MOV TL0,#0E0H ;设置定时初值
MOV TH0,#0B1H
SETB T_BIT ;定时标志位清0
RETI
;========================中断设置子程序=========================
;输入:无
;输出:无
;实现的功能:初始化设置定时器,设置初值
;===============================================================
INIT:MOV TMOD,#MODE ;定时器0工作方式1
MOV TL0,#0E0H
MOV TH0,#0B1H
MOV IE,#82H ;开定时器中断0
SETB TR0 ;开定时器0
RET
;========================计算子程序=============================
;输入:30H
;输出:"A和B"
;实现的功能:把30H的数据的十位和个位分离出来
;===============================================================
JISUAN:MOV A,SHUZI ;数据放在A中
MOV B,#10 ;除数放在B中
DIV AB ;商放在A中,余数放在B中
RET
;========================显示子程序=============================
;输入:"A"
;输出:"P0口"
;实现的功能:把A的数输出到P0口显示,十位和个位分开显示
;===============================================================
DISPLAY:MOVC A,@A+DPTR ;查表
MOV SHUCHU,A ;显示十位
MOV PIANXUAN,#04H ;片选
CALL DELAY ;查表
MOV SHUCHU,#0FFH ;关闭数码管
MOV A,B
MOVC A,@A+DPTR ;查表
MOV SHUCHU,A ;显示个位
MOV PIANXUAN,#05H ;片选
CALL DELAY ;延时
MOV SHUCHU,#0FFH ;关闭数码管
RET
;======================加处理子程序=============================
;输入:无
;输出:无
;实现的功能:把30H地址加1
;===============================================================
JIACHULI:MOV A,SHUZI
CJNE A,#99,L0 ;若A不等于9,则跳到LL
MOV A,#00
JMP L1
L0:INC A ;自加一
L1:MOV SHUZI,A
RET
;========================延时程序===============================
;输入;无
;输出: 无
;实现的功能:延时一段时间
;===============================================================
DELAY:
MOV R6,#80
L7:MOV R7,#80
L8:DJNZ R7,L8
DJNZ R6,L7
RET
;=====================共阳查表数据==============================
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;=======================程序结束================================
END
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1