int01.lst
来自「可以熟悉51单片机中断机制 大大方便学习51单片机」· LST 代码 · 共 214 行
LST
214 行
A51 MACRO ASSEMBLER INT01 02/13/2008 20:11:40 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN INT01.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE INT01.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;*******************************************************************************
2 ; INT1+0中断计数 6位数码管显示,6位数码管显示,
*
3 ;低三位数码管为显示外部中断INT0的计数值 *
4 ;高三位数码管为显示外部中断INT1的计数值 硬件: 数码管P0,数码管控制P2 *
5 ;P3.3接按键,高3位的计数触发, P3.2低三位的计数触发 *
6 ;*******************************************************************************
7 ; 日期: 2008-2-25 硬件: 数码管P0,数码管控制P2 *
8 ; P1.4 按键,P1.5按键,为触发方式选择,P3.3接按键,为计数键 *
9 ; 作者: 深圳志博电子有限公司 专业8051单片机教学站 *
10 ; 邮箱: zty0012001@163.com *
11 ; 网站: http://www.elecmcu.com http://www.elecmcu.com 更多例程请登陆网站 *
12 ;*******************************************************************************
13 ; 硬件:此程序在本公司志博电子实验仪运行通过 *
14 ;*******************************************************************************
15 ; 【版权】 Copyright(C)深圳志博电子有限公司 www.elecmcu.com All Rights Reserved *
16 ; 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
17 ;*******************************************************************************/
00B3 18 K5 BIT P3.3
00B2 19 IR BIT P3.2
0080 20 LED_DATA EQU P0 ;数码管数据口定义
0040 21 COUNT0 EQU 40H
0041 22 COUNT1 EQU 41H
23
0085 24 DIS_1 BIT P0.5 ;第一个数码管显示选择
0086 25 DIS_2 BIT P0.6 ;第二个数码管显示选择
0087 26 DIS_3 BIT P0.7 ;第三个数码管显示选择
0090 27 DIS_4 BIT P1.0 ;第四个数码管显示选择
0091 28 DIS_5 BIT P1.1 ;第五个数码管显示选择
0084 29 DIS_6 BIT P0.4 ;第六个数码管显示选择
30
00A0 31 DIS_DATA DATA P2 ;6位数码管的公共数据口
32
0048 33 DIS_INDEX DATA 48H ;显示位序列,存储目前显示的是第几位
34
0049 35 DIS_BUFF DATA 49H ;显示缓冲区首地址 一共从0X19-0X1E 六个字节
36
37
0049 38 DISSTART EQU 49H
39 ;*******************************************************************
0000 40 ORG 0000H
0000 802E 41 JMP MAIN
0003 42 ORG 0003H
0003 8054 43 JMP INT0_EX0
0013 44 ORG 0013H
0013 8067 45 JMP INT1_EX1
0030 46 ORG 0030H
47 ;*********************************************************
48 ; 主程序
49 ;*********************************************************
0030 50 MAIN:
0030 758160 51 MOV SP,#60H
0033 7580FF 52 MOV P0,#0FFH
0036 75A0FF 53 MOV P2,#0FFH
0039 753000 54 MOV 30H,#00H ;计数单元清零
003C 753100 55 MOV 31H,#00H
003F 7840 56 MOV R0,#40H
0041 57 CLR1:
A51 MACRO ASSEMBLER INT01 02/13/2008 20:11:40 PAGE 2
0041 7600 58 MOV @R0,#00H ;清显存单元
0043 08 59 INC R0
0044 B84FFA 60 CJNE R0,#4FH,CLR1
0047 C288 61 CLR IT0 ;INT0为电平触发
0049 C28A 62 CLR IT1 ;INT1为电平触发
004B D2B8 63 SETB PX0
004D D2AF 64 SETB EA
004F D2A8 65 SETB EX0
0051 D2AA 66 SETB EX1
0053 67 MAIN1:
0053 119F 68 CALL CONVT
0055 11E4 69 CALL PLAY
0057 80FA 70 JMP MAIN1
71 ;*********************************************************
72 ; INT0 外部中断服务子程序
73 ;*********************************************************
0059 74 INT0_EX0:
0059 C0E0 75 PUSH ACC
005B C0D0 76 PUSH PSW
005D D2D3 77 SETB RS0
005F C2D4 78 CLR RS1
0061 C2A8 79 CLR EX0
0063 0540 80 INC COUNT0
0065 7C0A 81 MOV R4,#10
0067 82 EX0_DEL:
0067 E540 83 MOV A,COUNT0 ;显示INT0计数
0069 119F 84 CALL CONVT
006B 11E4 85 CALL PLAY
006D DCF8 86 DJNZ R4,EX0_DEL
006F B4FF03 87 CJNE A,#0FFH,EX0_END
0072 754000 88 MOV COUNT0,#00H
0075 89 EX0_END:
0075 D2A8 90 SETB EX0
0077 D0D0 91 POP PSW
0079 D0E0 92 POP ACC
007B 32 93 RETI
94 ;*********************************************************
95 ; INT1 外部中断服务子程序
96 ;*********************************************************
007C 97 INT1_EX1:
007C C0E0 98 PUSH ACC
007E C0D0 99 PUSH PSW
0080 D2D3 100 SETB RS0
0082 D2D4 101 SETB RS1
0084 C2AA 102 CLR EX1
0086 0541 103 INC COUNT1
0088 7C0A 104 MOV R4,#10
008A 105 EX1_DEL:
008A E541 106 MOV A,COUNT1 ;显示INT1计数
008C 119F 107 CALL CONVT
008E 11E4 108 CALL PLAY
0090 DCF8 109 DJNZ R4,EX1_DEL
0092 B4FF03 110 CJNE A,#0FFH,EX1_END
0095 754100 111 MOV COUNT1,#00H
0098 112 EX1_END:
0098 D2AA 113 SETB EX1
009A D0D0 114 POP PSW
009C D0E0 115 POP ACC
009E 32 116 RETI
117 ;*********************************************************
118 ;数据转换 (HEX TO BCD)
119 ;*********************************************************
009F 120 CONVT:
009F E540 121 MOV A,COUNT0 ;INT0 计数值处理
00A1 75F064 122 MOV B,#100
00A4 84 123 DIV AB
A51 MACRO ASSEMBLER INT01 02/13/2008 20:11:40 PAGE 3
00A5 F549 124 MOV DISSTART,A ;百位存放在DISSTART+2
00A7 740A 125 MOV A,#10
00A9 C5F0 126 XCH A,B
00AB 84 127 DIV AB
00AC F54A 128 MOV DISSTART+1,A ;十位存放在DISSTART+1
00AE 85F04B 129 MOV DISSTART+2,B ;个位存放在DISSTART
00B1 E549 130 MOV A,DISSTART
00B3 B4000B 131 CJNE A,#00H,CONVT1
00B6 75490A 132 MOV DISSTART,#0AH ;高位为0,不显示
00B9 E54A 133 MOV A,DISSTART+1
00BB B40003 134 CJNE A,#00H,CONVT1
00BE 754A0A 135 MOV DISSTART+1,#0AH
00C1 136 CONVT1:
00C1 E541 137 MOV A,COUNT1 ;INT1 计数值处理
00C3 75F064 138 MOV B,#100
00C6 84 139 DIV AB
00C7 F54C 140 MOV DISSTART+3,A ;百位存放在DISSTART+7
00C9 740A 141 MOV A,#10
00CB C5F0 142 XCH A,B
00CD 84 143 DIV AB
00CE F54D 144 MOV DISSTART+4,A ;十位存放在DISSTART+6
00D0 85F04E 145 MOV DISSTART+5,B ;个位存放在DISSTART+5
00D3 E54C 146 MOV A,DISSTART+3
00D5 B4000B 147 CJNE A,#00H,CONVT_END
00D8 754C0A 148 MOV DISSTART+3,#0AH ;高位为0,不显示
00DB E54D 149 MOV A,DISSTART+4
00DD B40003 150 CJNE A,#00H,CONVT_END
00E0 754D0A 151 MOV DISSTART+4,#0AH
00E3 152 CONVT_END:
00E3 22 153 RET
154 ;*********************************************************
155 ; 数码管显示子程序
156 ;*********************************************************
00E4 157 PLAY: ;显示子程序开始
00E4 754800 158 MOV DIS_INDEX,#00 ;初始化显示的数码管是第0位
00E7 159 DISPLAY_START: ;显示一位开始
00E7 312D 160 CALL OFF_ALL ;调用子程序关闭所有数码管的显示
00E9 75A000 161 MOV DIS_DATA,#00 ; 6个数目管的公共显示数据写0关闭
00EC E548 162 MOV A, DIS_INDEX
00EE B40004 163 DIS0_B: CJNE A,#0X00,DIS1_B
00F1 C285 164 CLR DIS_1
00F3 8023 165 JMP MOV_DAT
00F5 166 DIS1_B:
00F5 B40104 167 CJNE A,#0X01,DIS2_B
00F8 C286 168 CLR DIS_2
00FA 801C 169 JMP MOV_DAT
00FC 170 DIS2_B:
00FC B40204 171 CJNE A,#0X02,DIS3_B
00FF C287 172 CLR DIS_3
0101 8015 173 JMP MOV_DAT
0103 174 DIS3_B:
0103 B40304 175 CJNE A,#0X03,DIS4_B
0106 C290 176 CLR DIS_4
0108 800E 177 JMP MOV_DAT
010A 178 DIS4_B:
010A B40404 179 CJNE A,#0X04,DIS5_B
010D C291 180 CLR DIS_5
010F 8007 181 JMP MOV_DAT
0111 182 DIS5_B:
0111 B40518 183 CJNE A,#0X05,DIS_END
0114 C284 184 CLR DIS_6
0116 8000 185 JMP MOV_DAT ;以上程序根据现在的显示位数进行条件分支,分别打开相应的
显示使能位
0118 186 MOV_DAT:
0118 E548 187 MOV A, DIS_INDEX
011A 7949 188 MOV R1,#DIS_BUFF
A51 MACRO ASSEMBLER INT01 02/13/2008 20:11:40 PAGE 4
011C 29 189 ADD A,R1
011D F8 190 MOV R0,A
011E E6 191 MOV A,@R0 ;获得目前的显示位所对应自己的缓冲数据
011F 900147 192 MOV DPTR,#DIS_TAB
0122 93 193 MOVC A,@A+DPTR
0123 F5A0 194 MOV DIS_DATA,A ;将目前的显示数据经过查表获得对应的数码管段码
0125 0548 195 INC DIS_INDEX ;显示位序加一,指向下一位
0127 E548 196 MOV A,DIS_INDEX
0129 B406BB 197 CJNE A,#6,DISPLAY_START ;以上两句判断是否循环显示够6位是的话返回到被调用的
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?