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