|
- ;============================================================
- ;程序编写人:兰建
- ;编写地点:51hei培训机构
- ;时间:5月23日下午 星期六
- ;功能:本程序实现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 ;设置处理数据存放地址
- JIANBIT0 BIT 20H.0 ;设置按键标志位
- XIAN0 BIT 20H.2 ;显示标志位
- T_BIT BIT 21H.0 ;设置中断定时器0标志位
- MODE EQU 01
- ;========================程序开始==============================
- ORG 00H ;程序开始
- LJMP START ;跳到START
- ORG 0BH ;中断定时器0入口地址
- JMP T0_1 ;跳到定时器0服务程序
- ORG 0030H ;入口地址
- ;=========================主程序===============================
- START:MOV SP,#60H ;移开指针
- MOV PIANXUAN,#00 ;片选初始化
- MOV SHUZI,#00 ;数据初始化
- MOV DPTR,#TAB ;查表初始化
- MOV P1,#0F8H ;设置P1.0口为输入
- CALL INIT ;开中断
- CLR JIANBIT0 ;按键标志位清0
- SETB T_BIT ;中断标志位置1
- MAIN:JNB T_BIT,MAIN ;等待中断
- CLR T_BIT ;中断标志位清0
- CALL JISUAN ;计算分离十位和个位
- CALL DISPLAY ;显示个位和十位
- JNB JIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起
- JNB P1.3,XIANSHI0 ;;若P1.3=0则调到XIANSHI0
- CLR JIANBIT0 ;长按标志位清0
- CLR XIAN0 ;显示标志位清0
- JMP MAIN ;返回MAIN
- PANDUAN:JB P1.3,NEXT ;若按键抬起则返回MAIN,若没有抬起按键标志位清0
- SETB JIANBIT0
- NEXT:JMP MAIN
- XIANSHI0:
- JB XIAN0,MAIN
- SETB XIAN0 ;显示标志位清0
- CALL JIACHULI ;加处理
- 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,#02H ;片选
- CALL DELAY ;查表
- ;MOV SHUCHU,#0FFH ;关闭数码管
- MOV A,B
- MOVC A,@A+DPTR ;查表
- MOV SHUCHU,A ;显示个位
- MOV PIANXUAN,#03H ;片选
- 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 R5,#80
- L8:DJNZ R5,L8
- DJNZ R6,L7
- RET
- ;=====================共阳查表数据==============================
- TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- ;=======================程序结束================================
- END
复制代码
|
|