📄 int1.lst
字号:
A51 MACRO ASSEMBLER INT1 02/14/2008 12:29:54 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN INT1.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE INT1.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;*******************************************************************************
2 ; INT1中断计数 3位数码管显示 P1.4按键 为电平触发方式,按P3.3连续计数 *
3 ; P1.5按键 为下降延触发方式,按P3.3加1计数 *
4 ;*******************************************************************************
5 ; 日期: 2008-2-25 硬件: 数码管P0,数码管控制P2 *
6 ; P1.4 按键,P1.5按键,为触发方式选择,P3.3接按键,为计数键 *
7 ; 版本: 3.0 *
8 ; 作者: 深圳志博电子有限公司 专业8051单片机教学站 *
9 ; 邮箱: zty0012001@163.com *
10 ; 网站: http://www.elecmcu.com http://www.elecmcu.com 更多例程请登陆网站 *
11 ;*******************************************************************************
12 ; 硬件:此程序在本公司志博电子实验仪运行通过 *
13 ;*******************************************************************************
14 ; 【版权】 Copyright(C)深圳志博电子有限公司 www.elecmcu.com All Rights Reserved *
15 ; 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
16 ;*******************************************************************************
00B2 17 IR BIT P3.2 ;红外接收口
0080 18 LED_DATA EQU P0 ;数码管数据口定义
0030 19 COUNT EQU 30H
0085 20 DIS_1 BIT P0.5 ;第一个数码管显示选择
0086 21 DIS_2 BIT P0.6 ;第二个数码管显示选择
0087 22 DIS_3 BIT P0.7 ;第三个数码管显示选择
0090 23 DIS_4 BIT P1.0 ;第四个数码管显示选择
0091 24 DIS_5 BIT P1.1 ;第五个数码管显示选择
0084 25 DIS_6 BIT P0.4 ;第六个数码管显示选择
0094 26 K1 BIT P1.4
0095 27 K2 BIT P1.5
00A0 28 DIS_DATA DATA P2 ;6位数码管的公共数据口
29
0018 30 DIS_INDEX DATA 18H ;显示位序列,存储目前显示的是第几位
31
0019 32 DIS_BUFF DATA 19H ;显示缓冲区首地址 一共从0X19-0X1E 六个字节
33
34
0019 35 DISSTART EQU 19H
36 ;*******************************************************************
0000 37 ORG 0000H
0000 802E 38 JMP MAIN
0013 39 ORG 0013H
0013 8052 40 JMP INT1_EX1
0030 41 ORG 0030H
42 ;*******************************************************************
0030 43 MAIN:
0030 758160 44 MOV SP,#60H
0033 7580FF 45 MOV P0,#0FFH
0036 75A0FF 46 MOV P2,#0FFH
0039 753000 47 MOV 30H,#00H
003C 75190A 48 MOV 19H,#0X0A ;以下三句话把前三位数码管全熄灭(即把显示缓冲区填10)
003F 751A0A 49 MOV 1AH,#0X0A
0042 751B0A 50 MOV 1BH,#0X0A
0045 C28A 51 CLR IT1 ;INT1为电平触发
0047 D2AF 52 SETB EA
0049 D2AA 53 SETB EX1
004B 54 MAIN1:
004B 209408 55 JB K1,MAIN3
004E C28A 56 CLR IT1 ;INT1为电平触发
0050 7D14 57 MOV R5,#20
0052 58 MAIN2:
A51 MACRO ASSEMBLER INT1 02/14/2008 12:29:54 PAGE 2
0052 3103 59 CALL DELAY
0054 DDFC 60 DJNZ R5,MAIN2
0056 61 MAIN3:
0056 209508 62 JB K2,MAIN5
0059 D28A 63 SETB IT1 ;INT1为下降沿触发
005B 7D14 64 MOV R5,#20
005D 65 MAIN4:
005D 3103 66 CALL DELAY
005F DDFC 67 DJNZ R5,MAIN4
0061 68 MAIN5:
0061 118A 69 CALL CONVT
0063 11AD 70 CALL PLAY
0065 80E4 71 JMP MAIN1
72 ;*******************************************************************
0067 73 INT1_EX1:
0067 C0E0 74 PUSH ACC
0069 C0D0 75 PUSH PSW
006B D2D3 76 SETB RS0
006D C2D4 77 CLR RS1
006F C2AA 78 CLR EX1
0071 0530 79 INC COUNT
0073 7C10 80 MOV R4,#10H
0075 81 EX1_DEL:
0075 E530 82 MOV A,COUNT
0077 118A 83 CALL CONVT
0079 11AD 84 CALL PLAY
007B DCF8 85 DJNZ R4,EX1_DEL
007D B4FF03 86 CJNE A,#0FFH,EX1_END
0080 753000 87 MOV COUNT,#00H
0083 88 EX1_END:
0083 D2AA 89 SETB EX1
0085 D0D0 90 POP PSW
0087 D0E0 91 POP ACC
0089 32 92 RETI
93 ;---------------------------------------------------------
94 ;代码变换 (HEX TO BCD)
95 ;---------------------------------------------------------
008A 96 CONVT:
008A E530 97 MOV A,COUNT
008C 75F064 98 MOV B,#100
008F 84 99 DIV AB
0090 F51C 100 MOV DISSTART+3,A ;百位存放在DISSTART+2
0092 740A 101 MOV A,#10
0094 C5F0 102 XCH A,B
0096 84 103 DIV AB
0097 F51D 104 MOV DISSTART+4,A ;十位存放在DISSTART+1
0099 85F01E 105 MOV DISSTART+5,B ;个位存放在DISSTART
106
009C E51C 107 MOV A,DISSTART+3
009E B4000B 108 CJNE A,#00H,CONVT_END
00A1 751C0A 109 MOV DISSTART+3,#0AH ;高位为0,不显示
00A4 E51D 110 MOV A,DISSTART+4
00A6 B40003 111 CJNE A,#00H,CONVT_END
00A9 751D0A 112 MOV DISSTART+4,#0AH
00AC 113 CONVT_END:
00AC 22 114 RET
115 ;---------------------------------------------------------
00AD 116 PLAY: ;显示子程序开始
00AD 751800 117 MOV DIS_INDEX,#00 ;初始化显示的数码管是第0位
00B0 118 DISPLAY_START: ;显示一位开始
00B0 11F6 119 CALL OFF_ALL ;调用子程序关闭所有数码管的显示
00B2 75A000 120 MOV DIS_DATA,#00 ; 6个数目管的公共显示数据写0关闭
00B5 E518 121 MOV A, DIS_INDEX
00B7 B40004 122 DIS0_B: CJNE A,#0X00,DIS1_B
00BA C285 123 CLR DIS_1
00BC 8023 124 JMP MOV_DAT
A51 MACRO ASSEMBLER INT1 02/14/2008 12:29:54 PAGE 3
00BE 125 DIS1_B:
00BE B40104 126 CJNE A,#0X01,DIS2_B
00C1 C286 127 CLR DIS_2
00C3 801C 128 JMP MOV_DAT
00C5 129 DIS2_B:
00C5 B40204 130 CJNE A,#0X02,DIS3_B
00C8 C287 131 CLR DIS_3
00CA 8015 132 JMP MOV_DAT
00CC 133 DIS3_B:
00CC B40304 134 CJNE A,#0X03,DIS4_B
00CF C290 135 CLR DIS_4
00D1 800E 136 JMP MOV_DAT
00D3 137 DIS4_B:
00D3 B40404 138 CJNE A,#0X04,DIS5_B
00D6 C291 139 CLR DIS_5
00D8 8007 140 JMP MOV_DAT
00DA 141 DIS5_B:
00DA B40518 142 CJNE A,#0X05,DIS_END
00DD C284 143 CLR DIS_6
00DF 8000 144 JMP MOV_DAT ;以上程序根据现在的显示位数进行条件分支,分别打开相应的
显示使能位
00E1 145 MOV_DAT:
00E1 E518 146 MOV A, DIS_INDEX
00E3 7919 147 MOV R1,#DIS_BUFF
00E5 29 148 ADD A,R1
00E6 F8 149 MOV R0,A
00E7 E6 150 MOV A,@R0 ;获得目前的显示位所对应自己的缓冲数据
00E8 900110 151 MOV DPTR,#DIS_TAB
00EB 93 152 MOVC A,@A+DPTR
00EC F5A0 153 MOV DIS_DATA,A ;将目前的显示数据经过查表获得对应的数码管段码
00EE 0518 154 INC DIS_INDEX ;显示位序加一,指向下一位
00F0 E518 155 MOV A,DIS_INDEX
00F2 B406BB 156 CJNE A,#6,DISPLAY_START ;以上两句判断是否循环显示够6位是的话返回到被调用的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -