标题:
单片机按键消抖动和防干扰的例子-汇编程序
[打印本页]
作者:
daniu
时间:
2014-12-27 17:26
标题:
单片机按键消抖动和防干扰的例子-汇编程序
;===============================================================
;程序编写人:兰建文
;编写地点:51hei培训机构
;时间:2009年6月9日上午 星期二
;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次
;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时
;刻,任何一个按键,若按键时间超过3秒,循环显示0到9回到0,时间
;间隔1秒。若时间小于1秒,显示加1,低电平亮
;P2口实现对数码管的片选功能
;===============================================================
;=========================开始初始化============================
SHUCHU EQU P0 ;定义P0口为输出口
PIANXUAN EQU P2 ;定义P2口为片选口
SHUZI EQU 30H ;设置处理数据存放地址
ANJIAN1 BIT 20H.0 ;设置按键标志位
ANJIAN2 BIT 20H.1 ;设置按键标志位
BIT0 BIT 20H.2 ;设置中断定时器0标志位
CHANGAN BIT 20H.3 ;设置长按标志位
LIANAN BIT 20H.4 ;设置连按标志位
XIAN1 BIT 20H.5
XIAN2 BIT 20H.6
BIT4 BIT 20H.7
MODE EQU 01H
;========================程序开始==============================
ORG 00H ;程序开始
LJMP START ;跳到START
ORG 0BH ;中断定时器0入口地址
JMP T0_1 ;跳到定时器0服务程序
ORG 0030H ;入口地址
;=========================主程序===============================
START:MOV SP,#70H ;移开指针
MOV SHUZI,#00 ;数据初始化
MOV DPTR,#TAB ;查表初始化
CALL INIT ;开中断
CLR ANJIAN1 ;按键标志位清0
CLR ANJIAN2 ;按键标志位清0
CLR CHANGAN ;长按标志位清0
CLR LIANAN
CLR XIAN1
CLR XIAN2
CLR BIT4
SETB BIT0 ;中断标志位置1
MOV R0,#0
MOV R1,#0
MOV R2,#0
MOV R3,#0
MAIN:JNB BIT0,MAIN ;等待中断
CLR BIT0 ;中断标志位清0
JB BIT4,VV
INC R3
CJNE R3,#50,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,ZIJIAN
JB CHANGAN,ZIJIA ;长按标志位=1,循环显示0-9;若不为0显示键值加一
CALL JISUAN
CALL DISPLAY
JB ANJIAN2,JJ
JNB ANJIAN1,PANDUAN1
JNB P1.2,XIANSHI1
MOV R0,#00
CLR ANJIAN1
CLR XIAN1
CLR ANJIAN2
CLR XIAN2
JMP MAIN
JJ:JNB ANJIAN2,PANDUAN2
JNB P1.3,XIANSHI2
; SETB BIT4
INC R2
; MOV R3,#0
CLR ANJIAN1
CLR XIAN1
CLR ANJIAN2
CLR XIAN2
JMP MAIN
PANDUAN1:JB P1.3,YY
SETB BIT4
; INC R2
MOV R3,#0
SETB ANJIAN2
;JMP MAIN
YY:JB P1.2,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0
SETB ANJIAN1
JMP MAIN
PANDUAN2:JB P1.2,ZZ
SETB ANJIAN1
JMP MAIN
ZZ:JB P1.3,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0
SETB ANJIAN2
JMP MAIN
XIANSHI1:
INC R0
CJNE R0,#150,L6 ;若R0=150,长按到达1秒,循环显示0-9;不相等,则显示键值加1
MOV R0,#00
SETB CHANGAN
L6:JB XIAN1,MAIN
SETB XIAN1 ;显示标志位清0
CALL JIACHULI ;加处理
JMP MAIN
XIANSHI2:
JB XIAN2,OUT
SETB XIAN2 ;显示标志位清0
CALL JIANCHULI ;加处理
OUT:JMP MAIN
ZIJIA:MOV A,SHUZI
CALL JIACHULI
CALL JISUAN
CALL DISPLAY
JMP MAIN
ZIJIAN:MOV A,SHUZI
CALL JIANCHULI
CALL JISUAN
CALL DISPLAY
JMP MAIN
;====================定时中断0服务子程序========================
;输入:无
;输出:无
;实现的功能:实现定时20MS,影响标志位T_BIT.
;===============================================================
T0_1:MOV TL0,#0E0H ;设置定时初值
MOV TH0,#0B1H
SETB BIT0 ;定时标志位清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
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,L7
MOV SHUZI,#00
CLR CHANGAN
JMP L8
L7:INC SHUZI
L8:RET
;======================减处理子程序=============================
;输入:无
;输出:无
;实现的功能:把30H地址加1
;===============================================================
JIANCHULI:MOV A,SHUZI
CJNE A,#00,L9
MOV SHUZI,#99
CLR LIANAN
JMP LL
L9:DEC SHUZI
LL:RET
;========================延时程序===============================
;输入;无
;输出: 无
;实现的功能:延时一段时间
;===============================================================
DELAY:
MOV R6,#3
LL1:MOV R7,#250
DJNZ R7,$
DJNZ R6,LL1
RET
;=====================共阳查表数据==============================
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;=======================程序结束================================
END
复制代码
作者:
barons
时间:
2015-1-28 11:47
放干扰。很不错
作者:
feiji666
时间:
2018-10-29 18:35
很不错,C语言?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1