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