- ;===============================================================
- ;程序编写人:兰建文
- ;编写地点: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
复制代码
|